关于文件的复制?

时间:2022-12-12 20:58:32
最近做了一个文件复制的小程序,即将输入文件in的内容复制到输出文件out中去,但是明明in只有3字节,但是out却有4字节,不明白是为什么,请高手指教
程序片断:
//创建in文件并写入数据
int main(int argc, char* argv[])
{
FILE *fp;
    char ch;



   if((fp=fopen("c:\\in","wt"))==NULL)
   {
   printf("cannot open the file\n");
   exit(0);
   }
   //else  printf("can open the file\n");
    ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);

return 0;
}
//复制in文件到out文件中
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
    char ch;
int i;

    if((fp1=fopen("c:\\in","rb"))==NULL)
 {
   printf("1 cannot open file\n");
       //exit(1);
    }
 
    else if((fp2=fopen("c:\\outdata","wb"))==NULL)
{
   printf("2 cannot open file\n");
       exit(0);
}
    else
{  

while(!feof(fp1))
{
    ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);

    
}
       
fclose(fp1);
fclose(fp2);
}



return 0;
}

13 个解决方案

#1


文本文件最后有一个Ctrl-Z结束符

#2



 if((fp=fopen("c:\\in","wt"))==NULL
这里是用文本方式打开in文件的

if((fp1=fopen("c:\\in","rb"))==NULL)
    else if((fp2=fopen("c:\\outdata","wb"))==NULL)
这里是用二进制方式打开in的

问题应该和这个有关

#3


我把“wt”改成“wb”还是有一样得问题啊,怎么解决啊

#4


仔细试了试,是feof()函数的问题
while(!feof(fp1))
{
    ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);

    
}
当fp1指向文件结束时,还要循环一次。
如文件内容为"this"
上述循环要进行5次,即把文件结束符写入到outdata文件中去了。
此时复制的文件中多了一个'\FF'的字符。是不是此函数的一个BUG
即移动文件尾后,还要移动一下,feof()才会逻辑真????
这个问题不仅在二进制方式中有,在文本方式中也有。
我两种方式都试了。
/*复制in文件到out文件中*/
#include <stdio.h>
int main(int argc, char* argv[])
{
    FILE *fp1,*fp2;
    char ch;
    int i=0;
    if((fp1=fopen("d:\\in","rt"))==NULL)
    {
   printf("1 cannot open file\n");
           exit(1);
    }
    else if((fp2=fopen("d:\\outdata","wt"))==NULL)//改了一下文件的盘号
    {
       printf("2 cannot open file\n");
       exit(0);
    }
    else
    {  
while(!feof(fp1))
{
        ch=fgetc(fp1);
  fputc(ch,fp2);
putchar(ch);
i++;
}
       
fclose(fp1);
fclose(fp2);
printf("%d\n",i);
     }
     return 0;
}

#5


写错了,此时复制的文件中多了一个'\FF'的字符----应该是'\xFF'
显示时是一个y上多两点的字符。

#6


当文件为空时同样有一个""y你可以复制在这上面看见是空不信你试

#7


实际上你已经完成了只是打开方式不对可以用写字扳打开

#8


那。。。。。。。。。
是。。。。。。。。。
feof()函数的问题???

#9


#include <stdio.h>

void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);

}
文件长度为0.再看下面的程序
#include <stdio.h>

void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
fp=fopen("d:\\in.txt","r");
if(!fp)
{
exit(0);
}
while(!feof(fp))
{
putchar(fgetc(fp));
}
fclose(fp);
}
还是输出一个字符,也就是要循环1次!!!

#10


想了个办法,由于feof()函数移动到文件尾时还要再移动一下,才能返回真值,
1。打开文件
        fp=fopen("d:\\in","rb");
if(!fp)
{
exit(0);
}
2。求出文件长度
fseek(fp,0L,SEEK_END);
n=ftell(fp);
rewind(fp);//再移到文件开头
3。用循环来控制是否读完所有文件的有效内容
   for(i=0;i<n;i=i+(每次读文件的字节数))//要保证n可以整除(每次读文件的字节数)
   {
       读文件中若干字节数;
       其他操作;
   }
  这样可以克服feof()的问题。

#11


vmark

#12


精辟!

#13


用了以上得办法后问题解决了,多谢指点!

#1


文本文件最后有一个Ctrl-Z结束符

#2



 if((fp=fopen("c:\\in","wt"))==NULL
这里是用文本方式打开in文件的

if((fp1=fopen("c:\\in","rb"))==NULL)
    else if((fp2=fopen("c:\\outdata","wb"))==NULL)
这里是用二进制方式打开in的

问题应该和这个有关

#3


我把“wt”改成“wb”还是有一样得问题啊,怎么解决啊

#4


仔细试了试,是feof()函数的问题
while(!feof(fp1))
{
    ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);

    
}
当fp1指向文件结束时,还要循环一次。
如文件内容为"this"
上述循环要进行5次,即把文件结束符写入到outdata文件中去了。
此时复制的文件中多了一个'\FF'的字符。是不是此函数的一个BUG
即移动文件尾后,还要移动一下,feof()才会逻辑真????
这个问题不仅在二进制方式中有,在文本方式中也有。
我两种方式都试了。
/*复制in文件到out文件中*/
#include <stdio.h>
int main(int argc, char* argv[])
{
    FILE *fp1,*fp2;
    char ch;
    int i=0;
    if((fp1=fopen("d:\\in","rt"))==NULL)
    {
   printf("1 cannot open file\n");
           exit(1);
    }
    else if((fp2=fopen("d:\\outdata","wt"))==NULL)//改了一下文件的盘号
    {
       printf("2 cannot open file\n");
       exit(0);
    }
    else
    {  
while(!feof(fp1))
{
        ch=fgetc(fp1);
  fputc(ch,fp2);
putchar(ch);
i++;
}
       
fclose(fp1);
fclose(fp2);
printf("%d\n",i);
     }
     return 0;
}

#5


写错了,此时复制的文件中多了一个'\FF'的字符----应该是'\xFF'
显示时是一个y上多两点的字符。

#6


当文件为空时同样有一个""y你可以复制在这上面看见是空不信你试

#7


实际上你已经完成了只是打开方式不对可以用写字扳打开

#8


那。。。。。。。。。
是。。。。。。。。。
feof()函数的问题???

#9


#include <stdio.h>

void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);

}
文件长度为0.再看下面的程序
#include <stdio.h>

void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
fp=fopen("d:\\in.txt","r");
if(!fp)
{
exit(0);
}
while(!feof(fp))
{
putchar(fgetc(fp));
}
fclose(fp);
}
还是输出一个字符,也就是要循环1次!!!

#10


想了个办法,由于feof()函数移动到文件尾时还要再移动一下,才能返回真值,
1。打开文件
        fp=fopen("d:\\in","rb");
if(!fp)
{
exit(0);
}
2。求出文件长度
fseek(fp,0L,SEEK_END);
n=ftell(fp);
rewind(fp);//再移到文件开头
3。用循环来控制是否读完所有文件的有效内容
   for(i=0;i<n;i=i+(每次读文件的字节数))//要保证n可以整除(每次读文件的字节数)
   {
       读文件中若干字节数;
       其他操作;
   }
  这样可以克服feof()的问题。

#11


vmark

#12


精辟!

#13


用了以上得办法后问题解决了,多谢指点!