C语言-文件操作的函数

来源:互联网 发布:天网软件拖欠工资 编辑:程序博客网 时间:2024/06/07 19:51

如果把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和fwriteint 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;}





0 0