C读取其中包含null的文件

C reading a file with null in it

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

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

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

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

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

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

现在,如果我忽略 return 值,那么我可以继续读取文件并获得更多结果。

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

文件的一小段如下所示:

4
(null)(null)(null)(null):4
(null)(null)(null)(null):40
(null)(null)(null)(null):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;
}

此代码:

  unsigned long character_size = 0;

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

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

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

(您声称使用 read 如下 returns 0:

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

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