读书人

菜鸟复制文本文件有关问题,为什么多出

发布时间: 2012-02-28 13:06:35 作者: rapoo

初学者复制文本文件问题,为什么多出一个字节~请教虾虾们
书上的课后题没答案:
问题:编程序,打开一个已有的文本文件,将其内容复制到一个新文件中,复制时,将所有小写字母改为大写,其他不变.
(如:一个523字节文件,我的程序复制后总多一个字节524)
程序如下:
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
FILE *fp, *fp2;
char filename[60],filename2[60];

printf( "\nEnter filename: ");
gets( filename );
printf( "\nEnter filename2: ");
gets( filename2 );

if( (fp = fopen(filename , "r ")) == NULL )
{
fprintf(stderr, "ERROR ");
exit(1);
}
if( (fp2 = fopen(filename2 , "w ")) == NULL )
{
fprintf(stderr, "ERROR ");
exit(1);
}

while( !feof(fp) )
{
char ch;
ch = getc(fp);
if( (ch > = 'a ') && (ch <= 'z ') )
ch = ch-32;

putc(ch , fp2);
}
fclose( fp );
fclose( fp2 );

return 0;
}

谢谢虾虾们,抽空帮忙教教菜鸟,谢谢

[解决办法]
改成这样试试
while((ch = getc(fp)) != EOF )
{
if( (ch > = 'a ') && (ch <= 'z ') )
ch = ch-32;

putc(ch , fp2);
}

[解决办法]
当你读完最后一个字的时候,feof(fp)还会返回true,因为还没有到文件底(还没有失败过)但实际上已经没有东西可读了,你原来的程序在这种情况下又读了一次,所以多出来一个 (EOF)

巴乔的程序在这种情况下跳出了,所以没有毛病.

你可以做个小实验,在你While里面getc(fp)之后看看你的ch是不是EOF.
[解决办法]
while( !feof(fp) )

这样的判断方式会滞后一个字节才得到文件结束信息。
【因为要越界读取文件内容后才会标志出错,feof才能判断得到结束信息】

读书人网 >C语言

热点推荐