• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[język C] Odczyt znaków planszy z pliku i zapis ich do tablicy 2d.

Ultraszybki serwer VPS NVMe START
0 głosów
47 wizyt
pytanie zadane 4 dni temu w C i C++ przez Tomek Wilnowski Początkujący (330 p.)

Podobny problem pojawił się już  na forum, ale obiektowo w C++, ja muszę to zrobić w typowym C, ale to dopiero początek zadania które muszę oddać już jutro :(

Wczoraj trochę się nad tym męczyłem. W zasadzie koło 5h[...] i mam mały problem[...].

Problem chcę rozwiązać następująco

//schemat
//0.Otworzenie pliku
//1.pobranie 2 pierwszych znaków z pliku, (jest to ilość znaków w każdej lini pliku (taka sama))
//2.zliczenie ilości liń pliku()
//3.odczyt danych z pliku, znak po znaku
    ->.zapis do tablicy
//4.zamknięcie pliku

Problemy:

Jak zliczyć ilość liń mojego pliku?

Jak zapisać pojedyncze znaki z mojego pliku do tablicy 2d,?

Problem polega na tym, że muszę to zrobić to dla pliku w którym mam zmienną ilość liń a w niej zmienną ilość znaków w zależności od tego jaki plik wybiorę do wczytania do tablicy (otwarcia). Zapis do tablicy musi się odbywać trochę inaczej. Stąd konieczność wcześniejszego zlicza liń i znaków. Muszę przygotować tablicę na wczytanie nieznanego strumienia danych z pliku.

void operacja_na_pliku(){
    FILE *plik = fopen("plik.txt", "r");
    if(plik == NULL){
        printf("Nie można przeczytać pliku lub jest on pusty");
    }  
    if (plik != NULL) {
        char linia[BUFSIZ];
        int licz_linie = 0;
        while (fgets(linia, sizeof linia, plik) != NULL) {
            char *start = linia;
            int znak;
            int nastepny;
            licz_linie++;
            while (sscanf(start, "%c%n", &znak, &nastepny) == 1) {
                //zapis do tablicy (mam strumień znaków, zmienna nastepny ginie mi za każdym
                //razem wiec mam jeden parametr wielkości tablicy 2d, drugim jest licz_linie)
                //niezdefiniowana jeszcze tablica char // tablica[licz_linie][nastepny] = znak; // znak = znak z pliku
//który chcę zapisać
                start += nastepny;
            }
            puts("");
        }
        fclose(plik);
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 4 dni temu przez mokrowski Nałogowiec (38,580 p.)
wybrane 3 dni temu przez Tomek Wilnowski
 
Najlepsza
W takim zadaniu będziesz używał dynamicznego alokowania pamięci. Zrobisz to z pomocą malloc() z <stdlib.h>.

Możesz tworzyć dynamiczną tablicę 2-wymiarową z 1 wymiarem zawierającym wyłącznie wskaźnik na alokowany wiersz, albo (co w praktyce ma lepsze działanie), alokować płaską tablicę i wyliczać współrzędne znaku z prostego mnożenia.

Co do zliczania linii w pliku, możesz wpaść na pomysł by wiedząc jaka jest długość pliku (w bajtach), wielkość preambuły (czyli tych pierwszych kilku bajtów z informacją o długości linii) oraz wiedząc czy linia kończy się znakiem pojedynczym (jak w systemach Unix) lub dwoma (jak w MS Win), obliczyć ilość linii z prostej zależności:

Ilość_linii_w_pliku = (Długość_pliku - (Wielkość_preambuły + Znak_kończący_linię)) / (Długość_linii + Znak_kończący_linię)
komentarz 3 dni temu przez Tomek Wilnowski Początkujący (330 p.)
Dzięki wielkie za pomoc. Jak na razie zrobiłem dynamiczne lokowanie pamięci. Okazało się, że deklarując miejsce dla tablicy z góry dużo większej nie muszę liczyć jej rozmiaru. Jak całą znaną mi tablicę zapiszę 0, to potem przy zapisaniu do niej wartości je po prostu nadpiszę i wyciągnę znaki które jeszcze nie są 0. W ten sposób wiem gdzie kończy się mój zapis.:)

Ale mimo takiego rozwiązania dalej mnie interesowało, jak policzyć wielkość takiej tablicy, także jeszcze raz wielkie dzięki za odpowiedź.

Podobne pytania

0 głosów
1 odpowiedź 61 wizyt
0 głosów
5 odpowiedzi 164 wizyt
0 głosów
1 odpowiedź 59 wizyt
pytanie zadane 24 sierpnia w C i C++ przez Vendari Nowicjusz (150 p.)

41,280 zapytań

80,219 odpowiedzi

158,699 komentarzy

19,709 pasjonatów

Przeglądających: 270
Pasjonatów: 29 Gości: 241

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...