我正在处理一个数据文件,该文件包含固定数量的字符,后跟一个冒号,然后是一个数字。所有前四个字符都可以是从所有 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;
}