复制时末尾有额外字符?

Extra character at end while copying?

这让我抓狂 我正在尝试制作一个简单的程序来使用以下代码复制任何类型的文件,但我得到的结果是出乎意料的(复制文件末尾有一个或两个额外的字符?)。例如,如果我的原始文件有 This is an example,则复制的文件包含 This is an exampleÿ

代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp,*fpp;
    char pbuff, fname[32];
    int i;

    printf(" FILE NAME TO OPEN : ");
    scanf(" %32s", fname);
    fp = fopen(fname, "rb");
    fpp = fopen("file", "wb");
    if(fp==NULL)
    {
        printf("NO SUCH FILE. EXITING NOW.");
        getch();
        exit(1);
    }

    while(!feof(fp))
    {
        pbuff = fgetc(fp);
        fputc(pbuff, fpp);
    }

    printf("SUCCESSFULLY CREATED!");
    fclose(fp);
    fclose(fpp);
    getch();
    return(0);
}

谁能帮我解决这个问题?我会真的很感激。

原因是 feof(就像大多数 languages/environments 中的大多数文件结束指示器一样)仅在到达文件结束后设置。由于您写了字符,然后才检查 EOF 状态,所以您写了 1 个字符。如果在调用期间到达文件末尾,fgetc 的 return 值是预定义的 EOF。

您可以通过以下 2 种方法之一解决该问题:

while(true)
{
    pbuff = fgetc(fp);
    if(feof(fp))
         break;
    fputc(pbuff, fpp);
}

或者:(根据正确注意到的 melpomene 进行编辑!)

// Change pbuff to type int in the declartion, and then...
while(true)
{
    pbuff = fgetc(fp);
    if(EOF == pbuff)
         break;
    fputc(pbuff, fpp);
}