标准I/O |
文件 I/O
|
|
遵循标准
|
标准 I/O 被称为高级磁盘I/O,遵循 ANSI C 相关标准。只要开发环境中有标准 I/O库,标准 I/O 就可使用。
|
文件 I/O 被称为低级磁盘 I/O,遵循 POSIX 相关标准。任何兼容 POSIX 标准的操做系统上都支持文件 I/O。
|
缓冲机制
|
标准 I/O 默认采用缓冲机制,能够当作是在文件 I/O 的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减小了系统调用的次数。
|
低级 I/O 通常没有采用缓冲,须要本身建立缓冲区。经过文件 I/O 读写文件时,每次操做都会执行相关系统调用。这样处理的好处是直接读写实际文件,坏处是频繁的系统调用会增长系统开销。
|
操做设备
|
标准 I/O 中用 FILE(流)表示一个打开的文件,一般用来访问普通文件。针对的是控制台,打印输出到屏幕等。
|
文件 I/O 中用文件描述符表现一个打开的文件,能够访问不一样类型的文件如普通文件、设备文件和管道文件等。主要针对的是文件操做、读写硬盘等。
|
如下为标准 I/O 函数和文件 I/O 函数的对比
|
||
打开
|
fopen,freopen,fdopen
|
open
|
fopen与open
|
标准 I/O 使用 fopen 函数打开一个指定文件。
![]()
pathname 是文件名。type 参数指定对I/O流的读、写方式,主要有"r"(只读打开),"r+"(读写打开),"w"(只写打开),"w+"(读写打开),"a"(追加打开)、"a+"(读和追加打开),能够加上字母 b 用以指定以二进制模式打开文件。
若成功,会返回一个 FILE 类型的指针,做为咱们打开文件的凭据,后面全部对这个文件的操做都须要使用这个文件指针,使用以后要调用 fclose 函数释放资源。
若失败,会返回一个指向 NULL 的指针,表示文件打开失败了,能够经过 errno 获取到具体失败的缘由。
|
文件 I/O 使用 open 函数打开或建立一个文件。
![]()
path 参数是要打开或建立的文件名。aflag 参数可用来讲明文件的打开模式,主要有 O_RDONLY(只读打开),O_WRONLY(只写打开),O_RDWR(读、写打开) 等。
若成功,返回文件描述符;失败则返回-1。
|
关闭
|
fclose
|
close
|
fclose与close
|
标准 I/O 使用 fclose 函数关闭一个打开的流。
![]()
若是成功关闭,返回 0,失败则返回 EOF。
|
文件 I/O 使用 close 函数关闭一个打开的文件。
![]()
若是成功关闭,返回 0,失败则返回-1,而不是 EOF。
|
读
|
getc,fgetc,getchar,
fgets,gets,
fread
|
read
|
|
标准 I/O 能够用 3 种方式进行文件读取。
![]()
函数getchar等同于getc(stdin)。前两个函数的区别是,getc可被实现为宏,而fgetc不能实现宏。
若成功,返回下一个字符;若已达到文件尾端或出错,则返回 EOF。
![]()
这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets从指定的流读。
gets(不建议使用):接受一个参数,不判断目标数组是否可以容纳读入的字符,可能致使存储溢出;
fgets使用三个参数:第一个参数和gets同样,用于存储输入的地址,第二个参数为整数,表示输入字符串的最大长度,最后一个参数就是文件指针,指向要读取的文件。
若成功,返回 buf;若已达到文件尾端或出错,则返回 NULL。
![]()
若成功,返回读或写的对象数。若是出错或达到文件尾端,则此数字能够少于 nobj。
|
文件 I/O 使用 read 函数从打开的文件中读取数据。
![]()
其中 fd 就是 open 返回的文件描述符,buf用于存储数据的目的缓冲区,而 nbytes 指定要读取的字节数。
若是成功读取,就返回读取的字节数,如已达到文件的尾端,则返回 0。若是失败,则返回-1。
|
写
|
putc,fputc,putchar,
fputs,puts,
fwrite
|
write
|
|
标准 I/O 能够用 3 种方式进行文件写入。
![]()
第一个参数是字符,第二个参数是文件指针。
putchar(c)等同于putc(stdin),putc可被实现为宏,而fputc不能。
若成功,返回c;失败则返回 EOF。
![]()
fputs 函数将一个 null 字节终止的字符串写到指定的流,尾端的终止符 null不写出。这并不必定是每次输出一行,由于字符串不须要换行符做为最后一个非null字节。一般,在 null 字节以前是一个换行符
puts 将一个 null 字节终止的字符串写到标准输出,终止符不写出。可是,puts 随后又将一个换行符写到标准输出。
若成功,返回非负值;失败则返回 EOF。
![]()
若成功,返回读或写的对象数。若是出错或达到文件尾端,则此数字少于 nobj。
|
文件 I/O 使用 write 函数向打开的文件写数据。
![]()
其中 fd 就是文件描述符,buf是要写入的内存数据,而 nbytes 指定要写的字节数。
若是成功写入,就返回已写的字节数,失败则返回-1。
|
随机存取
|
ftell,fseek
|
lseek
|
|
标准I/O 使用 fseek 和 ftell 完成文件的随机存取。
![]()
fseek 函数的第一个参数是文件指针,第二个参数是一个 long 类型的偏移量(offset),表示从起始点开始移动的距离。第三个参数就是用于指定起始点的模式,主要有 SEEK_SET(文件开始处)、SEEK_CUR(当前位置)、SEEK_END(文件结尾处)。
成功,返回0,出错,返回-1。
ftell 函数用于返回文件的当前位置,返回类型是一个 long 类型。
成功,返回当前文件位置指示,出错,返回-1L。
|
文件I/O 使用 lseek 来完成文件的随机存取。
![]()
fd 是文件描述符,offset 是偏移量,whence 指定起始点模式,取值与fseek相同:SEEK_SET,SEEK_CUR,SEEK_END,但也能够用整数0,1,2相应代替。
与fseek 不一样的是,lseek有返回值,若是成功就返回指针变化前的位置,不然返回-1。
|
<?php $file = fopen("test.txt", "wr"); fwrite($file, "test\n"); fclose($file); ?>
执行以下命令:php
strace php open.php
能够看到strace的结果:数组