EOF 是否有更安全的替代方案?它在我的情况下不起作用
Is there a safer alternative for EOF? It's not working in my case
我正在处理我的学校项目,其中我必须处理 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 的无符号字符。只要 unsigned char 的范围小于 int 的范围,这种转换就永远不会产生负数,在这种情况下与 EOF
没有重叠。 我不知道 sizeof(int) == 1 的奇异系统如何处理这个问题。
但是在您的尝试中,您正在比较赋值操作的结果,它是左值和左手操作数,它是从 int 转换而来的 char。因此,您的担忧是有道理的。
要修复程序,将输入读入一个 int 变量,将其与 EOF
进行比较,然后 然后 转换为 char。
我正在处理我的学校项目,其中我必须处理 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 的无符号字符。只要 unsigned char 的范围小于 int 的范围,这种转换就永远不会产生负数,在这种情况下与 EOF
没有重叠。 我不知道 sizeof(int) == 1 的奇异系统如何处理这个问题。
但是在您的尝试中,您正在比较赋值操作的结果,它是左值和左手操作数,它是从 int 转换而来的 char。因此,您的担忧是有道理的。
要修复程序,将输入读入一个 int 变量,将其与 EOF
进行比较,然后 然后 转换为 char。