C语言FILE详解(COME ON)

这篇具有很好参考价值的文章主要介绍了C语言FILE详解(COME ON)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🕺作者:迷茫的启明星
🎃相关文章:☞☞☞【从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写书的入馆信息文章来源地址https://www.toymoban.com/news/detail-444604.html

//fprintf() 成功返回写入的字符的个数,失败则返回负数。
//fscanf() 返回参数列表中被成功赋值的参数个数。
#define _CRT_SECURE_NO_DEPRECATE
//不声明可能会报错,无碍
#include<stdio.h>
#include <stdlib.h>
#define N 2

struct 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; i<N; i++,pa++){
        scanf("%s %d %d", pa->name, &pa->num, &pa->year);   
    }
    pa = booka;
    //将booka中的数据写入到文件
    for(i=0; i<N; i++,pa++){
        fprintf(fp,"%s %d %d\n", pa->name, pa->num, pa->year);   
    }
    //重置文件指针
    rewind(fp);
    //从文件中读取数据,保存到bookb
    for(i=0; i<N; i++,pb++){
        fscanf(fp, "%s %d %d\n", pb->name, &pb->num, &pb->year);
    }
    pb=bookb;
    //将bookb中的数据输出到显示器
    for(i=0; i<N; i++,pb++){
        printf("%s  %d  %d\n", pb->name, pb->num, pb->year);
    }

    fclose(fp);
    return 0;
}

到了这里,关于C语言FILE详解(COME ON)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL报错解决:Error writing file ‘/tmp/XXXX‘ (Errcode: 28 - No space left on device)

    执行sql报错如下: MySQL报错 “Error writing file ‘/tmp/XXXX‘ (Errcode: 28 - No space left on device)” 表明在写入文件时,临时目录(tmpdir) 的设备上没有足够的可用空间 ,可能会导致MySQL无法执行某些操作,如排序或临时表的创建 在MySQL 8中,默认的临时目录(tmpdir)路径取决于操作系

    2024年02月11日
    浏览(30)
  • Docker load镜像报错:UserError processing tar file(exit status 1): ......no space left on device

    原因: 空间不足,镜像打包成tar以后会压缩, docker load -i xxx .tar 时,若该路径磁盘空间不够则报错Error processing tar file(exit status 1): write /usr/local/cuda-10.2/targets/aarch64-linux/lib/libnvrtc.so.10.2.300: no space left on device。 解决方法: 给docker换位置! 1. 停止Docker服务  2. 修改Docker位置 3

    2024年02月06日
    浏览(28)
  • psql: error: connection to server on socket “/var/run/postgresql/.s.PGSQL.5432“ failed: No such file

    当我在linux debian版本安装postgres数据库遇到的问题: 帮我解决成功的方法如下:可以直接复制运行,需要看注释 步骤一: 步骤二: 注意这里的16是我postgres的版本,你要改成你对应的版本数字比如14就改成14,然后出现语言区域我一般默认直接回车 步骤三: 然后就成功了 引

    2024年02月02日
    浏览(35)
  • [Flink] Flink Job运行状态正常,但日志中偶报“FlinkException: The file LOG does not exist on the TaskExecutor.”

    Flink : 1.12 该报错主要是找不到 STDOUT 文件,原因是程序中没有 sout 输出,当你去 web-ui 点击 stdout 目录,就会报一个这儿样的接口请求错误,并不影响程序运行,可忽略。 方式1:不影响程序正常运行,忽略此ERROR即可 目前博主的做法 (经验证,确实不影响程序功能正常运行)

    2024年02月03日
    浏览(62)
  • Vivado IP核生成报错 [IP_Flow 19-3460] Validation failed on parameter ‘XML_INPUT_FILE(XML_INPUT_F

    昨天在使用·Vavido生成DDR3的IP核时,经历过痛苦的管脚绑定后,一路下一步,然后就爆了错误,[IP_Flow 19-3460] Validation failed on parameter \\\'XML_INPUT_FILE(XML_INPUT_F,开始我以为是我管脚绑定错了,就问了同事,同事说如果是管脚绑定错了,绑定完管脚后点下一步就会报错,所以排除,

    2024年02月13日
    浏览(35)
  • Bessie Come Home回家 NOIP题解

    Bessie Come Home 回家 (comehome.pas) 【问题描述】 现在是晚餐时间,而母牛们在外面分散的牧场中。农民约翰按响了电铃,所以她们开始向谷仓走去。你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。在挤奶的时候(晚餐前),每只母牛都在

    2024年02月11日
    浏览(44)
  • 迅为龙芯3A5000_7A2000COMe_模块和主板

    龙芯 3A5000+7A2000 COME 采用全国产龙芯 3A5000 处理器,基于龙芯自主指令系统 (LoongArche)的 LA464 微结构,并进一步提升频率,降低功耗,优化性能。桥片采用龙芯 7A2000,支持 PCIE 3.0、USB 3.0 和 SATA 3.0、显示接口 2 路、HDMI 和1 路 VGA,可直连显示器;另外内置一个网络 PHY,片内集成了

    2024年02月15日
    浏览(28)
  • [洛谷]P1529 [USACO2.4] 回家 Bessie Come Home

    最多52(a-z,A-Z)个点,所用有请 floyd !!! 代码看一遍就很好理解做法啦 over~

    2024年02月15日
    浏览(33)
  • 一文详解docker中的depends-on用法

    Docker 的 depends-on 指令用于指定一个容器依赖于另一个容器。当 depends-on 指令被使用时,Docker 将不会启动依赖的容器,直到被依赖的容器启动并运行成功。 在Docker Compose文件中,可以使用“depends-on”来定义服务之间的依赖关系。它的语法如下: 在上面的示例中,“se

    2024年03月12日
    浏览(31)
  • MySQL的insert-on-duplicate语句详解

    注意:ON DUPLICATE KEY UPDATE只是 MySQL的特有语法,并不是SQL标准语法! INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候,如果insert的数据会引起唯一索引(包括主键索引)的冲突,即唯一值重复了,则不会执行

    2024年04月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包