C语言的文件操作函数

C语言文件操作

之前做过一个通讯录的小测试,就是创建联系人,其中联系人有姓名,年龄,电话号码等属性,然后把创建好的联系人存放到通讯录中。但是这些数据只有在程序运行起来的时才去添加,一旦程序结束就没有了,那么我们怎么把这些数据永久的保呢?这时候就要用到文件操作函数,将这些数据写入到磁盘中,这样即使程序结束,那些数据也存在我们的文件中

文件类型

根据数据的组织形式,数据文件被称为文本文件二进制文件。数据在内存中以二进制的形式存储,如果不加转换的输出到外村,就是二进制文件。如果要求在外存上以ASCII码形式存储,则需要在存储前转换,以ASCII字符形式存储的文件就是文本文件。

举个例子,假如我们要将整数10000以ASCII码的形式输出到磁盘中,则磁盘中占5个字节(即每一个字符一个字节),而二进制形式输出,只在磁盘上占4个字节。

1的ASCII码值是31,二进制表示为00110001,0的ASCII码值是30,二进制表示为00110000

在这里插入图片描述

文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果文件从磁盘向计算机读入数据,则从磁盘文件 中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。
在这里插入图片描述

文件指针

在缓冲文件系统中,关键的概念就是“文件类型指针”,每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态以及文件当前的位置等)。这些信息是保存在一个结构体变量中的。取名FILE

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节,一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE* pf; // 文件指针变量

定义的pf是一个指向文件的指针变量。通过这个指针可以访问指针所指向的文件信息区的信息。

文件的打开和关闭

文件在读写之前都应该先打开文件,使用借宿之后应该关闭文件。在C语言中,使用fopen来打开文件,使用fclose来关闭文件。

// filename是传入文件的路径,mode是文件的打开方式
FILE* fopen(const char* filename, const char* mode);
// 使用完文件之后就要将文件关闭
// stream是创建的文件指针变量
int fclose(FILE* stream);

文件的打开方式有以下几种

