「C/C++」 标准文件操作大全

news2024/11/24 16:59:15

一、设备文件(运行程序时会默认打开这三个设备文件)

  • stdin:标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
  • stdout: 标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
  • stderr:标准错误,默认为当前终端(屏幕),我们使用的perror函数默认输出信息到此终端

二、文件操作函数

1、perror(char strMsg):打印出错信息,参数是自己加的注释,为字符串类型

2、 FILE *fopen(const char*fileName,const char*mode)

  • 返回一个文件指针,并且打开路径为fileName的文件。失败返回NULL

  • FILE *p = fopen("D:\\Windows_lib\\Desktop\\test.txt", "a");
    if (p) {
        cout << "file open success"<<endl;
        cout<<fputc('c', p);
    } else {
        perror("fail to open file:");
    }
    fclose(fp);
    
打开模式(mode)含义
r或rb以只读方式打开一个文本文件(不创建文件,若文件不存在则报错)
w或wb以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a或ab以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件
r+或rb+以可读、可写的方式打开文件(不创建新文件)
w+或wb+以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a+或ab+以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件

3、int fclose(FILE * stream)

  • 关闭文件,参数是要关闭的文件流指针

三、操作文件

1、int feof(FILE*stream)

  • EOF表示文件结束符(end of file),EOF是等于-1的

  • 检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)

  • while (!feof(fp)) //文件没有结束,则执行循环
    {
    	char ch = fgetc(fp);
    	printf("%c", ch);
    }
    fclose(fp);
    

2、int fputc(int ch , FILE* stream)

  • 将ch转换为unsigned char后写入stream指定的文件中

  • ch是需要写入文件的字符。

  • 成功返回写入文件的字符,失败返回-1

  • FILE *p = fopen("D:\\Windows_lib\\Desktop\\test.txt", "a");
    fputc('c', p);
    fclose(fp);
    

3、int fgetc(FILE *stream)

  • 从stream指定的文件中读取一个字符

  • 成功返回读取的字符,失败返回-1

  • FILE *p = fopen("D:\\Windows_lib\\Desktop\\test.txt", "r");
    cout<<(char)fgetc(p);
    fclose(fp);
    

4、int fputs(const char*str,FILE*stream)

  • 将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件

  • 成功返回0,失败返回-1

  • FILE *p = fopen("D:\\Windows_lib\\Desktop\\test.txt", "a");
    cout<<fputs("\nthis is a msg\n", p);
    fclose(fp);
    

5、char *fgets(char *str,int size,FILE*stream)

  • 从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 ‘\0’ 作为字符串结束。通常用返回值判别是否读取完毕

  • 成功返回读取的字符串,读到文件为或出错返回NULL

  • 若要读取全部的文件内容,一般搭配while循环一直读取,直到返回NULL表明读取到了文件末尾

  • FILE *p = fopen("D:\\Windows_lib\\Desktop\\test.txt", "r");
    char buf[1024];
    if (p) {
        auto q = fgets(buf, sizeof buf, p);
        if(!q) cout<<"读取完毕";
        cout<<buf;
    }
    fclose(fp);
    

四、格式化文件操作

1、int fprintf(FILE *stream,const char *format,数据)

  • 根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ‘\0’ 为止。

  • 类似sprintf,sscanf,将格式写入文件里

  • 成功返回实际写入文件的字符个数,失败返回-1

  • int year=2023;
    int month=3;
    int day = 3;
    FILE *fp = fopen("D:\\Windows_lib\\Desktop\\test.txt", "a");
    if (fp) {
        int t = fprintf(fp, "year:%d,month:%d,day:%d", year, month, day);
        if(t!=-1) puts("write successfully!");
    }
    fclose(fp);
    

2、int fscanf(FILE *stream,const char *format,数据)

  • 从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。

  • 类似sscanf,sprintf,将格式读取出来

  • 成功则返回参数个数,失败返回-1

  • int year, month, day;
    FILE *fp = fopen("D:\\Windows_lib\\Desktop\\test.txt", "r");
    if (fp) {
        int t = fscanf(fp, "%d %d %d", &year, &month, &day);
        if(t!=-1) puts("read successfully!");
        cout<<year<<" "<<month<<" "<<day<<endl;
    }
    fclose(fp);
    

五、按照块读写文件

