我意识到我更大的文件失败了,因为它无法正确读取二进制文件中的第一个整数。这是我设置的测试文件,仅用于此。我知道我正在阅读的int将始终是1个字节,所以我将数据读入一个char然后将其作为一个短片。它在过去的某个时刻开始工作,但在清理我的代码时我以某种方式弄乱了它。
此时程序正在打印
“整数是127”
应该打印时
“整数是1”
有人知道为什么会这样吗?
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
FILE *inp;
char r;
short i;
if ((inp = fopen(argv[0],"r")) == NULL){
printf("could not open file %s for reading\n",argv[1]);
exit(1);}
fread((void *)&r,(size_t) 1,(size_t) 1, inp);
i = (short)r;
printf("The integer is %d\n",i);
}
答案 0 :(得分:3)
您应该像这样致电fread
来阅读int
:
int num;
fread(&num, sizeof(int), 1, inp);
此外,检查返回值是明智的,如果在您的情况下成功,则应为1:
#incude <errno.h>
errno = 0;
if(fread(&num, sizeof(int) 1, inp) != 1)
strerror(errno);
修改强>
如果您正在阅读的值仅为8位,则应使用unsigned char
进行读取,如下所示:
unsigned char num;
fread(&num, 1, 1, inp);
答案 1 :(得分:2)
您fopen(argv[0], "r")
,但报告错误开放argv[1]
。打开你的阅读程序是不正常的(虽然如果风吹得正确,月亮的相位是正确的,你可能会侥幸逃脱)。
您打算使用的机会:
if (argc != 2)
…report usage…
if ((inp = fopen(argv[1], "r")) == NULL)
…report error…
此外,行尾的}
(如exit(1);}
)是一个非常奇怪的布局约定。就个人而言,我厌恶它。幸运的是,我只是在SO上看过它。