Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用fwrite在C中复制文件_C_File Io_Copy_Fwrite - Fatal编程技术网

使用fwrite在C中复制文件

使用fwrite在C中复制文件,c,file-io,copy,fwrite,C,File Io,Copy,Fwrite,我是C语言的新手,试图编写一个程序来复制一个文件,这样我就可以学习文件的基本知识。我的代码将一个文件作为输入,通过使用fseek和ftell从文件的结尾减去文件的开头来计算文件的长度。然后,它使用fwrite,根据我可以从它的手册页获得的内容,将一个数据元素(结束-开始)元素长写入OUT指向的流,从FI给定的位置获取它们。问题是,尽管它确实产生“复制输出”,但该文件与原始文件不同。我做错了什么?我尝试将输入文件读入一个变量,然后从中写入,但这也没有帮助。我做错了什么? 谢谢 这样行吗 {

我是C语言的新手,试图编写一个程序来复制一个文件,这样我就可以学习文件的基本知识。我的代码将一个文件作为输入,通过使用fseek和ftell从文件的结尾减去文件的开头来计算文件的长度。然后,它使用fwrite,根据我可以从它的手册页获得的内容,将一个数据元素(结束-开始)元素长写入OUT指向的流,从FI给定的位置获取它们。问题是,尽管它确实产生“复制输出”,但该文件与原始文件不同。我做错了什么?我尝试将输入文件读入一个变量,然后从中写入,但这也没有帮助。我做错了什么? 谢谢

这样行吗

{
    FILE* out = fopen("copy output", "w");
    int* buf = malloc(end-start);  fread(buf,end-start,1,fi);
    fwrite(buf,end-start,1,out);
}

fwrite的第一个参数是指向要写入文件的数据的指针,而不是要读取的文件*。您必须将第一个文件中的数据读入缓冲区,然后将该缓冲区写入输出文件

fwrite的第一个参数是指向要写入文件的数据的指针,而不是要读取的文件*。您必须将第一个文件中的数据读入缓冲区,然后将该缓冲区写入输出文件

这不是工作原理

要复制文件,通常需要分配一个缓冲区,然后使用
fread
读取一个数据缓冲区,然后使用
fwrite
将数据写回。重复此操作,直到复制完整个文件。典型代码如下所示:

#define SIZE (1024*1024)

char buffer[SIZE];
size_t bytes;

while (0 < (bytes = fread(buffer, 1, sizeof(buffer), infile)))
    fwrite(buffer, 1, bytes, outfile);
#定义大小(1024*1024)
字符缓冲区[大小];
字节大小;
而(0<(字节=fread(缓冲区,1,大小为f(缓冲区),填充)))
fwrite(缓冲区,1,字节,输出文件);
这不是工作原理

要复制文件,通常需要分配一个缓冲区,然后使用
fread
读取一个数据缓冲区,然后使用
fwrite
将数据写回。重复此操作,直到复制完整个文件。典型代码如下所示:

#define SIZE (1024*1024)

char buffer[SIZE];
size_t bytes;

while (0 < (bytes = fread(buffer, 1, sizeof(buffer), infile)))
    fwrite(buffer, 1, bytes, outfile);
#定义大小(1024*1024)
字符缓冲区[大小];
字节大小;
而(0<(字节=fread(缓冲区,1,大小为f(缓冲区),填充)))
fwrite(缓冲区,1,字节,输出文件);
也许通过一个透视图可以为您指明正确的方向。

也许通过一个透视图可以为您指明正确的方向。

以下是如何做到这一点: 选项1:动态“数组”

嵌套级别:0

//变量定义
char*cpArr;
文件*fpSourceFile=fopen(,“rb”);
文件*fpTargetFile=fopen(,“wb”);
//代码段
//获取源文件的位大小
fseek(fpSourceFile,0,SEEK_END);//转到文件的末尾
cpArr=(char*)malloc(sizeof(*cpArr)*ftell(fpSourceFile));//创建该大小的数组
fseek(fpSourceFile,0,SEEK_SET);//将光标返回到起始位置
//从源文件读取-“复制”
fread(&cpArr,规模为(cpArr),1,fpSourceFile);
//写入目标文件-“粘贴”
fwrite(&cpArr,sizeof(cpArr),1,fpTargetFile);
//关闭文件
fclose(fpSourceFile);
fclose(fpTargetFile);
//释放已使用的内存
免费(cpArr);
选项2:逐字符

嵌套级别:1

//变量定义
char-cTemp;
文件*fpSourceFile=fopen(,“rb”);
文件*fpTargetFile=fopen(,“wb”);
//代码段
//从源文件读取-“复制”
而(fread(&cTemp,1,1,fpSourceFile)==1)
{
//写入目标文件-“粘贴”
fwrite(&cTemp,1,1,fpTargetFile);
}
//关闭文件
fclose(fpSourceFile);
fclose(fpTargetFile);
以下是如何做到这一点: 选项1:动态“数组”

嵌套级别:0

//变量定义
char*cpArr;
文件*fpSourceFile=fopen(,“rb”);
文件*fpTargetFile=fopen(,“wb”);
//代码段
//获取源文件的位大小
fseek(fpSourceFile,0,SEEK_END);//转到文件的末尾
cpArr=(char*)malloc(sizeof(*cpArr)*ftell(fpSourceFile));//创建该大小的数组
fseek(fpSourceFile,0,SEEK_SET);//将光标返回到起始位置
//从源文件读取-“复制”
fread(&cpArr,规模为(cpArr),1,fpSourceFile);
//写入目标文件-“粘贴”
fwrite(&cpArr,sizeof(cpArr),1,fpTargetFile);
//关闭文件
fclose(fpSourceFile);
fclose(fpTargetFile);
//释放已使用的内存
免费(cpArr);
选项2:逐字符

嵌套级别:1

//变量定义
char-cTemp;
文件*fpSourceFile=fopen(,“rb”);
文件*fpTargetFile=fopen(,“wb”);
//代码段
//从源文件读取-“复制”
而(fread(&cTemp,1,1,fpSourceFile)==1)
{
//写入目标文件-“粘贴”
fwrite(&cTemp,1,1,fpTargetFile);
}
//关闭文件
fclose(fpSourceFile);
fclose(fpTargetFile);

fwrite()
调用中,第一个参数应该是指向内存中文件内容的指针(我在这里看不到您读取的内容),而不是
fi
本身。@Zach49899您可以使用,系统调用。更简单。在
fwrite()
调用中,第一个参数应该是指向内存中文件内容的指针(我在这里看不到您读取的内容),而不是
fi
本身。@Zach49899您可以使用,系统调用。这更简单。对于很多认为这不是答案的人来说,如果我能想出如何在评论中嵌入链接,我很乐意将其转换为评论。发现得不错
Zach49899
:看看复制功能。对于很多认为这不是答案的人来说,如果我能想出如何在评论中嵌入链接,我很乐意将其转换为评论。发现得不错<代码>Zach49899:看看复制功能。你的意思是这样吗?FILE*out=fopen(“复制输出”,“w”);int*buf=malloc(结束-开始);fread(buf,结束-开始,1,fi);写入(buf,结束-开始,1,输出);您有一个大致的想法,对于大型文件,您必须将其分成几部分。是否有任何方法可以创建一个指向mallocate-d地址的指针,只存储0和1,而不关心它们代表什么?这个
// Variable Definition
char *cpArr;
FILE *fpSourceFile = fopen(<Your_Source_Path>, "rb");
FILE *fpTargetFile = fopen(<Your_Target_Path>, "wb");

// Code Section

// Get The Size Of bits Of The Source File
fseek(fpSourceFile, 0, SEEK_END); // Go To The End Of The File 
cpArr = (char *)malloc(sizeof(*cpArr) * ftell(fpSourceFile)); // Create An Array At That Size
fseek(fpSourceFile, 0, SEEK_SET); // Return The Cursor To The Start

// Read From The Source File - "Copy"
fread(&cpArr, sizeof(cpArr), 1, fpSourceFile);

// Write To The Target File - "Paste"
fwrite(&cpArr, sizeof(cpArr), 1, fpTargetFile);

// Close The Files
fclose(fpSourceFile);
fclose(fpTargetFile);

// Free The Used Memory
free(cpArr);
// Variable Definition
char cTemp;
FILE *fpSourceFile = fopen(<Your_Source_Path>, "rb");
FILE *fpTargetFile = fopen(<Your_Target_Path>, "wb");

// Code Section

// Read From The Source File - "Copy"
while(fread(&cTemp, 1, 1, fpSourceFile) == 1)
{
    // Write To The Target File - "Paste"
    fwrite(&cTemp, 1, 1, fpTargetFile);
}

// Close The Files
fclose(fpSourceFile);
fclose(fpTargetFile);