文件
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 */