C语言-文件操作的函数

C语言提供了多种文件操作函数,包括fputc/fgetc用于读写字符,fputs/fgets用于读写字符串,fscanf/fprintf实现格式化读写,以及fwrite/fread用于数据块的读写。这些函数使得程序能将数据持久存储在磁盘上,便于后续处理。通过实例展示了如何使用这些函数进行文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果把C语言编写的程序在内存中运行的结果显示在控制台上,当程序执行结束时,内存中的数据会被清空,无法永久存储。所以C语言中定义了文件操作的函数,用来操作内存外部可以永久存储数据的介质(磁盘、闪盘等)。

对于操作不同长度的数据类型,C语言中定义了不同的文件操作函数。

1 读写一个字符的函数fputc()和fgetc();

fputc()格式:fputc(字符,文件指针);

fgetc()格式:fgetc(字符,文件指针);

通过fputc()或者fgetc()获取一个字符后,文件指针会自动移动到下一个写入或读取字符的位置。文件中数据结束的标志是宏定义的EOF,因此当从文件中读取字符时,可以通过判断读取的字符是否是EOF来作为文件是否读取结束的标志。

2 读写一个字符串函数fputs()和fgets();

fputs()格式:fputs(字符串,文件指针);

fgets()格式:fgets(存储首地址,读取长度,文件指针);

比如:

    <1>    FILE *fp = fopen("text.txt","w");

             fputs("I LOVE CHINA!",fp);//表示把字符串“I LOVE CHINA!”写入的文件text.txt中,其返回的是字符串长度,不包含字符‘\0’,这次返回的数字为13;

    <2> char name[20];

    int count = 10;

    fgets(name,count,fp);//从文件text.txt中读取长度为count的数据到字符数组name当中,其中count表示包含字符‘\0’的总长度,其读取的字符为count-1(9)个;

3 格式化读写函数fscanf()和fprintf();

fscanf()格式:fscanf(文件指针,格式控制字符串,变量列表);

fprintf()格式:fprintf(文件指针,格式控制字符串,变量列表);

通过格式化读写函数fscanf()和fprintf()可以把已有的数据按照自定义的方式存储到文件当中,如1#3,2#4等,这样可以让数据更具有可读性;

4 数据块的读写函数fwrite()和fread();

fwrite()格式:fwrite(要写入的数据首地址,数据块大小,数据块个数,文件指针);

fread()格式:fread(要读入的数据首地址,数据块大小,数据块个数,文件指针);

通过数据块读写函数fwrite()和fread()可以方便的存储和读取结构体变量;

关于文件操作函数的应用实例如下:

#include <stdio.h>
//记录从键盘录入的字符串
int main(int argc, const char * argv[]) {
    //定义变量
    int ch;
    //提示用户输入
    printf("请输入字符串:\n");
    //打开文件
    FILE *fp = fopen("test.txt", "w+");
    ch = getchar();
    int count = 0;
    while (ch != '\n') {
        //写入文件
        fputc(ch, fp);
        ch = getchar();
        count++;
    }
    printf("共输入%d个字符!\n",count);
    //读入文件
    rewind(fp);
    ch = fgetc(fp);
    count = 0;
    while (ch != EOF) {
        printf("%c",ch);
        ch = fgetc(fp);
        count++;
    }
    printf("共输出%d个字符\n",count);
    //关闭文件
    int f = fclose(fp);
    if (f == 0) {
        printf("文件关闭成功\n");
    };

    return 0;
}


#include <stdio.h>
//字符串的写入和读出
int main(int argc, const char * argv[]) {
    //打开文件
    FILE *fp = fopen("test1.txt", "r+");
    int count = 0;
    if (fp != NULL) {
        //写入字符串
        count = fputs("I LOVE CHINA!", fp);
        printf("写入%d个字符\n",count);
        //读取字符串
        char ch[100];
        rewind(fp);//文件指针返回文件首
        fgets(ch, count, fp);
        printf("读取字符串为:%s\n",ch);
    }
    //关闭文件
    fclose(fp);
    return 0;
}
#include <stdio.h>
//格式化输入函数
int main(int argc, const char * argv[]) {
    //打开文件
    FILE *fp = fopen("fprintf.txt", "w+");
    //格式化输入文件
    if (fp != NULL) {
        for (int i = 0; i < 10; i++) {
            fprintf(fp, "%d#%d\n",i,i+2);
        }
        printf("写入成功\n");
        rewind(fp);
        //格式化读取数据到数组
        int num[20];
        int j = 0;
        for (int i = 0; i < 10; i++) {
            fscanf(fp, "%d#%d",&num[j++],&num[j++]);
        }
        for (int j = 0; j < 20; j++) {
            printf("%d\t", num[j]);
        }
        printf("\n");
    }
    //关闭文件
    fclose(fp);
    return 0;
}

#include <stdio.h>
//从结构体信息的读取fread和fwrite
int main(int argc, const char * argv[]) {
    // 定义结构体及结构体数组
    struct student{
        char name[20];
        int age;
        float score;
    } stu[2] = {{"jiaxu",25,80.00f},{"liuye",25,75.3f}};
    //初始化结构体数组
    //打开文件
    FILE *fp = fopen("fstruct.data", "wb+");
    //循环写入结构体元素
    if (fp != NULL) {
        for (int i = 0; i < 2; i++) {
            fwrite(&stu[i], sizeof(struct student), 1, fp);
        }
        printf("写入成功\n");
        //定义结构体数组以接收读取的结构体成员
        struct student stu2[2];
        rewind(fp);
        for (int i = 0; i <2; i++) {
            fread(&stu2[i], sizeof(struct student), 1, fp);
        }
        printf("读取成功!\n");
        //打印新定义的结构体数组元素
        for (int i = 0; i < 2; i++) {
            printf("name:%s age:%d score:%.2f\n",stu2[i].name,stu2[i].age,stu2[i].score);
        }
    }
    //关闭文件
    fclose(fp);
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值