实用指南:LV.5 文件IO

news/2025/11/27 20:12:11/文章来源:https://www.cnblogs.com/tlnshuju/p/19279306

实用指南:LV.5 文件IO

2025-11-27 20:06  tlnshuju  阅读(0)  评论(0)    收藏  举报

1 标准IO介绍及缓冲区

1.1 标准IO介绍

1.1.1文件基础

概念:
一组相关数据的有序集合

文件类型:

  • 常规文件 r
  • 目录文件 d
  • 字符设备文件 c
  • 块设备文件 b :U盘 flash块存储
  • 管道文件 p
  • 套接字文件 s
  • 符号链接文件 l

1.1.2 系统调用和库函数

  • 系统调用就是操作系统提供的接口函数.
  • 如果我们把系统调用封装成库函数就可以起到隔离的作用,提供程序的可移植性。
  • printf就是库函数然后调用了系统调用才在显示器上显示字符。
    在这里插入图片描述

1.1.3 标准I/O

标准I/O由ANSI C标准定义

主流操作系统上都实现了C库

标准I/O通过缓冲机制减少系统调用,实现更高的效率

1.1.3.1 标准I/O-流

FILE
标准IO用一个结构体类型来存放打开的文件的相关信息
标准I/O的所有操作都是围绕FILE来进行

流(stream)
FILE又被称为流(stream)
文本流/二进制流

1.1.3.2 标准I/O-文本流、二进制流

Windows

二进制流: 换行符 ‘\n’

文本流: 换行符 ‘\r’ ‘\n’

Linux

换行符 ‘\n’

1.1.3.3 标准I/O – 流的缓冲类型

全缓冲
当流的缓冲区无数据或无空间时才执行实际I/O操作
行缓冲
当在输入和输出中遇到换行符(‘\n’)时,进行I/O操作
当流和一个终端关联时,典型的行缓冲
无缓冲
数据直接写入文件,流不进行缓冲

1.1.3.4 三种标准IO

在这里插入图片描述

1.1.4 总结

  1. 流的缓冲类型
  2. stdin / stdout / stderr
  3. stdin/stdout 默认是行缓冲
  4. stderr没有缓冲
  5. 写代码显示缓冲区大小

1.2 缓冲区实验

buff.c 代码
程序正常结束会刷新缓冲区。

  • Sleep函数:是释放cpu给其他应用程序使用的库函数。使用的头文件是#include <unistd.h>
  • 查看头文件方法:man 2 函数 ,或者 man 3 函数
man 3 sleep

在这里插入图片描述

  • 标准IO库中,全缓冲的默认缓冲区大小通常定义为BUFSIZ(在<stdio.h>中),大多数系统下为4096字节,以提高磁盘IO效率‌。
  • 行缓冲(如终端设备)的默认大小通常与终端行长度相关(如1024字节)‌

2 文件的打开和关闭概念

打开就是占用资源
关闭就是释放资源

2.1 文件的打开

  • 文件的打开函数
FILE *fopen (const char *path, const char *mode);

Path: 普通文件当前路径不需要加目录,其他要使用完整的路径
Mode:返回值:出错返回NULL,所以使用fopen函数必须判断是否为空

  • 文件打开的模式mode(非常重要)
    在这里插入图片描述
    在这里插入图片描述

  • 编译错误:

  1. error: ‘errno’ undeclared 表示errno变量没有定义
    解决方法:如果是系统变量用include 头文件,如果是你自己的,自己手动定义。
f_open.c:9:38: error: ‘errno’ undeclared (first use in this function)
printf("fopen:%s\n",strerror(errno));
  1. warning: implicit declaration of function ‘strerror’ 表示strerror函数隐示的声明
    解决方法:include 添加对应的头文件。
f_open.c:10:29: warning: implicit declaration of function ‘strerror’ [-Wimplicit-function-declaration]
printf("fopen:%s\n",strerror(errno));
  • perror 库函数 头文件stdio.h
    strerror 库函数 头文件 errno.h string.h
    perror和strerror 功能:打印系统的错误描述(注意:是系统错误,不是你自己代码错误)
  1. perror自动读取全局变量errno的值,无需手动传入错误码;而strerror需通过参数指定错误码(如strerror(errno))
  2. perror将错误信息输出到标准错误输出(stderr),而非stdout;strerror仅返回错误描述字符串,需配合其他函数(如printf)输出到指定位置
  3. perror的调用格式为perror(“自定义提示”),输出结果为"自定义提示: 系统错误描述";strerror直接返回系统错误描述字符串(如"Permission denied"),需用户自行拼接额外信息
