码迷,mamicode.com
首页 > Web开发 > 详细

c语言文件的基本操作

时间:2017-01-17 18:20:30      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:

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;

}

运行结果:

 

来源:博客园

c语言文件的基本操作

标签:

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
jiangjie190
加入时间:2016-02-19
  关注此人  发短消息
文章分类
jiangjie190”关注的人------(0
jiangjie190”的粉丝们------(1
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!