文件复制函数编写

hermit_ 2011-10-17 08:31:25
书上说所有文件都是以二进制方式存储的,那么能不能把所有类型的文件以二进制方式打开,然后读取并写入另一个文件中,来实现复制呢?
...全文
329 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhaopeng2511 的回复:]

引用 9 楼 qq120848369 的回复:
好2啊,就fread,fwrite不就行了。

知道这个函数,但就是不熟没实际用过,试试了下是可行的……呵
C/C++ code
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
char file_name1[3……
[/Quote]

正确,都可以.....
zhaopeng2511 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq120848369 的回复:]
好2啊,就fread,fwrite不就行了。
[/Quote]
知道这个函数,但就是不熟没实际用过,试试了下是可行的……呵
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
char file_name1[30]="\0";
char file_name2[30]="\0";

printf("\n请输入原件名称(包括扩展名):");
gets(file_name1);
printf("\n请输入复件名称(包括扩展名):");
gets(file_name2);
if((fp1=fopen(file_name1,"rb"))==NULL||(fp2=fopen(file_name2,"wb"))==NULL)
{
printf("\n打开文件失败!");
exit(0);
}
else
{
fread(&ch,1,1,fp1);
while (!feof(fp1))
{
fwrite(&ch,1,1,fp2);
fread(&ch,1,1,fp1);
}
}
printf("\n文件复制成功!\n");
fclose(fp1);
fclose(fp2);
}
赵4老师 2011-10-19
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

推荐使用WinHex软件查看文件原始字节内容。
星羽 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhaopeng2511 的回复:]

我这写了个只能复制文本文件的代码,但想复制其它类型的就不一定成功了……比如jpg文件就不成功

哪位大侠能给出个能复制所有文件类型的代码……

C/C++ code
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
char file_name1[30]="\0……
[/Quote]


你用rb打开就不要用getc 和 putc,这两个函数是用于文本的

你要用fread fwrite
zhaopeng2511 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 newwst 的回复:]
引用 6 楼 zhaopeng2511 的回复:
我这写了个只能复制文本文件的代码,但想复制其它类型的就不一定成功了……比如jpg文件就不成功

哪位大侠能给出个能复制所有文件类型的代码……


C/C++ code

#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
……
[/Quote]
本身是文本文件当然可以,如果你拿张图片试试(原本是图片,不是通过文件改扩展名得来的),就不行了,我试过的,不行……
  • 打赏
  • 举报
回复
如果只是为了实现复制所有文件类型这个功能的话,那下面的代码也可以,只是调用了COPY命令...
如果想知道原理的话,我无能为力了......

#include<stdio.h>
#include<stdlib.h>
void main()
{
char copy[100]="copy ";
char file_name1[70]="\0";
char file_name2[30]="\0";
printf("\n请输入原件名称(包括扩展名):");
gets(file_name1);
printf("\n请输入复件名称(包括扩展名):");
gets(file_name2);
strcat(file_name1," ");
strcat(file_name1,file_name2);
strcat(copy,file_name1);
system(copy);
system("pause");
}
newwst 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhaopeng2511 的回复:]
我这写了个只能复制文本文件的代码,但想复制其它类型的就不一定成功了……比如jpg文件就不成功

哪位大侠能给出个能复制所有文件类型的代码……


C/C++ code

#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
char file_name……
[/Quote]你把文件后缀改成".zhaopeng2511"试一试能不能读写?一样可以滴。
qq120848369 2011-10-18
  • 打赏
  • 举报
回复
好2啊,就fread,fwrite不就行了。
zhaopeng2511 2011-10-17
  • 打赏
  • 举报
回复
我这写了个只能复制文本文件的代码,但想复制其它类型的就不一定成功了……比如jpg文件就不成功

哪位大侠能给出个能复制所有文件类型的代码……

#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
char file_name1[30]="\0";
char file_name2[30]="\0";

printf("\n请输入原件名称(包括扩展名):");
gets(file_name1);
printf("\n请输入复件名称(包括扩展名):");
gets(file_name2);
if((fp1=fopen(file_name1,"rb"))==NULL||(fp2=fopen(file_name2,"wb"))==NULL)
{
printf("\n打开文件失败!");
exit(0);
}
else
{
ch = fgetc(fp1);
while (ch != EOF)
{
fputc(ch,fp2);
ch = fgetc(fp1);
}
}
printf("\n文件复制成功!\n");
fclose(fp1);
fclose(fp2);
}
newwst 2011-10-17
  • 打赏
  • 举报
回复
只要原封不动地一个位一个位复制,理论上就是把源文件拷贝一份。所有的文件都是二进制,因为硬件就是二进制。我们可以对所有文件,包括视频,音乐,可执行文件等进行二进制读写。

但是,关键是编码解码格式。如果解码格式不对就会乱码。试想,我们用txt时,unicode和utf的都不同,更何况用文本文件和其他文件进行转换呢?不然怎么会出来那么多转换器呢?
此外,还要有读写权限。因为读到系统敏感文件是会导致报错的。
  • 打赏
  • 举报
回复
Linux du2
还有 fcntl
AnYidan 2011-10-17
  • 打赏
  • 举报
回复
书上说所有文件都是以二进制方式存储的 -- 个人认为更准确的说法是所有文件都是以一连串的0和1的串存储的,

否则你如何理解在 c 中以二进制方式打开和以文本方式打开

再有,copy 并不难,关键在于如何解码,知道文件的内容
自信男孩 2011-10-17
  • 打赏
  • 举报
回复
是可以的。文件打开模式有"r", "w", "a", "r+", "w+", "a+",类似的打开二进制文件的模式为:"rb", "wb", "ab", "r+b", "w+b", "a+b","ab+", "wb+".你可以尝试以这样的模式打开一个文件。这是在linux下文件的打开模式。
柯本 2011-10-17
  • 打赏
  • 举报
回复
在windows下
只要在打开文件属性中加"b"项,文件就是以二进制打开的,与文件类型无关
另外,在windows下,本身就有
BOOL CopyFile(
LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);
可直接复制文件的
在linux下,缺省就是打开二进制文件

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