Способ определения EOF зависит от того, что вы используете для чтения потока:
function result on EOF or error
-------- ----------------------
fgets() NULL
fscanf() number of succesful conversions
less than expected
fgetc() EOF
fread() number of elements read
less than expected
Проверьте результат входного вызова для соответствующего условия выше, затем вызовите feof()
, чтобы определить, был ли результат вызван нажатием EOF или какой-либо другой ошибкой.
Использование fgets()
:
char buffer[BUFFER_SIZE];
while (fgets(buffer, sizeof buffer, stream) != NULL)
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
Использование fscanf()
:
char buffer[BUFFER_SIZE];
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
Использование fgetc()
:
int c;
while ((c = fgetc(stream)) != EOF)
{
// process c
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
Использование fread()
:
char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1
// element of size
// BUFFER_SIZE
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted read
}
Обратите внимание, что форма одинакова для всех из них: проверьте результат операции чтения; если это не удалось, , затем проверьте EOF. Вы увидите много примеров, таких как:
while(!feof(stream))
{
fscanf(stream, "%s", buffer);
...
}
Эта форма работает не так, как думают люди, потому что feof()
не вернет истину до тех пор, пока после вы не попытались прочитать за конец файла. В результате цикл выполняется слишком много раз, что может вызвать или не вызвать у вас некоторое горе.