#include <stdio.h>#include <string.h>#include <errno.h>int main(int argc, char const *argv[]){// FILE* fp = fopen("lala.txt","r");// FILE* fp = fopen("lala.txt","w");FILE* fp = fopen("lala.txt","a");if(!fp){perror("fopen");//fopen: No such file or directoryprintf("fopen:%s\n",strerror(errno));}else{printf("Open file succuss\n");}}

2.2 文件的关闭

函数原型:int fclose(FILE *stream)

  • fclose()调用成功返回0,失败返回EOF(-1),并设置errno
  • 流关闭时自动刷新缓冲中的数据并释放缓冲区,比如:常规文件把缓冲区内容写入磁盘
  • 当一个程序正常终止时,所有打开的流都会被关闭
  • fclose()函数的入参stream必须保证为非空,否则出现段错误。
if(fclose(fp) == 0){
printf("fclose file succuss\n");
}else{
perror("fclose");
}

3 标准IO的读写(字符、行)

3.1 读写单个字符

3.1.1 字符的输入(读单个字符):

int  fgetc(FILE *stream);
int  getc(FILE *stream);   //宏
int  getchar(void);

成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),
getchar()等同于fgetc(stdin)
getc和fgetc区别是一个是宏一个是函数

注意事项:

  1. 函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
  2. tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
  3. 打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!
  4. 调用getchar会阻塞,等待你的键盘输入

3.1.2 字符的输出(写单个字符):

int  fputc(int c, FILE *stream);
int  putc(int c, FILE *stream);
int  putchar(int c);

成功时返回写入的字符;出错时返回EOF
putchar©等同于fputc(c, stdout)
注意事项:

  1. 返回和输入参数都是int类型
  2. 遇到这种错误:Bad file descriptor, 很可能是文件打开的模式错误(只读模式去写,只写模式去读)

3.2 按行输入文件(读取整个行)

char  *gets(char *s);  读取标准输入到缓冲区s
char *fgets(char *s, int size, FILE *stream);

成功时返回s,到文件末尾或出错时返回NULL
遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项:

  1. gets函数已经被淘汰,因为会导致缓冲区溢出
  2. fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

3.3 按行输出文件(写整个行)

int  puts(const char *s);
int fputs(const char *s,  FILE *stream);

成功时返回非负整数;出错时返回EOF
puts将缓冲区s中的字符串输出到stdout,并追加’\n’
fputs将缓冲区s中的字符串输出到stream,不追加 ‘\n’

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

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

相关文章

CSS视图过渡入门指南:让多页面应用拥有丝滑动画

本文详细介绍了CSS视图过渡API的使用方法,从基础概念到实际代码实现,教你如何为多页面应用添加平滑的页面切换动画效果,包括浏览器支持情况和自定义过渡动画的技巧。CSS视图过渡入门指南 想象一下,你的网站可以在页…

《ROS1学习笔记8——自定义服务素材》

《ROS1学习笔记8——自定义服务素材》pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

实用指南:逻辑回归(Logistic Regression)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CTIP 与 3D-IC 堆栈热行为仿真实践

随着芯片工业进入异质集成、芯片堆叠(3D-IC / 2.5D)的时代,热管理(thermal management)成为设计可靠性与性能优化中不可或缺的一环。堆叠芯片内部以及封装与系统层级的温度分布若未得到合理预测与控制,可能导致热…

Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)

Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)​ 4K Video Downloader for Mac v5.0.0.5303-1.dmg 是一款专门在苹果电脑(Mac)上下载高清视频的工具。它可以把 YouTube、B站、Facebook 等网站的…

浮点数定点表示(Q格式)

深度学习神经网络模型中的量化是指浮点数用定点数来表示,也就是在DSP技术中常说的Q格式。 Q格式 Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的一位用作…

TPS的另外一层含义:绝对并发用户数 - BKY007

