2014-09-29 77 views
0

下面的代码:错误在简单的文件处理的C程序

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

帮助表示赞赏。谢谢!

+1

你能明确地发布文件的内容,期望的输出和实际的输出吗? – vinnydiehl 2014-09-29 06:17:27

+0

是否有任何特殊原因使用了不明确的'putw'和'getw'功能。 – 2014-09-29 06:18:58

+0

@DavidSchwartz:这些都是我遵循的教科书中提到的功能。是否还有一些其他功能用于这些任务? – 2014-09-29 06:21:19

回答

4

ASCII 26是Ctrl-Z (aka SUB) character在一些系统中用来表示文件的末尾(一般只用于文本文件)。这是你的程序停止,只要它看到值读取文件的原因26

这成为问题的原因是,你打开在文本模式下的文件,但在它被存储二进制数据(使用putw()getw())。

要解决此问题,请以二进制模式打开文件,然后重试。

+0

@PranavArora:第二个参数'fopen()函数' – NPE 2014-09-29 06:22:05

+0

我取代'计划生育=的fopen( “DATA”, “R”);'和'计划生育=的fopen( “DATA”, “RB”);',并得到了真奇怪的输出。这是一个屏幕截图:http://i61.tinypic.com/zx1zzc.png – 2014-09-29 06:27:01

+0

@PranavArora:你改变了两个'fopen()'调用吗? – NPE 2014-09-29 06:27:49

1

至于建议用户NPE你只二进制模式二进制文件。 这里的ASCII代码出现在图片中,因为当你将一个整数保存到文件时,它实际上被存储为4个字节的序列。 如果您在任何十六进制编辑器打开生成的数据文件,你会发现根据endian-,当你保存我为1到文件时,它实际存储为

01 00 00 00 

00 00 00 01 

你的系统的性能。

在同样的基础,当你保存26,它被实际保存为

26 00 00 00 

00 00 00 26 

但是,当你阅读文本模式下,该文件,而不是二进制模式,那么,如果角色遇到26被视为EOF并且getw返回-1。

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

这不会发生,如果你打开和关闭二进制模式文件,并写入字节到您的文件。