在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
c语言对文件的操作主要分为:按字符操作,按行操作,按内存块操作 主要的函数: fopen(): FILE * fopen(_In_z_ const char * _Filename, _In_z_ const char * _Mode); 第一个参数是文件的绝对路径名(包含文件),第二个是文件的打开方式,Mode(方式)意义如下: "r" 打开一个用于读取的文本文件 "w" 创建一个用于写入的文本文件 "a" 附加到一个文本文件 "rb" 打开一个用于读取的二进制文件 "wb" 创建一个用于写入的二进制文件 "ab" 附加到一个二进制文件 "r+" 打开一个用于读/写的文本文件 "w+" 创建一个用于读/写的文本文件 "a+" 打开一个用于读/写的文本文件 "rb+" 打开一个用于读/写的二进制文件 "wb+" 创建一个用于读/写的二进制文件 "ab+" 打开一个用于读/写的二进制文件 fclose():关闭文件资源 一、按字符:其实就是从文件中一个个读出字符出来 头文件: #include<stdio.h> #include<stdlib.h> #include <string.h> 函数原型: void writeFile(char *fileRealName, char *writeStr); //将一个字符串写入某个文件中 实现方法: void readFile(char *fileRealName){ FILE *pf = NULL; pf = fopen(fileRealName, "r+"); if(pf == NULL){ printf("文件不存在"); return; } while (!feof(pf)){ printf("%c", fgetc(pf)); } fclose(pf); } 测试写入文件: int main(){ writeFile("c:/1.txt", "fdweqfefwef"); system("pause"); return 0; } 运行结果:
测试读取文件: int main(){ readFile("c:/1.txt"); system("pause"); return 0; } 运行结果: 二、按行操作: 头文件跟上面一样 函数原型: void readLine(const char *fileRealName);// 读取一行 void writeLine(const char *fileRealName, const char *writeLine);写入一行 实现方法: void readLine(const char *fileRealName){ FILE *pf = NULL; char rl[1024]; char *p = NULL; pf = fopen(fileRealName, "r+"); if(pf == NULL){ printf("文件不存在"); return; } while(!feof(pf)){ p = fgets(rl, 1024, pf); if(p == NULL) goto end; printf("%s", rl); } end : fclose(pf); } void writeLine(const char *fileRealName, const char *writeLine){ FILE *pf = NULL; pf = fopen(fileRealName, "r+"); if(pf == NULL){ printf("文件不存在"); return; } fputs(writeLine, pf); fclose(pf); } 写入测试就不做了,跟字符操作一样 读取测试: 文本文档为: ggg int main(){ readLine("c:/1.txt"); system("pause"); return 0; } 运行结果: 三、按照内存块操作: 头文件一样,全局变量: typedef struct Teacher{ int id; char name[64]; }Teacher; 函数原型: void writeTeachers(const Teacher *ts, int len, char *fileRealName);//将数组写入二进制文件中 int readTeachers(Teacher **ts, char *fileRealName);//从二进制文件中读取数据并且创建一个数组来存储,返回值为数组的长度 实现方法: 1 void writeTeachers(const Teacher *ts, int len, char *fileRealName){ 2 3 FILE *pf; 4 int count, i; 5 6 pf = fopen(fileRealName, "wb"); //创建一个二进制文件 7 8 if(pf == NULL) 9 printf("open error!\n"); 10 11 for (i = 0; i < len; i++){ 12 count = fwrite(&(ts[i]), sizeof(Teacher), 1, pf); // fwrite()函数人参数分别是写入变量的地址,写入变量的大小,复制多少次(大于一次会顺序存储到该地址后面),文件句柄;返回值是复制成功的次数,如果成功则返回第三个参数的值,反之返回0 13 printf("%d\n", count); 14 } 15 16 fclose(pf); 17 } 18 /* 19 返回值是读取教师数组的元素个数,教师数组由函数分配内存 20 */ 21 int readTeachers(Teacher **ts, char *fileRealName){ 22 23 FILE *pf; 24 int count = 0 ,len = 0; 25 Teacher *temp = NULL; 26 Teacher *pt = NULL; 27 28 pf = fopen(fileRealName, "rb+");//打开一个二进制文件 29 30 if(pf == NULL) 31 printf("open error!\n"); 32 33 temp = (Teacher*)malloc(sizeof(Teacher)); 34 35 do{ 36 count = fread(temp, sizeof(Teacher), 1, pf); 37 len++; 38 }while(count != 0); 39 40 len--; //获得该文件存储的数组的长度 41 42 if(temp != NULL){ 43 free(temp); 44 temp = NULL; 45 } 46 47 rewind(pf);//将文件指针重新指向文件开头 48 pt = (Teacher *)malloc(sizeof(Teacher) * len); 49 50 for(count = 0; count < len; ++count){ 51 fread(&(pt[count]), sizeof(Teacher), 1, pf);//fread()函数跟fwrite函数极为类似,参照上面的注释 52 printf("第%d位教师 编号 %d 姓名 %s\n", count + 1, pt[count].id, pt[count].name); 53 } 54 55 fclose(pf); 56 *ts = pt; 57 return len; 58 } 59 60 void printTeacher(Teacher *ts, int len){ 61 62 int i; 63 64 for(i = 0; i < len; ++i){ 65 printf("第%d位教师 编号 %d 姓名 %s\n", i + 1, ts[i].id, ts[i].name); 66 } 67 } 测试写: int main(){ Teacher ts[3]; int i; for (i = 0; i < 3; i++){ ts[i].id = 1000 + i; sprintf(ts[i].name, "zhangsan%d", i + 1); } writeTeachers(ts, 3, "c:/2.data"); system("pause"); return 0; } 最终生成一个二进制文件
测试读: int main(){ Teacher *ts = NULL; int len = 0; len = readTeachers(&ts, "c:/2.data"); printTeacher(ts, len); if(ts != NULL){ free(ts); ts = NULL; } system("pause"); return 0; } 运行结果: |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论