全国计算机等级考试二级教程-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