当前位置: 首页 > news >正文

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

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

  • 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;     //连到该文件的硬连接数目,刚建立的文件值为1uid_t         st_uid;         //用户IDgid_t         st_gid;         //组IDdev_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

相关文章:

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

一、设备文件&#xff08;运行程序时会默认打开这三个设备文件&#xff09; stdin&#xff1a;标准输入&#xff0c;默认为当前终端&#xff08;键盘&#xff09;&#xff0c;我们使用的scanf、getchar函数默认从此终端获得数据。stdout&#xff1a; 标准输出&#xff0c;默认…...

一款SAST工具需要支持多少种编译器呢?

除了Java语言&#xff0c;C#语言之外&#xff0c;C、C语言是编译器类型最多的编程语言&#xff0c;有几十种编译器&#xff0c;这些编译器方言为研发SAST工具带来了巨大的工作量&#xff0c;很多产品由于无法适配客户的编译器&#xff0c;导致无法检测。下面我们罗列一下国外和…...

jvm mat分析dump文件

jvm调优中&#xff0c;经常使用dump来分析是否存在大对象导致频繁full gc&#xff0c;以下为使用步骤&#xff1a; 一、获得服务进程 ps -ef | grep list-app | grep -v grep 二、生成dump文件 jmap -dump:formatb,filexxx.dump pid jmap -dump:filetest.hprof,formatb 3307…...

python16行代码获取原神全角色+全语音

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本来是不玩原神的&#xff0c;但是实在是经不住双重诱惑呀~ 毕竟谁能拒绝角色风景超级好看又可以爬树、炸鱼、壶里造房子、抓小动物、躲猫猫的游戏捏~ 今天点进官网~角色得配音让我沉陷其中&#xff0c;于是 我决定把他们爬…...

链接投票二维码制作制作投票链接视频选举投票制作

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。我们现在要以“信赖挚友”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星投票”…...

HTTP 协议

HTTP&#xff08;hypertext transport Protocol&#xff09;&#xff1b;超文本传输协议&#xff0c;是浏览器与万维网服务器之间通信的规则。 规定了客户端与服务端之间互相发送内容的格式&#xff0c;客户端发给服务端的叫 请求协议&#xff0c;服务端返回给客户端的为 响应…...

公司新招了个人,一副毛头小子的样儿,哪想到是新一代卷王····

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是…...

TSDF学习记录

【唐宇迪】三维重建-TSDF通俗解读 人工智能入门教程 水泡动画模拟&#xff08;Marching Cubes&#xff09; - 算法小丑 - 博客园 (cnblogs.com) TSDF 流程分析 首先需要构建一大块空区域采用体素网格来存储该区域需要计算每个体素的TSDF值及其权重 原理简述 SDF值&#x…...

【Linux】孤儿进程

在Linux中&#xff0c;如果子进程运行时&#xff0c;父进程因为某些原因先行终止&#xff0c;就称该子进程为孤儿进程。 我们编写如下代码&#xff1a; 子进程一直在运行&#xff0c;父进程运行一段时间后自动终止。运行该程序观察现象&#xff1a; 最开始时&#xff0c;子进程…...

ChatGPT解答:python大批量读写ini文件时,性能很低,有什么解决方法吗,给出具体的思路和实例

ChatGPT解答&#xff1a; python大批量读写ini文件时&#xff0c;性能很低&#xff0c;有什么解决方法吗&#xff0c;给出具体的思路和实例 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). python大批量读写ini文件时&#xff0c;性能很低&#xff0c;有什么解决方法吗&…...

MySql主键id不推荐使用UUID

前言 昨天在某个技术群中&#xff0c;有个老哥发送了一个技术视频&#xff1a;讲的是一个毕业生面试被问&#xff0c;前后端的交互ID是使用自增的吗&#xff1f;为什么不使用UUID&#xff1f;最后的解释是说性能问题&#xff0c;这个引起了我的兴趣&#xff0c;查了一下资料总…...

密码算法(SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算)

文章目录SM1 对称密码SM2 椭圆曲线公钥密码算法SM3 杂凑算法SM4 对称算法同态加密密态计算和隐私计算安全多方计算技术安全多方计算的应用场景对称加密算法非对称加密算法&#xff08;公钥加密&#xff09;参考文章SM1、SM2、SM3和SM4 为了保障商用密码的安全性&#xff0c;国家…...

保险行业中【内容行政系统】模块功能的实现

以下是一个基本的保险行业中的内容行政系统功能模块&#xff0c;包括对保单、理赔等方面的处理&#xff1a; 创建保单表创建理赔表创建保单查询视图创建理赔查询视图创建新保单更新保单状态创建理赔更新理赔状态-- 创建保单表 CREATE TABLE policies ( policy_id NUMBER PRIM…...

C语言入门知识——(7)VS2022的C语言基础调试

1、什么是bug 这个故事很多人都知道 1947年9月9日&#xff1a;第一个“Bug”被发现的时候&#xff1a;“1949年9月9日&#xff0c;我们晚上调试机器的时候&#xff0c;开着的窗户没有纱窗&#xff0c;机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了&#xff0c;…...

数据库可视化开发工具内容介绍

在现代化办公环境中&#xff0c;数据管理的重要性不言而喻。对于企业来说&#xff0c;将企业内部的数据做好规划和管理&#xff0c;可以给企业提升办公协作效率&#xff0c;为企业高层做出正确的经营决策奠定基础。本文主要给大家介绍的是数据化可视化开发工具的内容&#xff0…...

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

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

【云原生】K8S中PV和PVC

前言 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。…...

24小时稳定性爆肝测试!国内外5款远程控制软件大盘点

本文目录前言一、ToDesk远程控制二、向日葵远程控制三、RayLink四、TeamViewer五、AnyDesk总结前言 不论你的职业是什么&#xff0c;从事互联网工作基本就离不开远程&#xff0c;从远程安装系统到远程搞设计&#xff0c;再到做服务器的调控&#xff0c;都需要靠远程来协助完成…...

【Java集合框架】篇三:List接口

1. List接口及主要实现类特点 List&#xff1a;有序、可重复&#xff08;“动态”数组&#xff09;&#xff1b;因而常常使用List替换数组&#xff0c;因为List 的容量是动态的。 ArrayList&#xff1a;底层使用Object[]存储 线程不安全&#xff0c;添加、查找效率高 LinkedL…...

【算法经典题集】二分(持续更新~~~)

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;算法经典题集&#x1f50a;本专栏涉及到的知识点或者题目是算法专栏的补充与应用&#x1f4aa;种一棵树最好是十年前其次是现在二分整数二分机器人…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...