首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

菜鸟复制文本文件有关问题,为什么多出一个字节~请问虾虾们

2012-02-28 
初学者复制文本文件问题,为什么多出一个字节~请教虾虾们书上的课后题没答案:问题:编程序,打开一个已有的文

初学者复制文本文件问题,为什么多出一个字节~请教虾虾们
书上的课后题没答案:
问题:编程序,打开一个已有的文本文件,将其内容复制到一个新文件中,复制时,将所有小写字母改为大写,其他不变.
(如:一个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才能判断得到结束信息】

热点排行