简单文件处理C程序时出错

时间:2014-09-29 06:13:36

标签: c file-io

以下是代码:

#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,我得到正确的输出。我不明白这一点。

帮助表示赞赏。谢谢!

2 个答案:

答案 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。

我希望这可以解释你实际的问题。

如果以二进制模式打开和关闭文件并将字节写入文件,则不会发生这种情况。