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

Object Storage Arubacloud
0 głosów
1,826 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ź 242 wizyt
0 głosów
2 odpowiedzi 1,861 wizyt
0 głosów
1 odpowiedź 1,159 wizyt
pytanie zadane 24 sierpnia 2017 w C i C++ przez Vendari Nowicjusz (150 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...