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);
但是,您的代码中没有这一行。
我正在处理一个数据文件,该文件包含固定数量的字符,后跟一个冒号,然后是一个数字。所有前四个字符都可以是从所有空值到所有 (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);
但是,您的代码中没有这一行。