Loading...
· 标准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:
以下是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;