将文件复制到另一个文件的程序成功,但是在复制字母“ y”后可以无限打印

时间:2018-07-13 05:30:15

标签: c

我想将一个文件的内容复制到另一个文件。  执行完代码后,将打印出所需的输出,但是在第二个文件中打印了一个附加字母'y',并且'y'陷入无限循环。

另一件事是,无论我是否添加文件路径以最大程度地减少问题,第二个printf都没有得到输入。

我在做什么错了?

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp1, *fp2;
    char ch, filename1, filename2;

    printf("enter file name to open:\n");
    scanf("%c", &filename1);

    fp1 = fopen("testfile.txt", "r");
    if(fp1 == NULL)
    {
        puts("Cannot open targeted file");
        exit(1);
    }

    printf("enter another file name to open:\n");
    scanf("%c", &filename2);

    fp2 = fopen("testfile2.txt", "w");
    if(fp2 == NULL)
    {
        puts("Cannot open targeted file");
        fclose(fp1);
        exit(2);
    }
    while(1)
    {
        ch = fgetc(fp1);
        fputc(ch, fp2);
    }
    fclose(fp1);
    fclose(fp2);

    return 0;
}

1 个答案:

答案 0 :(得分:5)

您的复制循环不会尝试检测EOF。它应显示为:

int ch;
while ((ch = fgetc(fp)) != EOF)
    fputc(ch, fp);

请注意,该值被读入int,而不是chargetchar()getc()fgetc()函数返回一个int,该函数可以包含表示被视为unsigned char的字符(字节)的正数,也可以包含{返回负值EOF(通常,但不一定是-1)。您不能将所有这些值存储在char中;您必须使用int

要求用户输入文件名然后忽略他们输入的内容也有点特殊。在大多数情况下,它和您一样出色。您不只需要一个char filename1char filename2来保存文件名,还需要使用%s而不是%c来读取文件名。幸运的是,您在fopen()调用中使用了固定的字符串文字作为文件名。

第二个输入似乎没有等待的原因是,您对scanf()的第一次调用读取了一个字符,因此即使您输入a作为文件名,也会有一个输入中的换行符。第二个scanf()读取换行符。只有3种格式不跳过前导空格(例如换行符)。它们是%c%[…](扫描集)和%n