1、size_t fwrite(const void *ptr,size_t nmemb,size_t count,FILE *stream)

  • 以数据块的方式给文件写入内容

  • ptr:准备写入文件数据的地址

  • nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb

  • count: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小

  • 成功返回实际写入文件数据的字节数,和count值相等。失败返回0

  • typedef struct {
        char id;
        char age;
        char name[20];
    } STD;
    
    STD xx = {'1', '2', "ssxaxas"};
    
    FILE *fp = fopen("D:\\Windows_lib\\Desktop\\test.txt", "w");//"w"会清空文件,无法撤回
    
    if (fp) {
        int t = fwrite(&xx, 1, sizeof xx, fp);
        puts("Yes!");
      cout << t << endl;
    }
    fclose(fp);
    

2、size_t fread(void *ptr,size_t nmemb,size_t count,FILE *stream)

  • 以数据块的方式从文件中读取内容

  • ptr:存放读取出来数据的内存空间

  • size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小

  • nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb

  • typedef struct {
        char id;
        char age;
        char name[20];
    } STD;
    
    STD xx = {'1', '2', "ssxaxas"};
    
    FILE *fp = fopen("D:\\Windows_lib\\Desktop\\test.txt", "r");
    if (fp) {
        int t = fread(&xx, 1, sizeof xx, fp);
        puts("Yes!");
        cout << xx.age << endl;
    } 
    fclose(fp);
    

六、文件的随机读写

1、int fseek(FILE *stream,long offset, int whence)

  • 移动文件流(文件光标)的读写位置。

  • offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。

  • whence:其取值如下:

    ​ SEEK_SET:从文件开头移动offset个字节

    ​ SEEK_CUR:从当前位置移动offset个字节

    ​ SEEK_END:从文件末尾移动offset个字节

  • FILE *fp = fopen("D:\\Windows_lib\\Desktop\\test.txt", "a");
    if (fp) {
        fputs("hello,world!",fp);
        fseek(fp,0,SEEK_SET);
        fputs("use_fseek-->",fp);
        // fp的内容应该是 use_fseek-->hello,world!
        puts("Yes!");
    }
    fclose(fp);
    

2、long ftell(FILE *stream)

  • 获取文件流(文件光标)的读写位置。一般用来测光标在文件的偏移位置
  • 成功返回当前文件流,文件光标的位置。失败返回-1

3、void rewind(FILE *stream)

  • 把文件流(文件光标)的读写位置移动到文件开头。

4、int stat(const char *path,struct stat *buf)

  • 获取文件状态信息

  • path:文件名

  • buf:保存文件信息的结构体,stat结构体如下,所需头文件如下

  • 成功返回0,失败返回-1

  • struct stat {
    	dev_t         st_dev;         //文件的设备编号
    	ino_t         st_ino;          //节点
    	mode_t        st_mode;   //文件的类型和存取的权限
    	nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    	uid_t         st_uid;         //用户ID
    	gid_t         st_gid;         //组ID
    	dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    	off_t         st_size;        //文件字节数(文件大小)
    	unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    	unsigned long st_blocks;    //块数
    	time_t        st_atime;     //最后一次访问时间
    	time_t        st_mtime;    //最后一次修改时间
    	time_t        st_ctime;     //最后一次改变时间(指属性)
    };  
    
  • #include <sys/types.h>	// 所包含的头文件
    #include <sys/stat.h>
    
    struct stat buf;	// 定义一个结构体对象来接受信息
    
    int ret = stat("D:\\Windows_lib\\Desktop\\test.txt", &buf);
    
    if (ret == -1)
        puts("file not found!");
    else cout<<buf.st_size<<endl;	// 打印目标文件的字节数
    

七、文件的修改操作(均需要自己添上后缀名)

1、int remove(const char *pathname);

  • 删除路径为pathname的文件
  • 成功返回0,失败返回-1

2、int rename(const char *oldPath,const char *newPath)

  • 把oldpath的文件名改为newpath
  • 成功返回0,失败返回-1

八、Windows和Linux文本文件的区别

  • b是二进制模式的意思,b只是在Windows有效,在Linux用r和rb的结果是一样的

  • Unix和Linux下所有的文本文件行都是\n结尾,而Windows所有的文本文件行都是\r\n结尾

  • 在Windows平台下,以“文本”方式打开文件,不加b:

  • 当读取文件的时候,系统会将所有的 “\r\n” 转换成 “\n”

  • 当写入文件的时候,系统会将 “\n” 转换成 “\r\n” 写入

  • 以"二进制"方式打开文件,则读\写都不会进行这样的转换

  • 在Unix/Linux平台下,“文本”与“二进制”模式没有区别,“\r\n” 作为两个字符原样输入输出

