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

Преобразуйте от Строки до байта []:

String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);

Преобразовывают из байта [] для Строкового представления:

byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, StandardCharsets.US_ASCII);

необходимо, конечно, использовать корректное имя кодирования. Мои примеры использовали US-ASCII и UTF-8, две наиболее распространенных кодировки.

30
задан Ciro Santilli 新疆改造中心法轮功六四事件 24 May 2017 в 06:54
поделиться

2 ответа

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

80
ответ дан 27 November 2019 в 23:10
поделиться

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

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

12
ответ дан 27 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: