Loading...

Linux学习笔记-标准IO库





· 标准IO库

· FILE指针

· 标准输入、标准输出、标准错误

· fopen、fclose、fwrite、fread、fseek、ftell、feof、ferror、clearerr函数

· 格式化IO(printf、fprintf、dprintf、sprintf、snprintf):(scanf、fscanf、sscanf)

· IO缓冲

· FILE指针与文件描述符互转


· 1.标准IO库

标准IO库是C语言下的,它是构建在系统调用之上的。其优势是不同的操作系统存在不同的系统的调用,同样的语言逻辑,而C语言具有更好的移植性。与此同时,标准IO具有自己的stdio缓存区,运行效率要比文件IO更好。

· 2.FILE指针

文件IO中每打开一次文件,就会返回一个文件描述符fd,对于标准IO而言,会返回一个FILE指针,FILE是一个结构体数据类型,记录了fd、缓冲区指针、缓存长度等。

· 3.标准输入(0)、标准输出(1)、标准错误(2)

标准输入(通常指键盘)、标准输出、错误(通常指屏幕);当用户与计算机进行交互时,会从标准输入文件stdin得到数据,在输出到标准输出stdout文件中,而将错误信息输出到stderr文件中去;每个进程被打开后会默认打开标准输入、标准输出和标准错误。

· 4.fopen、fclose、fwrite、fread函数

使用man 3 手册进行查看相关参数;fopen如果打开时需要创建文件,默认权限都是可读可写;

· 5.格式化IO

printf用于将格式化数据写入到标准输出,fprintf和sprintf都是将格式化数据写入到指定文件中,只不过一个传FILE指针,另外一个是传入文件描述符fd;sprintf和snprintf都是将格式化数据写入到指定的缓存buf中;

格式控制字符串format:

Linux学习笔记-标准IO库

以下是type类型:

flags:

Width:

Precision:

Length:

格式化输出:

sacnf可将用户输入的数据进行格式化转化;fscanf是从FILE指针指定的文件中读取数据再进行格式化转换;sscanf是从str指定的字符串读取再进行格式化转换。

注意 : 程序中调用了scanf之后,终端会被阻塞,等待用户输入完成,按回车才会继续进行

· 6.IO缓存

球盟会

对于write和read系统调用,在被使用时,内核会把数据存放到内核缓冲区,而不是直接写入到系统磁盘当中去的,但是内核具体什么时间把缓存中的数据写到磁盘当中去是不确定的,由内核存储算法自动判断。

控制文件IO内核缓存的系统调用sync、syncfs、fsync、fdatasync

fsync:将fd所对应的文件数据和元数据写入到磁盘中;fdatasync:将fd所对应的数据写入到磁盘中;sync:将文件IO缓存区所有的文件内容和元数据更新到磁盘中去;

以上对性能影响极大,大部分程序没有上面类似的需求。

使用O_DIRECT标志:直接将用户数据写到磁盘或直接从磁盘上读取数据;

当然,也有如下限制:

stdio缓冲

不同于内核维护的文件IO缓冲,stdio缓冲是用户空间的缓冲,通过一次性将stdio中的数据写入到内核缓冲或者拷贝到程序中的buf中,减少系统调用的次数而达到效率、性能的提升;

设置函数:setbuf、setbuffer、setvbuf;

标准输出默认是行缓冲模式,只有输出了换行符时,才会将换行符这一行字符进行输出显示(也就是刷入到内核缓冲区),在没有输出换行符之前,会将数据缓存在stdio缓冲区中

· 7.FILE指针与文件描述符互转

fdopen:fd->FILE;

fileno:FILE->fd;

以上代码会先输出write,再输出print;

球盟会·「中国」官方网站【红蓝战士推荐】致力于为运动爱好者提供最全面的体育资讯。我们的球盟会官网展示了Sports的赛事日程、实时比分以及独家评论,确保您不会错过任何一个精彩瞬间。访问我们的网页,了解更多球盟会的最新动态!