九、文件缓冲区

ANSI C标准采用“缓冲文件系统”处理数据文件。

所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。

如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量) 。

请添加图片描述

  • 磁盘文件,一般保存在硬盘、U盘等掉电不丢失的磁盘设备中,在需要时调入内存

  • 在内存中对文件进行编辑处理后,保存到磁盘中

  • 程序与磁盘之间交互,不是立即完成,系统或程序可根据需要设置缓冲区,以提高存取效率

1、刷新缓冲区的3中方法

  • 缓冲区满
  • fflush函数强制刷新
  • 程序正常退出

2、int fflush(FILE *stream)

  • 更新缓冲区,让缓冲区的数据立马写到文件中。
  • 成功返回0,失败返回-1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当你问ChatGPT一些奇奇怪怪的问题

ChatGPT热度好像已经没那么高了&#xff0c;貌似也蹭不到什么流量了&#xff0c;不过嘛&#xff0c;玩了一下好玩的还是得记录一下。每个问题用标题给出&#xff0c;就可以当目录了。同时附上截图&#xff0c;想直接看图的伙伴可以直接看图。回答以绿色背景的形式给出。 觉得有…

坚如磐石:TiDB 基于时间点的恢复(PiTR)特性优化之路丨6.5 新特性解析

本文介绍了 TiDB 数据库的基于时间点的恢复&#xff08;PiTR&#xff09;特性&#xff0c;该特性允许用户将数据库恢复到特定时间点&#xff0c;从而避免丢失重要数据。文章首先介绍了 PiTR 技术的基本概念和工作原理&#xff0c;接着探讨了 TiDB 对 PiTR 的优化&#xff0c;包…

Java多线程(二)——同步

这一节主要是继上次提到的线程同步三大方法&#xff1a;同步代码块、同步方法、Lock锁。同步代码块&#xff0c;把出现线程安全问题的核心代码给上锁。还是继上次的例子&#xff0c;对代码块加上synchronized ("getMoney") {}之后就不会出现线程安全问题了&#xff1…

文科女生月入14k背后:转行IT软件测试不是谁都学得来!

转行软件测试背后&#xff0c;或许每个人都有自己的无奈。就拿今天要和大家分享的这位小姐姐来说吧&#xff0c;如果不是万不得已&#xff0c;又怎么会狠下心来转行到IT互联网&#xff1f; 应届生逃避就业&#xff0c;考研失败 和大多数人一样&#xff0c;小姐姐的大学生活过得…

SpringBoot入门 - 添加内存数据库H2

上文我们展示了通过学习经典的MVC分包结构展示了一个用户的增删查改项目&#xff0c;但是我们没有接入数据库&#xff1b;本文将在上文的基础上&#xff0c;增加一个H2内存数据库&#xff0c;并且通过Spring 提供的数据访问包JPA进行数据查询。准备知识点在介绍通过Spring JPA接…

专访华西二院吴邦华:隐私计算+AI全栈技术,构筑智慧医院建设的坚实数据底座|爱分析访谈

从IT时代步入DT时代&#xff0c;医疗大数据成为智慧医院建设的重要驱动力。经过多年信息化系统建设&#xff0c;很多医院已经积累了大量的医疗数据资源&#xff0c;但由于各业务系统间数据孤岛化严重、系统架构落后、数据缺乏深度治理等问题存在&#xff0c;导致现有数据深度及…

springsecurity中的类

Authentication AuthenticationProvider 每一个AuthenticationProvider对应一个Authentication 很多个AuthenticationProvider 由一个 ProviderManager管理 ProviderManager implements AuthenticationManager 一个ProviderManager有很多个 AuthenticationProvider Usern…

EasyPoi的excel模板预览与下载、导出简单/复杂数据

官方文档地址&#xff1a;easypoi官网&#xff0c;官方仅供参考&#xff0c;部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中&#xff0c;如图 excel模板预览代码 GetMapping("excel")ApiOperation("excel预览")NoLogpubli…

多个关键字用or、and、包含、不包含动态拼接为正则表达式和SQL查询条件

目录前言校验思路1、存储方式2、实现图一实现图二实现结果最后前言 不知道大家有没有做过这种需求&#xff1a;在某字符串中&#xff0c;根据多个关键字去判断这串字符串是否满足条件。如下图&#xff1a; 亦或是 如果说要根据图二的关键字去数据库中查询符合条件的数据&a…

QT基础(18)- QAbstractSocket

QT基础&#xff08;18&#xff09;- QAbstractSocket1 创建简单的客户端2 QAbstractSocket2.1 简介2.2 枚举2.2.1 BingFlag2.2.2 NetworkLayerProtocol2.2.3 PauseMode2.2.4 SocketError2.2.5 SocketOption2.2.6 SocketType2.2.7 SocketState2.3 公有函数2.3.1 构造函数2.3.2 a…

文献阅读(47)—— 遗传数据研究近视和眼压与视网膜脱落的关系

文献阅读&#xff08;47&#xff09;—— 遗传数据研究近视和眼压与视网膜脱落的关系 文章目录文献阅读&#xff08;47&#xff09;—— 遗传数据研究近视和眼压与视网膜脱落的关系遗传数据研究近视和眼压与视网膜脱落的关系先验知识/知识拓展文章结构文章结果1. 视网膜脱落风险…

centos8安装docker运行java文件

本文由个人总结&#xff0c;如需转载使用请标明原著及原文地址 这里是基于我前一篇搭的centos8服务器做的&#xff0c;如果yum baseos源或appstream源有问题可以去看看前一篇 https://blog.csdn.net/qq_36911145/article/details/129263830 1.安装docker 1.1配置docker yum…

惠普战66pro如何选购内存条?一篇文章讲解清楚

笔记本&#xff1a;惠普 ZHAN66 PRO CPU&#xff1a;Intel Core™ i-8565U CPU 1.80GHz 内存条&#xff1a;Samsung PS: 如果有需要更换硬盘的可以看我之前发的文章&#xff0c;博主进行了长时间的测试。 硬盘选购长测评 文章目录前言一、内存是什么&#xff1f;二、如何操作呢…

错误:EfficientDet网络出现“No boxes to NMS“并且mAP:0.0的解决方案

近日&#xff0c;在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候&#xff0c;出现了如下错误&#xff1a; 其中项目开源地址是&#xff1a;https://github.com/toandaominh1997/EfficientDet.Pytorch 上面截图中的1和2代表我的类别名称。读者可…

【计算机二级python】综合题题目

计算机二级python真题 文章目录计算机二级python真题一、八十天环游世界二、八十天环游世界 问题一二、八十天环游世界 问题二一、八十天环游世界 附件中保存1个文本文件&#xff0c;分别对应2个问题‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬…

315线上知识竞赛答题活动方案及模板分享

315线上知识竞赛答题活动方案及模板分享在315国际消费者权益日来临之际&#xff0c; 很多单位推出有奖知识竞答&#xff0c; 希望大家在了解专业知识的同时&#xff0c; 还可以拿到自己喜欢的奖品&#xff01;这是消费者委员会和监管局联合举办的“315消费知识在线有奖竞答”活…

Springboot怎么集成Thymeleaf模板引擎?

Thymeleaf介绍Thymeleaf&#xff0c;是一个XML/XHTML/HTML模板引擎&#xff0c;开源的java库&#xff0c;可以用于SpingMVC项目中&#xff0c;用于代替JSP、FreeMarker或者其他的模板引擎&#xff1b;页面与数据分离&#xff0c;提高了开发效率&#xff0c;让代码重用更容易。S…

【JavaScript速成之路】JavaScript流程控制

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录前言1&#xff0c;流程控制2&#xff0c;分支结构2.1&#xff0c;if语句2.2&…

时机将至,名创优品或将再掀起一波消费热浪

北京时间2月28日&#xff0c;名创优品发布2023财年中报&#xff0c;财报显示&#xff0c;2023财年第二季度营收规模有所收窄&#xff0c;但净利润、毛利率、门店数量均实现了不错的增长&#xff0c;总体表现可圈可点。 &#xff08;资料来源&#xff1a;富途牛牛&#xff09; …

PIC单片机的快速代码生成和调试过程

1.相关工具说明&#xff1a;MCC ...................................Pic的代码模板软原始安装包&#xff1a;mcc-installer-5.2.2-windows.exeMPLAB X IDE ........................... 集成开发环境原始安装包&#xff1a;MPLABX-v6.00-windows-installer.exe编译环境&#x…