Ответ 1
Как вы определяете 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()
не вернет true до тех пор, пока вы не попытаетесь прочесть конец файла. В результате цикл выполняет слишком много времени, что может или не может вызвать у вас некоторое горе.