• 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.

VPS Starter Arubacloud
0 głosów
1,813 wizyt
pytanie zadane 14 listopada 2017 w C i C++ przez Tomek Wilnowski Użytkownik (610 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ź 14 listopada 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 14 listopada 2017 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 14 listopada 2017 przez Tomek Wilnowski Użytkownik (610 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ź 241 wizyt
0 głosów
2 odpowiedzi 1,819 wizyt
0 głosów
1 odpowiedź 1,155 wizyt
pytanie zadane 24 sierpnia 2017 w C i C++ przez Vendari Nowicjusz (150 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...