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#include#include
函数原型:
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!\\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;
}
运行结果:
来源:博客园