2012-02-24 15 views
10

czytam z pliku formatuCzytanie z fgets plik używając

1 32 43 23 
32 43 
123 43 54 243 
123 2222 
2 

tutaj jest mój urywek kodu.

string[100]; 
while(!feof(fp)) 
fgets(string,100,fp) 

teraz, gdy wstawię każdy ciąg, w ostatnim ciągu otrzymuję powtórzenie. i kilka więcej niejednoznaczności (jak coś innego też zostanie wydrukowane powiedzmy 123 lub więcej).

Jak rozwiązać ten problem?

+0

Czy istnieje '\ charakter n' end-of-line na końcu ostatniego wiersza w pliku? – dasblinkenlight

+2

Opublikuj swój pełny rzeczywisty kod, który nie powinien się nawet kompilować. – Staven

Odpowiedz

17

Należy sprawdzić wartość zwracaną fgets. Jeśli odczyt zakończył się powodzeniem, fgets zwraca wskaźnik do bufora, który do niego przekazałeś (np. string w twoim przykładzie). Po napotkaniu Koniec pliku i braku znaków, fgets zwraca NULL.

Spróbuj tego:

char string[100]; 
while(fgets(string, 100, fp)) { 
    printf("%s\n", string); 
} 
+0

Dlaczego miałbyś testować z feofem, jeśli robi to fget? –

+2

@ManuelReis Masz rację, test 'feof' jest niepotrzebny (edytowany). – dasblinkenlight

+1

Dzięki za odpowiedź, przez sekundę doświadczałem kryzysu egzystencjalnego. –

5

Urządzenie jest dostarczane dopiero po po próbie odczytania z pliku znajdującego się na końcu. Musisz użyć wartości zwracanej fgets zamiast (zwraca NULL na EOF lub błędu i wskaźnika jest przekazywana inaczej):

char string[100]; 
while(fgets(string, 100, fp)) 
    // do stuff with string 

Sprawdzanie wartości zwracanej jak to spowoduje, że nigdy trafić EOF wewnątrz Ciało pętli, podobnie jak inne, zamiast w stanie.