我正在尝试读取包含二进制形式的整数的二进制文件。我需要使用open()和read()函数而不是fopen()等。
我打开我的文件并尝试阅读它,但我在输出中得到二进制符号。
char buffer[sizeof(int)];
int file1;
int bytesRead;
file1 = open(argv[1], O_RDONLY);
if(file1 == -1)
{
printf("unable to open file\n");
exit(1);
}
while((bytesRead = read(file1, &buffer, sizeof(buffer))))
{
printf("%d\n", buffer);
}
有人能指出我正确的方向吗?
答案 0 :(得分:1)
Error 1: read(file1, &buffer, sizeof(buffer)
当您使用数组时,您无需将其地址传递给“读取”调用。
Correction :
read(file1, buffer, sizeof(buffer);
Error 2 :
while((bytesRead = read(file1, &buffer, sizeof(buffer))))
Correction :
while((bytesRead = read(file1, &buffer, sizeof(buffer))) >= 0)
即使读取调用失败,while循环也会计算为true,因为它在
上返回-1
失败意味着真实。
当没有什么可读的时候它返回0,你可以对它进行检查
表明没有什么比这更好了。
答案 1 :(得分:0)
变量应使用它们的类型声明:
int buffer;
如果您想要int
,请声明int
。这是过于简单化,但这样可以安全地防止严格别名违规。如果仅更改此行,则其他代码正常。
原文
char buffer[sizeof(int)];
有一个缺点,即在不违反严格别名 *)的情况下将其作为int
读取是不可能的(严格别名意味着,您不能通过左值访问对象输入错误,即与声明的类型不同。
的行为
printf("%d\n", buffer);
未定义,类型为char *
的值会传递到printf
,其中预计会有int
。 (如果buffer
是int
,则此行无效;并且应将其声明为int
,因为它被视为int
。)
如果char
数组确实是预期的,那么
while((bytesRead = read(file1, &buffer, sizeof(buffer))))
会不常见:当传递给函数时,数组会衰减到指针,不需要使用地址运算符&
。 (但如果buffer
的类型为int
,则需要它。)
*)并非完全不可能,您可以使用union
type-pun 。