作者:迷茫的启明星
相关文章:☞☞☞【从0到1之C语言FILE】(后来写的可以相互补充)
分享喜欢的一句话:心如花木,向阳而生

目录

一,前言

二,基础知识

FILE结构

FILE文件操作

一,操作文件

1.fopen函数

打开文件的方式:

2.fclose函数

二,读写文件

1.fgets函数

2.fputs函数

3.fread函数

4.fwrite函数

5.fprintf函数

6.fscanf函数


一,前言

孔子曰:“学而不思则惘,思而不学则殆。”现将所了解的C语言FILE相关操作·知识汇总如下,请多多指教!

二,基础知识

FILE结构

struct _iobuf {        char *_ptr;// 文件输入的下一个位置        int   _cnt;// 当前缓冲区位置        char *_base;// 文件起始位置        int   _flag;// 文件标志        int   _file;// 文件有效性验证        int   _charbuf;// 当前缓冲区状况        int   _bufsiz;// 缓冲区大小        char *_tmpfname;// 临时文件名        };typedef struct _iobuf FILE;     //别名FILE,可以直接用

FILE文件操作

一,操作文件

1.fopen函数

打开数据文件

fopen(_In_z_ char const* _FileName,_In_z_ char const* _Mode);

即fopen(需要打开文件的文件名,打开文件的方式)

需要打开文件的文件名:

需要和exe文件在同一目录下,或者写出相对路径或绝对路径

打开文件的方式:

1.“r” 以"读"的方式打开一个文本文件(只能读)。2.“r+” 在"r"的基础下增加了"写"。3.“rb” 以"读"的方式打开一个二进制文件(只能读)。4.“rb+” 在"rb"的基础下增加了"写"。5.“w” 以"写"的方式创建一个文本文件,如果这个文件已经存在,就会覆盖原来的文件。6.“w+” 在"w"的基础下增加了"读"。7.“wb” 以"写"的方式创建一个二进制文件。8.“wb+” 在"wb"的基础下增加了"读"。9.“a” 以"尾部追加"的方式打开一个文本文件(只能写)。10.“a+” 在"a"的基础下增加了"读"。11.“ab” 以"尾部追加"的方式打开一个二进制文件(只能写)。12.“ab+” 在"ab"的基础下增加了"读"。

2.fclose函数

在文件操作完成后需将文件关闭

fclose(_Inout_ FILE* _Stream);

即fclose(文件名)

二,读写文件

1.fgets函数

按规则读取文件

// 成功返回缓冲区指针,失败返回 NULL。fgets(        _Out_writes_z_(_MaxCount) char* _Buffer,        //接收文件内容的缓冲区指针            _In_                      int   _MaxCount,        //读取的字节数        _Inout_                   FILE* _Stream        //文件对象指针        );

示例:

拓展:可以以多少字节为一行读取

FILE* f = fopen("Hello.txt", "r");    char buf[2048];    while (fgets(buf, 2, f)) {//buf[2048]即每行不超过2048个字节,2表示每次只读2个字节,f为文件指针        cout << buf << endl;    }

2.fputs函数

将字符串写入文件

// 成功返回非负值,失败返回 EOF(-1)fputs(        _In_z_  char const* _Buffer,// 要写入的字符串        _Inout_ FILE*       _Stream // 指向 FILE 对象的指针        );

示例:

FILE* f = fopen("Hello.txt", "r+");fputs("what do you mean?",f);

3.fread函数

fread(        _Out_writes_bytes_(_ElementSize * _ElementCount) void*  _Buffer,        //读取的数据存放的内存的指针        _In_                                             size_t _ElementSize,        //每次读取的字节数          _In_                                             size_t _ElementCount,        //读取次数          _Inout_                                          FILE*  _Stream        //要读取的文件的指针        );

4.fwrite函数

fwrite(        _In_reads_bytes_(_ElementSize * _ElementCount) void const* _Buffer,        //要输出数据的地址        _In_                                           size_t      _ElementSize,        //每次写入的字节数        _In_                                           size_t      _ElementCount,        //写入次数        _Inout_                                        FILE*       _Stream        //目标文件指针        );

示例:

typedef struct book {    char name[20];    char author[20];};int main(){book a;FILE* f;f = fopen("Hello.txt", "a");fread(&a,sizeof(struct book), 1, f);cin >> a.name >> a.author;fwrite(&a, sizeof(struct book), 1, f);fclose(f);}

5.fprintf函数

fprintf(        _Inout_                       FILE*       const _Stream,        //文件指针        _In_z_ _Printf_format_string_ char const* const _Format,        //要写入的字符串        ...)

6.fscanf函数

fscanf(        _Inout_                      FILE*       const _Stream,        //文件指针        _In_z_ _Scanf_format_string_ char const* const _Format,        //读取字符串        ...)

示例:通过fprint,fscanf写书的入馆信息

//fprintf() 成功返回写入的字符的个数,失败则返回负数。//fscanf() 返回参数列表中被成功赋值的参数个数。#define _CRT_SECURE_NO_DEPRECATE//不声明可能会报错,无碍#include#include #define N 2struct book{    char name[10];    int num;    int year;} booka[N], bookb[N], *pa, *pb;int main(){    FILE *fp;    int i;    pa=booka;    pb=bookb;    if( (fp=fopen("D:\\Hello.txt","wt+")) == NULL ){        puts("Fail to open file!");        exit(0);    }    //从键盘读入数据,保存到booka    printf("输入数据:书名,数量,入馆年份:\n");    for(i=0; iname, &pa->num, &pa->year);       }    pa = booka;    //将booka中的数据写入到文件    for(i=0; iname, pa->num, pa->year);       }    //重置文件指针    rewind(fp);    //从文件中读取数据,保存到bookb    for(i=0; iname, &pb->num, &pb->year);    }    pb=bookb;    //将bookb中的数据输出到显示器    for(i=0; iname, pb->num, pb->year);    }    fclose(fp);    return 0;}