文件

  1 /*
  2 复习  结构体联合枚举
  3     struct   union enum
  4 
  5 
  6 新内容 文件操作
  7 
  8 1. 文件操作的作用 目前数据存在内存  只要程序退出 这些内存都会回收  数据会丢失
  9       如果想要存放这些在内存中的数据  需要用到文件操作
 10       如果想要得到某个文件的内容  也需要文件操作
 11 
 12       读档  存档
 13 2. 课前准备  路径写法
 14 
 15    绝对路径   从磁盘名开始   比如 C:UsersAdministratorDesktopXX.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("文件打开失败
");
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("文件打开失败
");
201         return;//打开失败 直接return
202     }
203 
204     //可以先准备一个字符 或者先准备一个字符串
205     //直接讲字符写入文件当中
206 
207     //fputc('A', fp);//写入一个字符
208     //char str[128] = "你好 世界";
209     
210     //for (int i = 0; str[i] != ''; ++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	%s
", 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("文件打开失败
");
237         return;//打开失败 直接return
238     }
239     STU st;
240 
241     while(EOF!=fscanf(fp, "%d	%s
", &st.ID, st.name))//读取数据
242         printf("%d	%s
", 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("文件打开失败
");
257         return;//打开失败 直接return
258     }
259     
260     STU st;//读取文件
261     while(fread(&st, sizeof(STU), 1, fp)!=0)
262         printf("%d	%s
", st.ID, st.name);
263 
264 
265     printf("文件指针的偏移是%ld字节
", 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	%s
", 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("文件打开失败
");
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 */
原文地址:https://www.cnblogs.com/liugangjiayou/p/10582259.html