0

我正在处理一个数据文件,该文件包含固定数量的字符,后跟一个冒号,然后是一个数字。所有前四个字符都可以是从所有 null 到所有 (char)255 的任何内容。

但是,在尝试阅读它时,我无法确定 EOF。

如果我像这样使用posix read(2)

ssize_t letters_read = read(fd, buf, 4);

然后 letters_read 设置为 0。手册页说这意味着我已经达到了 EOF;然而,这根本不是真的。

如果我fread(3)以类似的方式使用,那么我仍然会得到零作为返回值。即使将文件发送到feof(3),它也会说我在文件末尾。

现在,如果我只是忽略返回值,那么我可以继续读取文件并获得进一步的结果。

我如何能够读取所有四个空值并且仍然能够知道我何时达到了 eof?

该文件的一小段摘录如下所示:

4
(空)(空)(空)(空):4
(空)(空)(空)(空):40
(空)(空)(空)(空):402
AF*8:3004

更新
根据要求,这是我收集数据的方式:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

void process_characters(char *data);


int main(int argc, char *argv[])
{
  char *input_file = argv[1];

  int opt = 0;

  int input_fd = open(input_file, O_RDONLY);

  FILE *temp_fd = fopen(input_file, "r");

  unsigned long character_size = 0;

  fscanf(temp_fd, "%l", character_size);


  char data[character_size];

  //gobble up the first line
  do
  {
    read(input_fd, data, 1);
    printf("%i\n", data[0]);
  } while(data[0] != '\n');

  size_t characters_read = 0;
  characters_read = read(input_fd, data, character_size);
  //while(feof(temp_fd) != 0)

  while(characters_read != 0)
  {

    //fread(data, sizeof(char), character_size, temp_fd);
    process_characters(data);
    ///gobble up the garbage
    do
    {
      read(input_fd, data, 1);
      printf("%i\n", data[0]);
    }while(data[0] != 10);

    characters_read = read(input_fd, data, character_size);
  }

  fclose(temp_fd);
  close(input_fd);
  return EXIT_SUCCESS;
}
4

1 回答 1

1

这段代码:

  unsigned long character_size = 0;

  fscanf(temp_fd, "%l", character_size);

... 指定的格式无效,需要提供变量地址而不是其值。"%l"没有指定要读取的类型。也许你想要"%lu"一个无符号长整数,这是如何character_size定义的。character_size应该是&character_size

但是,您提供的示例文件的开头没有这样的(十进制)值,因此不清楚该fscanf行真正应该做什么。

(您声称使用 read 如下返回 0:

ssize_t letters_read = read(fd, buf, 4);

但是,您的代码中没有这样的行)。

于 2017-01-10T17:39:24.983 回答