Как использовать EOF для запуска текстового файла в C?

У меня есть текстовый файл с строками в каждой строке. Я хочу увеличить число для каждой строки в текстовом файле, но когда он достигнет конца файла, он, очевидно, должен остановиться. Я попытался провести некоторое исследование EOF, но не мог понять, как правильно его использовать.

Я предполагаю, что мне нужен цикл while, но я не уверен, как это сделать.

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

Ответ 2

Один возможный цикл C:

#include <stdio.h>
int main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        /*
        ** Do something with c, such as check against '\n'
        ** and increment a line counter.
        */
    }
}

В настоящее время я игнорирую feof и подобные функции. Опыт показывает, что слишком легко назвать это не в то время и обработать что-то дважды в убеждении, что EOS еще не достигнуто.

Pitfall, чтобы избежать: используя char для типа c. getchar возвращает следующий символ в unsigned char, а затем в int. Это означает, что на большинстве [нормальных] платформ значение EOF и действительные значения <<22 → в c не перекрываются, поэтому вы случайно не обнаружите EOF для "нормального" char.

Ответ 3

Вы должны проверить EOF после чтения из файла.

fscanf_s                   // read from file
while(condition)           // check EOF
{
   fscanf_s               // read from file
}