使用open()和read()读取C中二进制整数的文件

时间:2014-09-19 03:23:18

标签: c binary

我正在尝试读取包含二进制形式的整数的二进制文件。我需要使用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);
    }

有人能指出我正确的方向吗?

2 个答案:

答案 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。 (如果bufferint,则此行无效;并且应将其声明为int,因为它被视为int。)

如果char数组确实是预期的,那么

while((bytesRead = read(file1, &buffer, sizeof(buffer))))

会不常见:当传递给函数时,数组会衰减到指针,不需要使用地址运算符&。 (但如果buffer的类型为int,则需要它。)

*)并非完全不可能,您可以使用union type-pun