C / Wczytywanie danych z pliku - problem z funkcją fgets

0

Cześć,
mam taki kod:

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE *plik;
	char odp[30];
	plik=fopen("dane1.txt", "r");
    	while ( feof(plik) == 0 )
    	{
    		fgets(odp,30,plik);
    		printf("%s", odp);
    	}
    
        fclose(plik);
        return 0;
}

oraz plik dane.txt, który jest postaci:

ala ma kota
kot ma ale
ma kot ole

Po uruchomieniu programu otrzymuję takie coś:

ala ma kota
kot ma ale
ma kot ole
ma kot ole

Czyli ostatnią linijkę wyświetla podwójnie, myślę, że problem tkwi w funkcji fgets. Niestety nie wiem jak sobie z tym poradzić. Proszę o wskazówki.

[edit] Problem rozwiązany, zamiast linijki while ( feof(plik) == 0 ) dałem while (fgets(odp,30,plik) != NULL). Działa poprawnie.

0

Twoje pierwsze podejście nie zadziałało bo eof jest utawiany dopiero jak spróbujesz czytać z końca pliku. W efekcie odczytujesz swoje 3 linijki, potem próbujesz czytać z końca (ale eofa jeszcze nie ma) i korzystasz z poprzedniej wartości. I dopiero jeszcze jeden feof() zwraca ci informacje o końcu pliku.

0

Tak jak Shalom mówił, dopóki nie nastąpi próba odczytu poza końcem pliku nie wiadomo czy do tego końca doszliśmy czy nie. Czyli schemat powinien być taki: najpierw próbujesz odczytać wartość (fscanf, fgets, ...), a następnie sprawdzasz czy próba odczytania powiodła się. Powodem niepowodzenia odczytu może być dojście do końca pliku lub wystąpienie jakiegoś błędu odczytu. W obu tych przypadkach fgets zwraca NULL więc pętelka może wyglądać tak:

while (fgets(..., plik) != NULL)) {
    /* ... robimy coś z wczytaną linią ... */
}

już bez sprawdzania feof. Ewentualnie jeśli chcemy sprawdzić czy udało się bezbłędnie oczytać cały plik to możemy dodać po powyższej pętelce:

if (feof(plik)) {
    /* ... doszliśmy do końca pliku, wszystko odczytane ... */
} else {
    /* ... nie odczytaliśmy wszystkiego, po drodze wystąpił jakiś błąd odczytu ... */
}

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