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

0 głosów
423 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 Szeryf (79,520 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ź 77 wizyt
0 głosów
2 odpowiedzi 195 wizyt
0 głosów
5 odpowiedzi 309 wizyt
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

52,031 zapytań

94,889 odpowiedzi

193,425 komentarzy

25,357 pasjonatów

Przeglądających: 170
Pasjonatów: 3 Gości: 167

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.

...