我们在做性能压测的时候,由于测试负载机资源有限,我们的并发用户数设置其实并不大 都是通过循环来实现多批次请求,来实现总的请求数量。 这时你会发现50个用户并发你可以请求5万或10万的请求,你计算出的TPS是随着并…

P10547 [THUPC 2024 决赛] 排列游戏

太非人类了。 首先想如果给定一个排列如何简单的判断合法,再困难的计数题如果连这个都不可以简单计数那就完犊子了。 经典结论是交换距离为 \(\sum [p_i > i](p_i - i) \le m\),容易证明充分性,必要性可以感性理…

NeurlPS 2025!多伦多大学TIRE助力3D/4D 生成精准保留主体身份

创新方法:提出三阶段方法(Track, Inpaint, Resplat),分别用于识别需要填充的区域、逐步填充未观察到的区域以及将2D填充观察结果重新投影回3D空间。论文标题:Track, Inpaint, Resplat: Subject-driven 3D and 4D …

笔记——OI中求逆元的几种方式(不含数学知识的讲解)

ps:除exgcd写法外均要求mod为素数 费马小定理求逆元 for(int i=1;i<=n;i++){inv[i]=ksm(i,mod-2); }线性求逆元 for(int i=1;i<=n;i++){inv[i]=(mod-mod/i)*inv[mod%i]%mod; }求阶乘逆元 先处理出最大的那个,每…

关于量化对模型表现的影响

之前一直知道量化会对模型有影响,但是没法具体感知到差别,最近使用qwen3-vl:30b-a3b模型时,就实实在在的感知到了。上图: (原图未打码)本人不是小黑子,对图中人不熟悉,大家不要冲我。

2025国内公关公司排名推荐(整合权威数据源):十大机构深度对比,专业分析与选择指南

国内top10公关公司(综合衡阳新闻、咸宁新闻、中钢、河青新闻网等权威信息) 第一名:智者品牌 核心优势:智者品牌是全球领先的数字化整合营销集团之一,拥有一支650多人的专业高效团队,凭借专业的创意策划能力与品效…

SpringBoot集成LangChain4j快速开发AI应用(调用阿里云Api) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

中美大数据产业的十年分岔路 - 智慧园区

“有些人走着走着就散了。 十几年前,当中美两国的工程师们都在热烈讨论Hadoop、Spark和开源社区时,他们仿佛站在同一个新大陆的海岸线上,共享着同一套工具和几乎一致的技术信仰。 那是以技术为驱动、以效率为圭臬的…

【论文精读】DreamVideo:定制化主体与动作的视频生成技能

【论文精读】DreamVideo:定制化主体与动作的视频生成技能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

acme证书申请

1Mg4iPPmdgm5j1exz4W0c5ZuvCMvnAYFivHE_W-V export CF_Key="1Mg4iPPmdgm5j1exz4W0c5ZuvCMvnAYFivHE_W-V" export CF_Email="2806429860@qq.com"

NOIP模拟赛11.27

今天打了一场NOIP模拟赛。 T1:暴力+一些思维+二分小优化,结果少写了一句话,100pts->60pts,痛失40分 T2:结论题,想出结论结果没写对,最后只写了一个暴力,100pts->40pts,痛失60分 T3:一些思维+欧拉路径,…

Open WebUI大模型输出完成后新对话响应延迟、输出变慢问题

Open WebUI时回答完后经常会遇到新提问回答响应延迟、或输出变慢的问题,通过显卡风扇明显可以感知后台依然占用计算资源,在运行。 该问题在LM Studio上不明显,但是使用Open WebUI就会明显感觉到,主要问题在于Open …

[CEOI 2025] Equal Mex 题解

[CEOI 2025] Equal Mex 题解[CEOI 2025] Equal Mex 虽然说是套路题,但是记录一下一些结论防止自己以后忘了。 首先不难发现你划分出的每个子段的 \(\operatorname{mex}\) 一定就是整个区间的 \(\operatorname{mex}\),…

法语动词变位

忍好久了。 第三组变位怎么这么 tm 烦啊。 今天突发奇想,是不是能让 AI 把我没能力实现的想法实现一下。我去还真可以啊! 那就粘在下面吧~~~ 以后说不定会补充,但也有可能记本子上。 🇫🇷 法语第三组动词变位规…