1 /*
2 复习 结构体联合枚举
3 struct union enum
4
5
6 新内容 文件操作
7
8 1. 文件操作的作用 目前数据存在内存 只要程序退出 这些内存都会回收 数据会丢失
9 如果想要存放这些在内存中的数据 需要用到文件操作
10 如果想要得到某个文件的内容 也需要文件操作
11
12 读档 存档
13 2. 课前准备 路径写法
14
15 绝对路径 从磁盘名开始 比如 C:\Users\Administrator\Desktop\XX.xls
16 相对路径 从项目文件夹开始的 ./123.txt ../表示上层目录 /用来分割多层目录
17
18 相对路径比较常用 \\ \
19 字符串中\\ 表示一个\的意思 代码中的所有路径 隔开就用\\或者/
20
21 PS. 二进制文件 用计算机的方式存放的文件 mp3 wav word
22 用txt打开 看里面的内容有没有乱码
23
24 文本 记事本打开不会乱码的文件 txt .c .cpp
25
26
27
28 3. 文件指针和文件操作的函数
29
30 FILE* fp;//先要定义文件指针
31 1.打开和关闭文件 fopen fclose
32
33 2. 文件读写的函数
34 文本文件 每次单独读取一个字符的内容 fgetc fputc
35 fgetc 每次从文件中读取一个字符
36 fputc 把一个字符写入到文件当中
37
38
39 fgets fputs 字符串方式进行读写
40
41 fscanf fprintf 格式化读取
42
43 fprintf(fp,"格式占位符",数据);
44
45 fread fwrite(二进制文件的读写方式)
46
47
48
49
50 一般文件的读写会不会同时进行
51 玩游戏 游戏开始之前 读档 --->读文件
52 游戏结束的时候 存档--->写入文件
53
54
55
56 f function 函数的意思
57 fgetc get 得到 char 读取文件中一个字符
58 fputc put 放置 char 写文件的意思
59
60 s string 字符串
61
62 printf 输出到外部 fprintf 写文件
63 scanf 读取数据 fscanf读文件
64 read 读取 fread 读取文件
65 write fwrite 写文件
66
67
68 文本文件 字符类型 数字 123456 -->字符串存到文本当中 6个字符表示这个数字
69 (没有乱码 但是保密性不强)
70
71 二进制 用计算机内部存放方式 123456 整数 int 占4个字节
72 (读取的时候 比较快 但是会有乱码 适合程序使用)
73
74
75 fseek //移动文件指针
76 ftell //计算文件内部指针的偏移(相对于文件开头的偏移)
77 feof
78
79 rewind rewind将文件指针移回文件开头
80
81
82 fp (文件内部指针) 打开文件之后 fp始终指向文件
83 但是 有一个文件内部指针 指向当前读写的位置
84 如果r打开 内部指针就在开头
85 w/a 文件末尾
86
87
88
89 remove 删除文件 remove("123.txt");
90 */
91 #include<stdio.h>
92
93 typedef struct student //结构体类型
94 {
95 int ID;
96 char name[10];
97 ///....
98 }STU; //使用typedef给类型取别名
99
100 union MyUnion
101 {
102 int x;
103 float y;
104 };
105
106 enum dir
107 {
108 UP,DOWN,LEFT,RIGH //常量 有名字可以提高代码可读性 一般搭配switch使用
109 };
110
111 void test(){
112 STU beiwang;//结构体变量
113 beiwang.ID; // ->箭头运算符
114
115 STU*p = &beiwang;
116 p->ID;
117
118 int arr[10];
119 arr[0];
120
121 union MyUnion beibei;
122 beibei.x = 3;
123 beibei.y = 4.0f; //当给其中一个成员赋值 ,其他成员的值就会失效
124 }
125
126 void readFile()
127 {
128 FILE* fp;//定义一个文件指针 file pointer
129 fp = fopen("./123.txt","r");
130 /*
131 1. 文件的路径 一般相对路径
132 2. 第二个参数 是文件的打开方式 主要三种 rwa
133 r read 读取 从文件中读取数据 如果文件不存在 就会打开失败
134 w write 写入 清空文件 然后写入
135 如果文件不存在 就会创建一个新文件
136 a append 追加 是在源文件后面 增加新的内容 文件不存在 会创建新文件
137
138
139 修饰 后面可以加b或者t b表示二进制文件 t表示文本文件(一般省略t)
140
141 rb 用读取的方式打开二进制文件 如果文件不存在 就会打开失败
142 rt 用读取打开文本文件 (t可以省略)
143
144
145 + 如果在后面加上一个+ 表示文件可读写
146 rb+ 用读取的方式打开二进制文件 文件可以读写
147
148
149 rb+ b表示二进制文件 + 文件可以读写
150 r 用读取的方式打开 如果文件不存在 会打开失败
151 */
152 if (fp == NULL)//说明文件打开失败
153 {
154 printf("文件打开失败\n");
155 return;//打开失败 直接return
156 }
157
158 //一个字符一个字符读取文件中的内容
159 //char ch;
160 ////ch = fgetc(fp);//读取文件中的一个字符
161 ////putchar(ch);//将读取到的字符输出到屏幕
162 //while (1) //EOF end of file 表示文件末尾
163 //{
164 // ch = fgetc(fp);
165 // if (ch == EOF) break;// 读到文件末尾 结束读取
166 // putchar(ch);
167 //}
168
169 //一行一行读取文件
170 char str[128];
171 //fgets(str, 128, fp); //读取一行(不超过128个字符)
172
173 //判断fgets的返回值 就可以判断文件有没有读取完毕
174
175 //while (fgets(str,128,fp)!=NULL) puts(str);//使用返回值 判断文件是否读完
176
177 while (1)
178 {
179 fgets(str, 128, fp);//读取一行
180 printf("%s",str);
181 if (feof(fp)) break; //条件为真 表示已经读到文件末尾 可以结束
182
183 }
184
185 rewind(fp);//将文件指针移动回文件的开头
186 ftell(fp);//计算的文件指针的偏移 单位是字节
187
188
189
190
191 fclose(fp); //关闭文件的意思 保存文件
192 }
193
194 void writeFile()
195 {
196 FILE* fp;//定义一个文件指针 file pointer
197 fp = fopen("./写入.txt", "w");
198 if (fp == NULL)//说明文件打开失败
199 {
200 printf("文件打开失败\n");
201 return;//打开失败 直接return
202 }
203
204 //可以先准备一个字符 或者先准备一个字符串
205 //直接讲字符写入文件当中
206
207 //fputc('A', fp);//写入一个字符
208 //char str[128] = "你好 世界";
209
210 //for (int i = 0; str[i] != '\0'; ++i)
211 //{
212 // fputc(str[i], fp);
213 //}
214
215 //fputs(str, fp);//将一串字符写入到文件当中
216
217 STU arr[4] = { 1, "张三", 2, "李四", 3, "王五", 4, "赵六" };
218
219 for (int i = 0; i < 4; ++i)
220 {
221 fprintf(fp, "%d\t%s\n", arr[i].ID, arr[i].name);
222 }
223
224
225
226
227 fclose(fp);
228 }
229
230 void show()//和fprintf相关的读取
231 {
232 FILE* fp;//定义一个文件指针 file pointer
233 fp = fopen("./写入.txt", "r");
234 if (fp == NULL)//说明文件打开失败
235 {
236 printf("文件打开失败\n");
237 return;//打开失败 直接return
238 }
239 STU st;
240
241 while(EOF!=fscanf(fp, "%d\t%s\n", &st.ID, st.name))//读取数据
242 printf("%d\t%s\n", st.ID, st.name);
243
244 fclose(fp);
245
246 //scanf %s输入字符串 字符串中间不能有空格
247 //fscanf读取字符串时候 中间同样不能有空格
248 }
249
250 void read()
251 {
252 FILE* fp;//定义一个文件指针 file pointer
253 fp = fopen("./test.summer", "rb"); //后缀名随便写的
254 if (fp == NULL)//说明文件打开失败
255 {
256 printf("文件打开失败\n");
257 return;//打开失败 直接return
258 }
259
260 STU st;//读取文件
261 while(fread(&st, sizeof(STU), 1, fp)!=0)
262 printf("%d\t%s\n", st.ID, st.name);
263
264
265 printf("文件指针的偏移是%ld字节\n", ftell(fp));
266 fseek(fp, sizeof(STU), SEEK_SET);//文件指针 从文件开头偏移16个字节
267 //第一个 参数 文件指针
268 //第二个参数 是要移动多少个字节 16 往后移动16个字节
269 //如果是-16 那么往前移动16个字节
270 //最后一个参数 SEEK_SET 文件开头
271 // SEEK_END 文件末尾
272 // SEEK_CUR 文件指针当前位置
273
274
275
276
277
278 while (fread(&st, sizeof(STU), 1, fp) != 0)
279 printf("%d\t%s\n", st.ID, st.name);
280
281
282 fclose(fp);
283 }
284
285 void write()
286 {
287 FILE* fp;//定义一个文件指针 file pointer
288 fp = fopen("./test.summer", "wb");
289 if (fp == NULL)//说明文件打开失败
290 {
291 printf("文件打开失败\n");
292 return;//打开失败 直接return
293 }
294
295 STU arr[4] = { 1, "张三", 2, "李四", 3, "王五", 4, "赵六" };
296
297 //一个结构体当成一个整体 二进制文件 用字节为单位进行写入
298
299 fwrite(arr, sizeof(STU), 4, fp);//结构体直接写入到文件当中
300 //第一个 地址
301 //第二个 单个的大小
302 //第三个 个数
303
304
305
306
307
308 fclose(fp);
309 }
310
311
312 int main()
313 {
314 //readFile();
315 //writeFile();
316
317 //show();
318
319 write();
320 read();
321
322 //图形库 颜色 RED
323 //按键消息 WM_LBUTTONDOWN
324
325 getchar();
326 return 0;
327 }
328 /*
329 fopen---->fopen_s
330
331 fopen_s(&fp,文件路径,文件打开方式);
332
333 fp=fopen(文件路径,文件打开方式);
334 */