我正在我的学校项目中工作,在该项目中我必须使用c / c ++处理文件。我担心使用while((c=fgetc())!=EOF)
,因为:
如果文件的二进制代码包含与EOF值相同的11111111
,并且程序意外完成,该怎么办?
这里是一个示例代码,在该示例代码中,我首先创建一个包含-1
的二进制代码,并且该程序在确实到达文件末尾之前完成了。
int main()
{
FILE *p;
fopen_s(&p, "my.binn", "wb");
char c;
char result;
for (int t = 0; t < 3; t++)
{ //putting some bytes in file
result = 0;
for (int r = 0; r < 8; r += 2)
{
result |= (1 << (7 - r));
}
putc(result, p);
}
result = 0;
for (int r = 0; r < 8; r++)
{ //putting a byte of 11111111
result |= (1 << (7 - r));
}
putc(result, p);
for (int t = 0; t < 3; t++)
{ //again putting some bytes in file
result = 0;
for (int r = 0; r < 8; r += 2)
{
result |= (1 << (7 - r));
}
putc(result, p);
}
fclose(p);
fopen_s(&p, "my.binn", "rb");
while ((c = fgetc(p)) != EOF)
{ //here this loop was expected to continue until end of file(7 bytes) but it prints only three stars
cout << "*";
}
fclose(p);
return 0;
}
有人可以帮我吗?
EOF
是(为a的宏)负整数。 fgetc
读取转换为int的无符号字符。只要无符号字符的范围小于int的范围,这种转换就不会导致负数,在这种情况下,与EOF
不会重叠。 我不知道sizeof(int)== 1的外来系统如何处理此问题。
但是,尝试将赋值操作的结果(左值)与左操作数(从int转换为char)进行比较。因此,您的担心是有效的。
要修复程序,请将输入读取为int变量,将其与EOF
进行比较,然后then转换为char。