文件结束的判断

文件结束的判断 

feof(fp)的返回值:如果文件结束,函数feof(fp)的值为1,否则为0。
EOF是文件结束标志的文件:在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,ASCⅡ代码的范围是0到255,不可能出现-1,因此可以用EOF作为文件结束标志。
当把数据以000二进制形式000存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。但这样的应用对于某些情况也会带来麻烦:
#include

void main()
{
    char T[9];
    FILE *fout = fopen("student.txt","w");
    FILE *fp = fopen("busname.txt","r");
    if (fp == NULL)
    {
        printf("Cannot open the file!\n");
        exit(1);
    }
    while (!feof(fp))
    {
        fscanf(fp,"%s",T);
        fprintf(fout,"%s\n",T);
    }
    fclose(fp);
    fclose(fout);
}
程序中:fscanf(fp,"%s",T);是以空白、tab、回车或文件结束符判断字符串结束标志。
当测试文件末尾没有空格时:文件结束符作为字符串的结束符,程序正常。
当测试文件末尾有空格时:EOF前有空格,当feof函数读到EOF时误认为另一字符开始,再读到EOF下一字符时字符串结束,复制一个长度为0的空字符到T,导致T的内容不变,又被输出一次。

文件最后一个字符串若不是文件结束符就会多输出一次T,建议文件复制用以下的程序:

#include

int main()
{
    char T;
    FILE *fout = fopen("2.txt","w");
    FILE *fp = fopen("1.txt","r");
    if (fp == NULL)
    {
        printf("Cannot open the file!\n");
        exit(1);
    }
    T = fgetc(fp);
    while (!feof(fp)) /*若只用于文本文件可以用 (T != EOF)来判断 */
    {
        fputc(T, fout);
        T = fgetc(fp);       
    }
    fclose(fp);
    fclose(fout);
    return 0;
}

好东西,经常遇到,经常忘记,转自哪忘记了

你可能感兴趣的:(C,文件结束)