<C - 文件操作> 2017-12-05
01、文件操作1:
/* 1.文件 保存数据 jpg cpp txt 文件后缀不影响文件内容 后缀 告诉计算机怎么去打开文件 2.文件操作的函数 文件指针 文件打开之后 指针指向文件 3.文件加密解密 异或 ab a^b ^b-->a a--b-->c--b-->a b作为密码 作业 用代码拷贝一个文件 文件1 拷贝另外一个文件2 txt练习 选做题 --> 课后了解一下 文件的加密和解密 */ #include<stdio.h> int main() { FILE *fp;//文件指针 FILE POINTER fp=fopen("1.txt", "w");//打开文件 /* 打开失败返回值为NULL 第一个 文件的位置 文件路径 第二个 打开方式 r read 读取 (只能打开一个已有的文件 没有打开失败) w write 写入 (如果文件存在 就把文件清空 如果文件不存在 新建文件) a append 追加 (已有文件后面追加新的内容 不清除原有内容) t 文本文件 txt 用文本方式写入 (可以不写) b 二进制文件 用二进制方式写入 (会乱码) + 可读写文件 打开一个可读写文件 打开方式 r 只读的方式打开文件 w 写入的方式打开 a 用追加的方式打开 rb rt rb+ 用只读的方式 去打开一个可读写的二进制文件 ab+ */ #if 0 /* fgetc 在文件中读出一个字符 fputc 在文件中写入一个字符 作用 和参数 */ char arr[12] = "hello world"; for (int i = 0; i < 11; i++) { fputc(arr[i], fp); } fclose(fp);//保存文件 fp = fopen("1.txt", "r");//只读的方式打开 if (fp == NULL) { printf("文件打开失败"); getchar(); return 0; } int ch; //字符串末尾 '\0' 文件末尾 printf("文件内容是:\n"); while ((ch = fgetc(fp)) != EOF) { printf("%c", ch); } #elif 0 /* fgets 从文件中读取一个字符串 fputs 将一个字符串写入到文件夹 */ fputs("你好 未来", fp); fclose(fp);//保存文件 fp = fopen("1.txt", "r");//只读的方式打开 if (fp == NULL) { printf("文件打开失败"); getchar(); return 0; } printf("读出的字符串是:\n"); char arr[100]; fgets(arr, 100, fp);//读取字符串之后存放的位置 ,最多能读取多少 ,从什么地方读取 printf("%s", arr); #elif 1 /* fscanf 格式化写入 从文件中写入到程序 fprintf 格式化输出 从程序输出到文件 */ fprintf(fp,"今天%d月 %d号\n%s", 12, 5, "天气很好");//格式占位符 //char arr[10]; //sprintf(arr, "今天%d月%d号\n%s", 12, 5, "天气很好");//把后面的内容写入到数组中 fclose(fp);//保存文件 fp = fopen("1.txt", "r");//只读的方式打开 if (fp == NULL) { printf("文件打开失败"); getchar(); return 0; } int x, y; char arr[100]; //fprintf(fp, "今天%d月%d号\n%s", 12, 5, "天气很好"); //fscanf(fp,"%d%d\n%s", &x, &y, arr);//怎么写入 怎么读出 //printf("读出的数据是\t %d\t%d\t%s", x, y, arr); fscanf(fp,"%s", arr); printf("读出的数据是%s", arr); /* danny 70 70 50 xk 60 70 90 xingkong 90 67 80 */ #endif /* ftell fseek rewind 文件指针的原理 fp指向文件 文件内部指针(光标) 指向读取的位置 feof 表示是否文件指针是否移动到文件末尾 (一般用来判断二进制文档) feof(fp) 返回1 表示读到文件末尾 返回0 还没有读取到文件末尾 */ rewind(fp);//将文件指针指向文件开头 long address = ftell(fp);//返回文件指针离文件开头的偏移量 fseek(fp, address, SEEK_SET);//定位函数 根据偏移量 将文件指针移动到 //SEEK_SET 文件开头 //SEEK_CUR 文件指针当前位置 //SEEK_END 文件末尾 getchar(); fclose(fp);//关闭文件 return 0; }
02、文件操作2
#include<stdio.h> /* fread 从文件读取一块数据 存入程序中某个变量或者数组 fwrite 从程序中写入文件 */ typedef struct node { int data; char name[10]; double weight; }NODE,*PNODE; int main() { #if 0 FILE *fp = fopen("2.txt", "wb"); if (fp == NULL) return 0;//判断是否打开失败 NODE arr[10] = { { 0, "未来", 3.1415926 }, {1, "白羊", 3.1415926 } }; for (int i=2; i < 10; i++) { arr[i] = arr[0]; arr[i].data = i; } fwrite(arr, sizeof(NODE), 10, fp); //arr 要写入的数据存放的位置 取水点 //sizeof(NODE) 写入数据的单位(字节) 一次性取多少 //10 个数 取的次数 //fp 文件指针 放水点 #elif 1 FILE *fp = fopen("2.txt", "rb"); if (fp == NULL) return 0;//判断是否打开失败 NODE brr[10]; fread(brr, sizeof(NODE), 10, fp); //从文件中读出来 -->fp //读到brr中 for (int i = 0; i < 10; i++) { printf("%d\t%s\t%lf\n", brr[i].data, brr[i].name, brr[i].weight); //(brr + i)->data; } #endif fclose(fp); getchar(); return 0; }
03、加密软件:
#include<stdio.h> int main() { FILE *fp = fopen("文档.txt", "rb"); FILE *fp2 = fopen("加密文档.txt", "wb"); char arr[2] = { 0 }; while (!feof(fp)) { fread(arr, sizeof(char), 1, fp);//读取文档 arr[0] ^= 123; fwrite(arr, sizeof(char), 1, fp2);//写入加密文档 } fclose(fp); fclose(fp2); getchar(); //remove("文档.txt"); //解密文件 fp = fopen("加密文档.txt", "rb"); fp2 = fopen("解密文档.txt", "wb"); while (!feof(fp)) { fread(arr, sizeof(char), 1, fp);//读取文档 printf("%s\n", arr); arr[0] ^= 123; fwrite(arr, sizeof(char), 1, fp2);//写入加密文档 } fclose(fp); fclose(fp2); getchar(); return 0; }
04、解压软件:
<补课文件操作>:
/* ** 打开文件 -> FILE fopen(文件路径,打开方式); (返回指针) ** ** */ #include <stdio.h> #include <stdlib.h> int main() { FILE *pFile = fopen("Danny.txt", "w"); // 定义文件指针 并打开文件 if (NULL == pFile) // 判断打开文件 { printf("打开文件失败!"); exit(0); // 退出程序 } // 第一个参数:要写入数据的地址 // 第二个参数:要写多大 // 第三个参数:你要写多少次 // 第四个参数:指向FILE结构体指针 fwrite("夏七好可爱!!!", 13, 1, pFile); //fwrite("夏七好可爱!!!", 1, 13, pFile); // // 比方说 你要从一个文件读出东西 可是你不知道有多少个字节 怎么读写 char strtext[1024] = { 0 }; int i = 0; fseek(pFile, 4, SEEK_SET); while (strtext[i] == fgetc(pFile) != EOF) { i++; } printf("读出的数据:%s\n", strtext); fclose(pFile); // 关闭文件 getchar(); return 0; }