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); //读取文件
实现方法:
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
3456
zhang
张三
李四
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);//从二进制文件中读取数据并且创建一个数组来存储,返回值为数组的长度
void printTeacher(Teacher *ts, int len); //遍历数组
实现方法:
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! "); 10 11 for (i = 0; i < len; i++){ 12 count = fwrite(&(ts[i]), sizeof(Teacher), 1, pf); // fwrite()函数人参数分别是写入变量的地址,写入变量的大小,复制多少次(大于一次会顺序存储到该地址后面),文件句柄;返回值是复制成功的次数,如果成功则返回第三个参数的值,反之返回0 13 printf("%d ", 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! "); 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 ", 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 ", 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; }
运行结果: