概述
文章目录
- c语言——大文件拷贝
- 按【字符】读取复制
- 按【块】读取复制
- 问题思考
- 按【块】读取复制【改进】
- 按【块】读取复制【快速版】
- 按【块】读取复制【快速版】结构体指针
- fread的一些问题
c语言——大文件拷贝
按【字符】读取复制
本文代码在deepin(Linux系统)下编译与测试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include<sys/types.h>
#include <sys/stat.h>
//10M大小
#define MAXSIZE 1024*1024*10
// 有点问题,会多一个字符
// gcc -o mycp1 mycp1.c
// ./mycp1 ccc.mp4 ccc1.mp4
//-rw-r--r-- 1 zzyy zzyy 29141800 5月 10 22:14 ccc1.mp4
//-rwxrw-rw- 1 zzyy zzyy 29141799 12月 16 13:58 ccc.mp4
int main(int argc, char* argv[])
{
unsigned int start_time = time(NULL);
if (argc < 3)
{
printf("缺少参数n");
return -1;
}
//mycp wow.2.mp4 wow.3.mp4
//argv[0] argv[1] arr[2]
FILE* fp1 = fopen(argv[1], "rb");
FILE* fp2 = fopen(argv[2], "wb");
if (!fp1 || !fp2)
{
printf("操作文件失败n");
return -2;
}
char ch;
while (feof(fp1)==0)
{
ch=fgetc(fp1);
fputc(ch, fp2);
}
fclose(fp1);
fclose(fp2);
unsigned int end_time = time(NULL);
printf("花费时间:%d(s)n", end_time - start_time);
return 0;
}
按【块】读取复制
这个也有点问题,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include<sys/types.h>
#include <sys/stat.h>
//10M大小
#define MAXSIZE 1024*1024*10
// 有点问题,会多字符
// gcc -o mycp mycp.c
// ./mycp ccc.mp4 ccc1.mp4
//-rw-r--r-- 1 zzyy zzyy 29142016 5月 10 22:45 ccc1.mp4
//-rwxrw-rw- 1 zzyy zzyy 29141799 12月 16 13:58 ccc.mp4
int main(int argc, char* argv[])
{
unsigned int start_time = time(NULL);
if (argc < 3)
{
printf("缺少参数n");
return -1;
}
//mycp wow.2.mp4 wow.3.mp4
//argv[0] argv[1] arr[2]
FILE* fp1 = fopen(argv[1], "rb");
FILE* fp2 = fopen(argv[2], "wb");
if (!fp1 || !fp2)
{
printf("操作文件失败n");
return -2;
}
char ch[1024];
while (!feof(fp1))
{
memset(ch, 0, 1024);
fread(ch, 1024, 1,fp1);
fwrite(ch,1024 ,1,fp2);
}
fclose(fp1);
fclose(fp2);
unsigned int end_time = time(NULL);
printf("花费时间:%d(s)n", end_time - start_time);
return 0;
}
问题思考
拷贝的文件明显有问题,比原文件大了一些。
我们再看一下fread
函数。
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式从文件中读取内容
参数:
ptr:存放读取出来数据的内存空间
size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小
nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。
失败:0
我们能不能,把size设置为1,nmemb设置为1024,也就是
原来:
每次读=块数据大小 1024 * 1次
现在:
每次读=块数据大小 1 * 1024次
按【块】读取复制【改进】
while (!feof(fp1))
{
memset(ch, 0, 1024);
int len = fread(ch, 1, 1024,fp1);
fwrite(ch,len ,1,fp2);
}
测试
$ gcc -o mycp mycp.c
$ ./mycp ccc.mp4 ccc1.mp4
$ ls -all
29141799 5月 10 23:02 ccc1.mp4
29141799 12月 16 13:58 ccc.mp4
测试通过。
按【块】读取复制【快速版】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
//10M大小
#define MAXSIZE 1024*1024*10
int main(int argc, char* argv[])
{
unsigned int start_time = time(NULL);
if (argc < 3)
{
printf("缺少参数n");
return -1;
}
printf("%sn",argv[1]);
printf("%sn",argv[2]);
//mycp wow.2.mp4 wow.3.mp4
//argv[0] argv[1] arr[2]
FILE* fp1 = fopen(argv[1], "r");//windows要改成rb
FILE* fp2 = fopen(argv[2], "w");//windows要改成wb
if (!fp1 || !fp2)
{
printf("操作文件失败n");
return -2;
}
//获取文件属性
struct stat st = { 0 };
//获取源文件
stat(argv[1], &st);
printf("FileSize=%dn",st.st_size);
//return 0;
printf("获取源文件信息成功n");
char* ch;
int maxSize = 0;
if (st.st_size < MAXSIZE)
{
printf("maxSize1=%dn",st.st_size);
maxSize = st.st_size;
ch = (char*)malloc(sizeof(char) * st.st_size);
}
else
{
printf("maxSize2=%dn",MAXSIZE);
maxSize = MAXSIZE;
ch = (char*)malloc(sizeof(char) * MAXSIZE);
}
while (!feof(fp1))
{
memset(ch,0,maxSize);
int len = fread(ch, 1, maxSize, fp1);//123
fwrite(ch, 1, len, fp2);
}
fclose(fp1);
fclose(fp2);
free(ch);
unsigned int end_time = time(NULL);
printf("花费时间:%d(s)n", end_time - start_time);
return 0;
}
按【块】读取复制【快速版】结构体指针
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include<sys/types.h>
#include <sys/stat.h>
//10M大小
#define MAXSIZE 1024*1024*10
int main()
{
unsigned int start_time = time(NULL);
//mycp wow.2.mp4 wow.3.mp4
//argv[0] argv[1] arr[2]
FILE* fp1 = fopen("C:\Users\MagicBook\Desktop\vshello\ccc.mp4", "rb");//windows要改成rb
FILE* fp2 = fopen("C:\Users\MagicBook\Desktop\vshello\ccc1.mp4", "wb");//windows要改成wb
if (!fp1 || !fp2)
{
printf("操作文件失败n");
return -2;
}
//获取文件属性
struct stat *st = (struct stat*) malloc(sizeof(struct stat));
//获取源文件
stat("C:\Users\MagicBook\Desktop\vshello\ccc.mp4", st);
char* ch;
int maxSize = 0;
if (st->st_size < MAXSIZE)
{
maxSize = st->st_size;
ch = (char*)malloc(sizeof(char) * st->st_size);
}
else
{
maxSize = MAXSIZE;
ch = (char*)malloc(sizeof(char) * MAXSIZE);
}
while (!feof(fp1))
{
memset(ch, 0, maxSize);
int len = fread(ch, 1, maxSize, fp1);//123
fwrite(ch, 1, len, fp2);
}
fclose(fp1);
fclose(fp2);
free(st);
free(ch);
unsigned int end_time = time(NULL);
printf("花费时间:%d(s)n", end_time - start_time);
return 0;
}
fread的一些问题
调试发现,fread
在windows下不能读完整个文件。需要在fopen
处优化一下代码。
fread不能读完整个文件
最后
以上就是沉默滑板为你收集整理的c语言——大文件拷贝c语言——大文件拷贝的全部内容,希望文章能够帮你解决c语言——大文件拷贝c语言——大文件拷贝所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复