我是靠谱客的博主 沉默滑板,这篇文章主要介绍c语言——大文件拷贝c语言——大文件拷贝,现在分享给大家,希望可以做个参考。

文章目录

  • c语言——大文件拷贝
    • 按【字符】读取复制
    • 按【块】读取复制
      • 问题思考
    • 按【块】读取复制【改进】
    • 按【块】读取复制【快速版】
    • 按【块】读取复制【快速版】结构体指针
    • fread的一些问题

c语言——大文件拷贝

按【字符】读取复制

本文代码在deepin(Linux系统)下编译与测试

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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; }

按【块】读取复制

这个也有点问题,

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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函数。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
#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,也就是

复制代码
1
2
3
4
5
原来: 每次读=块数据大小 1024 * 1次 现在: 每次读=块数据大小 1 * 1024

按【块】读取复制【改进】

复制代码
1
2
3
4
5
6
7
while (!feof(fp1)) { memset(ch, 0, 1024); int len = fread(ch, 1, 1024,fp1); fwrite(ch,len ,1,fp2); }

测试

复制代码
1
2
3
4
5
6
$ gcc -o mycp mycp.c $ ./mycp ccc.mp4 ccc1.mp4 $ ls -all 29141799 510 23:02 ccc1.mp4 29141799 1216 13:58 ccc.mp4

测试通过。

按【块】读取复制【快速版】

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#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; }

按【块】读取复制【快速版】结构体指针

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#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语言——大文件拷贝内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部