-1

我需要一个 C 程序将一个文件的内容复制到另一个文件以及以下条件:

1.) 我们从中读取数据的文件可能存在也可能不存在。

2.) 数据被复制到的文件可能存在也可能不存在。

如果文件存在,则直接复制数据,如果文件不存在,应该有一个选项来创建文件,向其中输入数据,然后将文件内容复制到另一个文件中。

我制定了以下代码,

目前我修改后的代码是:

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
 FILE *f1,*f2;
 char c;
 char name1[20],name2[20];
 clrscr();
 setvbuf(stdout, 0, _IONBF, 0);
 printf("\nEnter the source file name :");
 scanf("%s",name1);
 if((f1=fopen(name1,"r"))==NULL)
 {
  fclose(f1);
  f1=fopen(name1,"w");
  printf("\nThe specified file does not exist \nNew file will be created");
  printf("\nEnter the data for the new file : ");
  while((c=getchar())!=EOF)
  {
   putc(c,f1);
  }
  fclose(f1); 
 }
 f1=fopen(name1,"r");
 printf("\nEnter the destination file name :");
 scanf("%s",name2);
 f2=fopen(name2,"w+");
 while((c=getc(f1))!=EOF)
 {
  putc(c,f2);
 }
 rewind(f1);
 rewind(f2);
 printf("The data in the source file is :\n");
 while((c=getc(f1))!=EOF)
 {
  printf("%c",c);
 }
 printf("\nThe data in the destination file is :\n");
 while((c=getc(f2))!=EOF)
 {
  printf("%c",c);
 }
 fclose(f1);
 fclose(f2);
 fflush(stdin);
 getch();
}

但是程序只有在源文件已经存在时才能正常工作。如果我创建一个新文件,则不会对目标文件名进行任何输入,并且目标文件文件中的数据为空白。那我现在该怎么办?

我应该修改什么才能使其工作?建议我您选择的任何代码...谢谢!

4

2 回答 2

0

好吧,我在您的代码中看到了几个问题,但最重要的是表达式:

(c=getc(f1))!=EOF

将始终评估为 true,因此您将运行无限循环。如果您阅读getc文档,您会发现它返回一个intnot a char

获取文档

所以基本上你正在做的是EOFint通常定义为-1的 截断为一个charwhen:

c=getc(f1)  // At this point C = 255(0xFF) if getc returned EOF

然后提升c到 an intwhen 与 进行比较EOF,因为 anint大到足以容纳 255,所以进行的比较是 255 != -1,这始终是正确的。

要解决这个问题,只需声明cint.

还有一些提示:

您可能还想通过在其他错误条件上使用feof因为getc返回来确保它是文件结束条件。EOF

您可能希望"\n"在调用中将 移动到语句的末尾printf以强制刷新标准输出。或者,您可以在程序开始时添加它:

setvbuf(stdout, 0, _IONBF, 0);

似乎您将文件名存储在name1and中name2,因此您可能希望从fopen文件名中删除双引号,以便它实际使用它们。

当您打开时,name2您只使用写访问,但在最后您尝试读取并显示其内容时,您可能希望将其"w+"用作访问模式。

当您尝试打印结果数据时,文件处理程序f2已经关闭。并且文件光标已经在文件的末尾,因此您可能想要使用rewind,例如

//fclose(f2);
rewind(f1);
rewind(f2);
printf("The data in the source file is :\n");
 while((c=getc(f1))!=EOF)
 {
  printf("%c",c);
 }
 printf("The data in the destination file is :\n");
 while((c=getc(f2))!=EOF)
 {
  printf("%c",c);
 }
 fclose(f1);
 fclose(f2);
于 2013-06-18T21:02:30.417 回答
0

最后成功的代码是:

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
 FILE *f1,*f2;
 char c;
 char name1[20],name2[20];
 clrscr();
 printf("\nEnter the source file name :");
 scanf("%s",name1);
 if((f1=fopen(name1,"r"))==NULL)
 {
  fclose(f1);
  f1=fopen(name1,"w");
  printf("\nThe specified file does not exist \nNew file will be created");
  printf("\nEnter the data for the new file : ");
  while((c=getchar())!='^')
  {
   putc(c,f1);
  }
  fclose(f1); 
 }
 f1=fopen(name1,"r");
 printf("\nEnter the destination file name :");
 scanf("%s",name2);
 f2=fopen(name2,"w+");
 while((c=getc(f1))!=EOF)
 {
  putc(c,f2);
 }
 rewind(f1);
 rewind(f2);
 printf("The data in the source file is :\n");
 while((c=getc(f1))!=EOF)
 {
  printf("%c",c);
 }
 printf("\nThe data in the destination file is :\n");
 while((c=getc(f2))!=EOF)
 {
  printf("%c",c);
 }
 fclose(f1);
 fclose(f2);
 fflush(stdin);
 getch();
} 
于 2013-06-20T13:39:33.910 回答