文件使用方法含义如果指定文件不存在
“r”(只读)为了读数据,打开一个已经存在的文本文件出错
“w“(只写)为了写数据,打开一个文本文件建立一个新的文件
”a”(追加)向文本文末尾添加数据出错
“rb”(只读)为了读数据,打开一个二进制文件出错
“wb”(只写)为了写数据,打开一个二进制文件建立一个新的文件
“ab“(追加)向一个二进制文件尾添加数据出错
”r+“(读写)为了读和写,打开一个文本文件出错
”w+“(读写)为了读和写,建一个新的文件建立一个新的文件
”a+“(读写)打开一个文件,在文件尾进行读写建立一个新的文件
”rb+“(读写)为了读和写,打开一个二进制文件出错
”wb+“(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
”ab+“(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

实例:

#include<stdlib.h>
#include<stdio.h>
int main(){
    FILE* pf = fopen("test.txt", "w"); // 以只写的形式打开文件
    if(pf != NULL){
   		fputs("")
        fclose(pf); // 关闭文件
    	pf = NULL; 
    }

    return 0;
}

文件的顺序读写

功能函数名适用
字符输入函数fgetc所用输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
个数化输出函数fprintf所有输出流
二进制输入函数fread文件
二进制输出函数fwrite文件

fgetc函数和fputc函数

#include<stdio.h>
#include<stdlib.h>
int main(){
    // 如果要将一个字符写入到文件中,使用fputc函数
    // int fputc(int c, FILE* stream);
    FILE* pf = fopen("test.txt", "w");
    if(pf != NULL){
        fputc('a', pf);
    	fclose(pf); // 使用完文件,关闭
    	pf  = NULL}
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main(){
    // 如果要将一个字符从文件中读取到内存中,使用fgetc函数
    // int fgetc(FILE* stream);
    FILE* pf = fopen("test.txt", "r"); // 以只读的形式打开文件
    if(pf != NULL){
        fgetc(pf); // 从pf所指向的文件中读一个字符到内存
        fclose(pf);
        pf = NULL;
    }
}

fgets函数和fputs函数

#include<stdio.h>
#inlcude<stdlib.h>
int main(){
    // 在我们要将数据写入到文件时,使用fputs函数
    //int fputs(const char* string, FILE* stream);
    // 如果写入失败就返回EOF
    FILE* pf = fopen("test.txt", "w"); // 因为我们要把数据写入到文件,所以以”w“格式打开文件
    if(pf != NULL){
        fputs("hello\n", pf);
        fclose(pf); // 使用结束就关闭文件
        pf = NULL;
    }
    return 0;
}
#include<stdio.h>
#inlcude<stdlib.h>
int main(){
    // 当我们想从文件中将数据读到内存中时,使用fgets函数
    // 从文件中读取n个字符到string中,改函数最多读取一行,不会换行
    // char* fgets(char* string, int n, FILE* stream);
    char buff[1024] = {0};
    FILE* pf = fopen("test.txt", "r");  // 以只读的形式打开文件,打开失败返回NULL
    if(pf != NULL){
        fgets(buff, 3, pf);
        fclose(pf);
        pf = NULL;
    }
    printf("%s\n", buff); // 打印出从文件中读取的字符串
    return 0;
}

fscanf函数和fprintf函数

#include<stdio.h>
#include<stdlib.h>
typedef struct student{
    char name[20];
    int age;
    char id[10];
}student;

int main(){
    // 格式化的将数据写入文件中,使用fprintf函数
    //int fprintf(FILE* stream, const char* format, argument...);
    // fprintf函数和printf函数很像,只是fprintf函数要多一个参数,就是文件指针,这个函数的作用是将数据按照format的格式写入到文件中
    student stu = {"zhangsan", 18, "2021520412"}; 
    FILE* pf = fopen("text.txt", "w");
    if(pf != NULL){
        fprintf(pf, "%s %d %s", stu.name, stu.age, stu.id);
        fclose(pf);
        pf = NULL;
    }
}
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
    char name[20];
    int age;
    char  id[10];
}

int main(){
    // 格式化的将数据从文件读取到内存中,使用fscanf函数
    // int fscanf(FILE* stream, const char* format, argument...);
    sutdent stu = {0};
    FILE* pf  = fopen("test.txt", "r");
    if(pf != NULL){
        fscanf(pf, "%s %d %s", stu.name, &(stu.age), stu.id);
        fclose(pf);
        pf = NULL;
    }
    return 0;
}

fread函数和fwrite函数

#include<stdio.h>
#include<stdlib.h>
int main(){
    // fwrite函数的作用是将内存中的数据以二进制格式写入到文件中
    // size_t fwrite(const void* buffer, size_t size, size_t count,FILE* stream);
    FILE* pf = fopen("test.txt","wb"); // 以只写的方式打开二进制格式文件
    if(pf != NULL){
        fwrite("hello", sizeof(char), 5, pf);
        // 上面这行代码的意思是,从字符串中读取5个大小为char的字符到文件中
        fclose(pf);
        pf = NULL;
    }
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main(){
    // fread函数的作用是从文件中以二进制的格式将数据读取到内存中
    // size_t fread(void* buffer, size_t size, size_t count, FILE* stream);
    char buff[1024] = {0};
    FILE* pf = fopen("test.txt", "rb");
    if(pf != NULL){
        fread(buff, sizeof(char), 5, pf);// 从文件中读取5个大小为char的数据到buff中
        fclose(pf);
        pf = NULL;
    }
    return 0;
}

sscanf函数和sprintf函数

我们可能有时候回想把一个结构的内容转换成字符串的形式,这样方便我们打印结构的内容。sprintf函数的作用就是将数据格式化的转换成字符串。而sscanf函数则是从字符串中格式化的提取出数据。

#include<stdio.h>
#include<stdlib.h>

typedef struct student{
    char name[20];
    int age;
    char id[20];
}student;

int main(){
    // 将结构的数据转换成字符串使用sprintf函数
    // int sprintf(char* buffer, const char* format, argument);
    student stu = {"zhangsan", 18, "2021520412"};
    char* buff[100] = {0};
    sprintf(buff, "%s %d %s", stu.name, stu.age, stu.id);
    printf("%s", buff);  // 这样就可以以字符串的格式打印出数据
    // 从字符串中提取出格式化的数据
    // int sscanf(char* buff, const char* format, argument);
    sscanf(buff, "%s %d %s", stu.name, stu.age, stu.id);
    return 0;
}

文件的随机读写

文件的随机读写并不是说随机从文件的一个位置开始去读,读到什么完全看脸,不是这样的。它的意思是不从文件的起始位置开始读,从你指定的位置开始读数据。

fseek函数

fseek函数的作用是根据文件指针的位置和偏移量来定位文件指针

fseek函数对于形参origin有一下几个值

SEEK_CUR:文件指针的当前位置

SEEK_END:文件的末尾位置

SEEK_SET:文件的开始位置

int fseek(FILE* stream, long int offset, int origin);

例子:

#include<stdio.h>
int main(){
    FILE* pf = fopen("test.txt", "wb");
    fputs("this is an apple", pf);
    fseek(pf,9,  SEEK_SET); // 定位到文件指针偏移9的位置
    fputs("sum", pf);
    // rewind函数让文件指针的位置回到文件的起始位置
    fclose(pf);
    pf = NULL;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_yiyi_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值