Czytanie danych z pliku

Odpowiedz Nowy wątek
2014-11-01 18:05

Rejestracja: 5 lat temu

Ostatnio: 4 lata temu

0

Witam wszystkich
Musze napisać funkcje która wczyta dane z pliku i wpisze je do tablic.
Wygląda to tak, że dane są w pliku w taki sposób poukładane :


1(znak \t)100(znak\n)
2(znak \t)123(znak\n)
3(znak \t)12312(znak\n)

itd
Moim zadaniem jest wpisanie tych cyfr 1,2,3 itd do jednej tablicy, a 100,123 ,12312 do drugiej tablicy pomijając białe znaki \t i \n
Udało mi się po przeczytaniu paru poradników napisać funkcję która czyta wszystko. Nie potrafię jednak porozdzielać tego wszystkiego do osobnych tablic.


 {
    FILE *plik;
    int i;
    char znak;
    plik=fopen("plik.txt","r");
    if(plik ==NULL)
    printf("Plik nie istnieje lub jest pusty");
    while (znak!=EOF)
    {
      znak=fgetc(plik);

     printf("%c",znak);
 } 

Pomożecie ?

Pozostało 580 znaków

2014-11-01 18:13

Rejestracja: 14 lat temu

Ostatnio: 4 dni temu

0
for(i=0;fscanf(plik,"%d%d",tb1[i],tb2[i])==2;++i) { /* tu ewentualnie powiększanie tablic*/ }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-11-01 18:17

Rejestracja: 6 lat temu

Ostatnio: 4 godziny temu

0
char str[100];
fscanf (pFile, "%s", str); 

to Ci wczyta stringa z pliku i ominie białe znaki. Np tak

char liczba[16], wiecejLiczb[MAX_ROZMIAR];
fscanf (pFile, "%s", liczba);
fscanf (pFile, "%s", wiecejLiczb);

wczytasz całą linie

Wczytywanie liczb jako c-string bardzo rzadko bywa przydatne. - _13th_Dragon 2014-11-01 18:20
Co do pierwszej liczby to teraz widzę, że bez sensu ją wczytywałem jako stringa, ale autor nie powiedział, że te drugie też będzie liczbą dlatego wczytywałem do stringa. - stryku 2014-11-01 18:24

Pozostało 580 znaków

2014-11-10 18:52

Rejestracja: 5 lat temu

Ostatnio: 4 lata temu

0

Uff. Udało mi się. Nie ukrywam że bardzo mi pomogliście. W międzyczasie walczyłem z innymi problemami i dałem radę jednak nie daje mi spokoju pewna kwestia. Napisałem funkcję która czyta dane z pliku. Wygląda ona tak :

void wczytaj(Tablica *t, Parametry *p)
 {
    FILE *plik;
    int i;
    int y;
    int licznik=0;
    int ilosc=0;
    char znak;
    plik=fopen("plik.txt","r");
    while((znak = fgetc(plik)) != EOF) 
    { if(znak == '\n')
    licznik++;
    }
    printf("%d\n\n",licznik);
    fclose(plik);
    plik=fopen("plik.txt","r");

     ilosc=licznik;
     t->sygnal=(double*)malloc(sizeof(double)*ilosc);
     t->czas=  (double*)malloc(sizeof(double)*ilosc);
     t->ilosc=ilosc;

    if (plik ==NULL)
    printf("Plik nie istnieje lub jest pusty");
    else
 for (y=0;y<t->ilosc;y++) 
    {
fscanf (plik, "%lf\t ", &t->czas[y]);
fscanf (plik, "%lf\n", &t->sygnal[y]);
}
for (y=0;y<t->ilosc;y++) 
printf ("%lf\t %lf\n",t->czas[y],t->sygnal[y]);      
     fclose(plik);  
 }
} 

Użyłem funkcji while która zliczy mi ilość wierszy w pliku dzięki czemu mogłem zastosować tą informację potrzebną do funkcji for.
Problem polega na tym że musiałem zamknąć plik i otworzyć go na nowo po funkcji while. Gdy tego nie robiłem program kompilował się poprawnie jednak wywalało mi masę różnych przypadkowych liczb. Moglibyście mi powiedzieć dlaczego tak jest i czy jest jakiś sposób aby uniknąc ponownego otwarcia pliku w celu wyświetlenia danych ?

Podwójne czytanie pliku = beznadziejne rozwiązanie. - _13th_Dragon 2014-11-10 19:01
poprawiłem na: fscanf (plik, "%lf\t %lf\n", &t->czas[y], &t->sygnal[y]); Jednak nadal szukam odpowiedzi na moje pytanie :) - Irych 2014-11-10 19:17
Stwórz listę jednokierunkową, wczytaj do niej, przekopiuj do tablicy o ile to konieczne dla dalszego algorytmu. - _13th_Dragon 2014-11-10 19:33

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0