以下是代码:
#include<stdio.h>
int main()
{
FILE *fp;
int i;
fp=fopen("DATA","w");
for(i=1;i<=30;++i)
putw(i,fp);
fclose(fp);
fp=fopen("DATA","r");
while((i=getw(fp))!=EOF)
printf("%4d",i);
fclose(fp);
return 0;
}
我没有得到预期的输出。程序打印数字直到25而不是30。如果我设置i<=20
,我得到正确的输出。我不明白这一点。
帮助表示赞赏。谢谢!
答案 0 :(得分:4)
ASCII 26是Ctrl-Z (aka SUB) character,在某些系统上用于指示文件结尾(通常仅用于文本文件)。这是您的程序一看到值26就停止读取文件的原因。
这成为一个问题的原因是你在文本模式下打开文件,然后在其中存储二进制数据(使用putw()
和getw()
)。
要解决此问题,请以二进制模式打开文件,然后重试。
答案 1 :(得分:1)
正如用户NPE所建议的那样,您只能以二进制模式处理二进制文件。 这里的ASCII代码出现在图片中,因为当您将整数保存到文件时,它实际上存储为4个字节的序列。 如果您在任何十六进制编辑器中打开生成的DATA文件,您会注意到当您将i保存为1时,它实际上存储为
01 00 00 00
或
00 00 00 01
根据你系统的字节顺序。
在保存26的同一基础上,它实际上保存为
26 00 00 00
或
00 00 00 26
但是当您在文本模式而不是二进制模式下读取此文件时,如果遇到字符26,则将其视为EOF,并且getw返回-1。
我希望这可以解释你实际的问题。
如果以二进制模式打开和关闭文件并将字节写入文件,则不会发生这种情况。