我想将一个文件的内容复制到另一个文件。 执行完代码后,将打印出所需的输出,但是在第二个文件中打印了一个附加字母'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;
}
答案 0 :(得分:5)
您的复制循环不会尝试检测EOF。它应显示为:
int ch;
while ((ch = fgetc(fp)) != EOF)
fputc(ch, fp);
请注意,该值被读入int
,而不是char
。 getchar()
,getc()
和fgetc()
函数返回一个int
,该函数可以包含表示被视为unsigned char
的字符(字节)的正数,也可以包含{返回负值EOF
(通常,但不一定是-1
)。您不能将所有这些值存储在char
中;您必须使用int
。
要求用户输入文件名然后忽略他们输入的内容也有点特殊。在大多数情况下,它和您一样出色。您不只需要一个char filename1
或char filename2
来保存文件名,还需要使用%s
而不是%c
来读取文件名。幸运的是,您在fopen()
调用中使用了固定的字符串文字作为文件名。
第二个输入似乎没有等待的原因是,您对scanf()
的第一次调用读取了一个字符,因此即使您输入a
作为文件名,也会有一个输入中的换行符。第二个scanf()
读取换行符。只有3种格式不跳过前导空格(例如换行符)。它们是%c
,%[…]
(扫描集)和%n
。