全国计算机等级考试二级教程-C语言程序设计_第16章_文件
写入一段文本到文件
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 FILE *pf;//文件指针 9 char path[100] = "E:\1.txt"; 10 pf = fopen(path, "w");//打开一个写入的文件,有就覆盖,没有创建之 11 12 if (pf == NULL) 13 { 14 printf("文件打开失败"); 15 } 16 else 17 { 18 printf("文件打开成功 "); 19 20 char str[100] = "hello world, i love cpp"; 21 int length; 22 length = strlen(str);//获取字符串的长度 23 int i; 24 25 for (i = 0;i < length;i++) 26 { 27 fputc(str[i], pf);//往一个文件写入字符 28 } 29 30 fclose(pf); 31 } 32 33 system("pause"); 34 }
字符读取,字符串读取
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 FILE *pf; 9 10 pf = fopen("E:\1.txt", "r"); 11 12 if (pf == NULL) 13 { 14 printf("fail"); 15 } 16 else 17 { 18 int size; 19 20 while (!feof(pf))//字符读取 21 { 22 char ch = fgetc(pf); 23 putchar(ch); 24 } 25 26 size = ftell(pf); 27 28 printf("size=%d ", size); 29 30 printf(" "); 31 rewind(pf); 32 33 char str[100] = { 0 }; 34 while (fgets(str, 100, pf) != NULL)//字符串读取 35 { 36 puts(str); 37 } 38 39 printf("size=%d ", size); 40 41 fclose(pf); 42 } 43 44 system("pause"); 45 }
字符移位加密
1 #define _CRT_SECURE_NO_WARNINGS
2
3 #include<stdio.h>
4 #include<stdlib.h>
5
6 void jia(int pass)
7 {
8 FILE *pfr;//读取1.txt
9 FILE *pfw;//写入1jia.txt
10
11 char pathr[100] = "E:\1.txt";
12 char pathw[100] = "E:\1jia.txt";
13
14 pfr = fopen(pathr, "r");//用读的模式打开被加密的文件
15 pfw = fopen(pathw, "w");//用写的模式打开要写入加密的文件
16
17 if (pfr == NULL || pfw == NULL)
18 {
19 printf("文件故障,加密失败");
20 return;
21 }
22
23 while (!feof(pfr))//一直读到要加密的文本的末尾
24 {
25 char ch = fgetc(pfr);
26 ch = ch + pass;//字符移位加密
27 fputc(ch, pfw);//写入文本
28 }
29
30 fclose(pfr);
31 }
32
33 void jie(int pass)
34 {
35 FILE *pfr;//读取1jia.txt
36 FILE *pfw;//写入1jie.txt
37
38 char pathr[100] = "E:\1jia.txt";
39 char pathw[100] = "E:\1jie.txt";
40
41 pfr = fopen(pathr, "r");//用读的模式打开加密以后的文件
42 pfw = fopen(pathw, "w");//用写的模式打开要写入解密的文件
43
44 if (pfr == NULL || pfw == NULL)
45 {
46 printf("文件故障,加密失败");
47 return;
48 }
49
50 while (!feof(pfr))//一直读到要解密的文本的末尾
51 {
52 char ch = fgetc(pfr);
53 ch = ch - pass;//字符移位加密
54 fputc(ch, pfw);//写入文本
55 }
56
57 fclose(pfr);
58 }
59
60 main()
61 {
62 int pass = 5;
63
64 jia(pass);
65
66 jie(pass);
67
68 system("pause");
69 }
字符异或加密
1 #define _CRT_SECURE_NO_WARNINGS
2
3 #include<stdio.h>
4 #include<stdlib.h>
5
6 void yjia(int pass)
7 {
8 FILE *pfr;//读取1.txt
9 FILE *pfw;//写入1jiay.txt
10
11 char pathr[100] = "E:\1.txt";
12 char pathw[100] = "E:\1jiay.txt";
13
14 pfr = fopen(pathr, "r");//用读的模式打开被加密的文件
15 pfw = fopen(pathw, "w");//用写的模式打开要写入加密的文件
16
17 if (pfr == NULL || pfw == NULL)
18 {
19 printf("文件故障,加密失败");
20 return;
21 }
22
23 while (!feof(pfr))//一直读到要加密的文本的末尾
24 {
25 char ch = fgetc(pfr);
26 ch = ch ^ pass;//异或加密
27 fputc(ch, pfw);//写入文本
28 }
29
30 fclose(pfr);
31 }
32
33 void yjie(int pass)
34 {
35 FILE *pfr;//读取1jiay.txt
36 FILE *pfw;//写入1jiey.txt
37
38 char pathr[100] = "E:\1jiay.txt";
39 char pathw[100] = "E:\1jiey.txt";
40
41 pfr = fopen(pathr, "r");//用读的模式打开加密以后的文件
42 pfw = fopen(pathw, "w");//用写的模式打开要写入解密的文件
43
44 if (pfr == NULL || pfw == NULL)
45 {
46 printf("文件故障,加密失败");
47 return;
48 }
49
50 while (!feof(pfr))//一直读到要解密的文本的末尾
51 {
52 char ch = fgetc(pfr);
53 ch = ch ^ pass;//异或加密
54 fputc(ch, pfw);//写入文本
55 }
56
57 fclose(pfr);
58 }
59
60 main()
61 {
62 int pass = 5;
63
64 yjia(pass);
65
66 yjie(pass);
67
68 system("pause");
69 }
打印汉字,必须要连着,否则会出现乱码
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 char str[5] = "我的"; 9 10 printf("%c%c", str[0], str[1]); 11 //必须要连着,否则会出现乱码 12 printf("%c %c", str[0], str[1]); 13 14 system("pause"); 15 }
//一个汉字2个字节,加上' '有3个字节
//2个汉字4个字节,加上' '有5个字节
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 printf("%d ", sizeof("我")); 9 //一个汉字2个字节,加上' '有3个字节 10 printf("%d ", sizeof("我是")); 11 //2个汉字4个字节,加上' '有5个字节 12 13 system("pause"); 14 }
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 //feek可以移动到指定的位置进行读写 7 //移动到尾部进行写入,移动到尾部前面几个字节进行写入 8 main1() 9 { 10 FILE *pf = fopen("E:\1.txt", "r+");//r为读和写而打开文本文件 11 12 if (pf == NULL) 13 { 14 printf("文件打开失败 "); 15 } 16 else 17 { 18 printf("文件打开成功 "); 19 20 fseek(pf, 0, SEEK_END);//移动文件指针末尾 21 22 fputs("hello", pf);//输出字符串 23 24 fflush(pf); 25 26 fseek(pf, 5, SEEK_END);//往前移动5个字节 27 28 fputs("world", pf);//输出字符串 29 30 fclose(pf); 31 } 32 33 system("pause"); 34 } 35 36 //读取后面几个字符 37 main2() 38 { 39 FILE *pf = fopen("E:\1.txt", "r+");//r为读和写而打开文本文件 40 41 if (pf == NULL) 42 { 43 printf("文件打开失败 "); 44 } 45 else 46 { 47 printf("文件打开成功 "); 48 49 fseek(pf, -10, SEEK_END);//往前移动5个字节 50 51 while (!feof(pf)) 52 { 53 char ch = fgetc(pf);//获取一个字符 54 putchar(ch); 55 } 56 57 fclose(pf); 58 } 59 60 system("pause"); 61 } 62 63 //读取前面几个字符 64 main3() 65 { 66 FILE *pf = fopen("E:\1.txt", "r+");//r为读和写而打开文本文件 67 68 if (pf == NULL) 69 { 70 printf("文件打开失败 "); 71 } 72 else 73 { 74 printf("文件打开成功 "); 75 76 fseek(pf, 8, SEEK_SET);//从文件开头+8的位置开始读取 77 78 while (!feof(pf)) 79 { 80 char ch = fgetc(pf);//获取一个字符 81 putchar(ch); 82 } 83 84 fclose(pf); 85 } 86 87 system("pause"); 88 } 89 90 //修改前面几个字符 91 main4() 92 { 93 FILE *pf = fopen("E:\1.txt", "r+");//r为读和写而打开文本文件 94 95 if (pf == NULL) 96 { 97 printf("文件打开失败 "); 98 } 99 else 100 { 101 printf("文件打开成功 "); 102 103 int i; 104 105 for (i = 0;i < 8;i++) 106 { 107 fputc('1', pf); 108 } 109 110 printf(" "); 111 rewind(pf); 112 113 while (!feof(pf)) 114 { 115 char ch = fgetc(pf); 116 putchar(ch); 117 } 118 119 fclose(pf); 120 } 121 122 system("pause"); 123 } 124 125 //修改前面几个字符2 126 main5() 127 { 128 FILE *pf = fopen("E:\1.txt", "r+");//r为读和写而打开文本文件 129 130 if (pf == NULL) 131 { 132 printf("文件打开失败 "); 133 } 134 else 135 { 136 printf("文件打开成功 "); 137 138 fseek(pf, 8, SEEK_SET); 139 140 char ch; 141 142 for (ch = '1';ch <= '5';ch++) 143 { 144 fputc(ch, pf); 145 } 146 147 rewind(pf); 148 149 while (!feof(pf)) 150 { 151 char ch = fgetc(pf); 152 putchar(ch); 153 } 154 155 fclose(pf); 156 } 157 158 system("pause"); 159 } 160 161 //fseek修改二进制文件 162 main() 163 { 164 FILE *pf = fopen("E:\1.txt", "wb+");//r为写而打开一个二进制文件 165 166 if (pf == NULL) 167 { 168 printf("文件打开失败 "); 169 } 170 else 171 { 172 printf("文件打开成功 "); 173 174 double db[10] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10 }; 175 176 fwrite(db, sizeof(double), 10, pf);//写入一片内存,每个元素8个字节,一共10个到文件 177 178 rewind(pf); 179 180 double dbr[10]; 181 182 fread(dbr, sizeof(double), 10, pf);//读取二进制 183 184 int i; 185 for (i = 0;i < 10;i++) 186 { 187 printf("%f ", dbr[i]); 188 } 189 190 fclose(pf); 191 } 192 193 system("pause"); 194 }
打开文件,一定要关闭文件。
fclose有一个动作,就是将文件缓冲区的内容,写入到文本。如果程序意外关闭,没有调用fclose,文件数据丢失
r读,w写,+可读可写,b二进制,t就是文本
既没有b也没有t,不强调是二进制还是文本,普遍适用
fopen
//若文件不存在,则新建文件
//若文件存在,则文件长度清零,则该文件内容会消失
//wb只允许写数据
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 //若文件不存在,则新建文件 7 //若文件存在,则文件长度清零,则该文件内容会消失 8 //wb只允许写数据 9 main() 10 { 11 char path[40] = "E:\WB.txt"; 12 13 FILE *pf = fopen(path, "wb");//按照写的方式打开文件 14 15 if (pf == NULL) 16 { 17 printf("fail"); 18 } 19 else 20 { 21 printf("succes "); 22 23 float fl[5] = { 1.0,2.0,3.0,4.0,5.0 }; 24 25 fwrite(fl, 4, 5, pf);//将数组这一片内存写入文件 26 27 rewind(pf);//移动指针到开头 28 29 float flx[5] = { 0.0 }; 30 31 int res = fread(flx, 4, 5, pf);//将文件读入内存 32 33 printf("%d ", res); 34 35 if (res != 5) 36 { 37 printf("fail"); 38 } 39 else 40 { 41 printf("succes "); 42 } 43 fclose(pf);//关闭文件指针 44 } 45 system("pause"); 46 }
fopen
//若文件不存在,则新建文件
//若文件存在,则文件长度清零,则该文件内容会消失
//w+模式既能写也能读
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 //若文件不存在,则新建文件 7 //若文件存在,则文件长度清零,则该文件内容会消失 8 //w+模式既能写也能读 9 main() 10 { 11 char path[40] = "E:\WJ.txt"; 12 13 FILE *pf = fopen(path, "w+");//按照w+写的方式打开文件 14 15 if (pf == NULL) 16 { 17 printf("fail"); 18 } 19 else 20 { 21 printf("succes "); 22 23 fputs("hello", pf);//写入 24 25 rewind(pf);//文件指针移动到开头 26 27 char ch = fgetc(pf);//从文件读取一个字符保存到ch 28 //fgetc如果执行成功,就会返回读取的字符 29 30 printf("%d ", ch);//执行失败,返回-1 31 32 putchar(ch); 33 34 putchar(ch); 35 36 fclose(pf);//关闭文件指针 37 } 38 39 system("pause"); 40 }
fopen
r+打开可读写的文件,该文件必须存在,存在就可以读且写
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 //r+打开可读写的文件,该文件必须存在,存在就可以读且写 7 main() 8 { 9 char path[40] = "E:\Z.txt"; 10 11 FILE *pf = fopen(path, "r+");//按照写的方式打开文件 12 13 if (pf == NULL) 14 { 15 printf("fail"); 16 } 17 else 18 { 19 printf("succes "); 20 21 while (!feof(pf))//判断文件是否到了末尾 22 { 23 char ch = fgetc(pf);//从文件读取一个字符保存到ch 24 putchar(ch);//输出这个字符 25 } 26 27 int res = fputc('A', pf);//写入不会报错,但是写入会失败 28 29 printf("%d ", res); 30 31 if (res == -1) 32 { 33 printf("fail"); 34 } 35 else 36 { 37 printf("succes"); 38 } 39 fclose(pf);//关闭文件指针 40 } 41 42 system("pause"); 43 }
fopen
w写
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 //若文件不存在,则新建文件 7 //若文件存在,则文件长度清零,则该文件内容会消失 8 //w模式只能写,不能读 9 main() 10 { 11 char path[40] = "E:\W.txt"; 12 13 FILE *pf = fopen(path, "w");//按照写的方式打开文件 14 15 if (pf == NULL) 16 { 17 printf("fail"); 18 } 19 else 20 { 21 printf("succes "); 22 23 fputs("hello", pf);//写入 24 25 rewind(pf);//文件指针移动到开头 26 27 char ch = fgetc(pf);//从文件读取一个字符保存到ch 28 //fgetc如果执行成功,就会返回读取的字符 29 30 printf("%d ", ch);//执行失败,返回-1 31 32 putchar(ch); 33 34 putchar(ch); 35 36 fclose(pf);//关闭文件指针 37 } 38 39 system("pause"); 40 }
fopen
r读
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 //r该文件必须存在,不存在打开失败 7 //打开成功,我们就可以进行读的操作 8 //进行写的操作的时候,不会提示错误,但是会操作失败 9 main() 10 { 11 char path[40] = "E:\X.txt"; 12 13 FILE *pf = fopen(path, "r");//按照读的方式打开文件 14 15 if (pf == NULL) 16 { 17 printf("fail"); 18 } 19 else 20 { 21 printf("succes "); 22 23 while (!feof(pf))//判断文件是否到了末尾 24 { 25 char ch = fgetc(pf);//从文件读取一个字符保存到ch 26 putchar(ch);//输出这个字符 27 } 28 29 int res = fputc('A', pf);//写入不会报错,但是写入会失败 30 31 printf("%d ", res); 32 33 if (res == -1) 34 { 35 printf("fail"); 36 } 37 else 38 { 39 printf("succes"); 40 } 41 fclose(pf);//关闭文件指针 42 } 43 44 system("pause"); 45 }
例16.1
把从键盘输入的文本按原样输出到名为 file_a.dat 的文件,用字符@作为键盘输入结束标志。
(1)打开文件。
(2)从键盘输入一个字符。
(3)判断输入的字符是否是@。若是,结束循环,执行步骤(7)。
(4)把刚输入的字符输出到指定的文件中。
(5)从键盘输入一个字符。
(6)重复步骤(3)至(5)。
(7)关闭文件。
(8)程序结束。
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 main() 5 { 6 FILE * fpout; 7 char ch; 8 if ((fpout = fopen("file_a.dat", "w")) == NULL) 9 { 10 printf("Can't open this file! "); 11 exit(0); 12 } 13 ch = getchar(); 14 while (ch != '@') 15 { 16 fputc(ch, fpout); 17 ch = getchar(); 18 } 19 fclose(fpout); 20 }
例16.2
把一个已存在磁盘上的 file_a.dat 文本文件中的内容原样输出到终端屏幕上。
(1)打开文件。
(2)从指定文件中读入一个字符。
(3)判断读入的是否是文件结束标志。若是,结束循环,执行步骤(7)。
(4)把刚输入的字符输出到终端屏幕。
(5)从文件中再读入一个字符。
(6)重复步骤(3)至(5)。
(7)关闭文件。
(8)程序结束。
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 main() 5 { 6 FILE * fpin; 7 char ch; 8 if ((fpin = fopen("file_a.dat", "r")) == NULL) 9 { 10 printf("Can't open this file! "); 11 exit(0); 12 } 13 ch = fgetc(fpin); 14 while (ch != EOF) 15 { 16 putchar(ch); 17 ch = fgetc(fpin); 18 } 19 fclose(fpin); 20 }
123