• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c语言文件的基本操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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!\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;
}

运行结果:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
再议C风格变量声明发布时间:2022-07-18
下一篇:
C#继承中访问修饰符的区别发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap