文件IO与C库IO的关系:
C库是介于应用程序和系统调用之间的一层,应用程序可以直接调用系统调用,不过为了便于应用在不同的系统之间移植(不同系统的系统调用是不同的),
C库向上提供统一的接口,根据实际情况来决定用库IO或系统调用
每一个打开的文件,在内核中都创建一个struct file结构体,里面记录了文件的全部信息,不过返回给上层一个整数fd,来代表此结构体。c库在fd的基础上,
把fd及读写缓存及文件读写的位置进行封装。用FILE代表此类结构。所以每次对文件读写,都会在FILE中记录,可以用fseek对读写位置重定位。
下面来说说缓存:
用C库IO时为了提高读写效率,开辟了读写缓存,应用程序的读写不会直接显示到输出流中,而是暂存在buffer中
全缓存:当填满标准I/O缓存后,再进行实际的I/O操作,对于磁盘上文件的I/O,通常就是采用全缓存进行的。可以通过fllush(fp)刷新,或者程序退出时,(\n不能刷新)进行实际的读写
行缓存:大小为1024,当遇到\n、fflush、退出时进行读写
文件IO函数有:
打开: int fd =open("path",flag,mode)
path为文件路径
flag为打开读写的权限:O_RDONLY、O_WRONLY、O_RDWR任选一,O_APPEND(追加到文件末尾),O_CREAT(没有则创建),O_TRUNC(存在在清零像w、w+)
mode 如果创建新文件(O_CREAT),则它确定了新文件的属性mode&~umask,默认情况下umask为0022,当mode为0666时,文件属性为0644.
读:char buff[N]
int n=read(fd,buff,N)
返回值:大于0,读到的字节数
等于0,读到文件末尾
小于0,失败
n<N
写:s_size n=write(fd,buff,n)
成功则返回写入的字节数一般等于n,失败返回-1
定位: 每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。按系统默认,当
打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0。
off_t lseek(fd,offset,whence)
whence为参考点,取值有SEEK_SET(开始)、SEEK_CUR(当前)、SEEK_END(末尾)
offset为偏移量。
当whence为SEEK_END时,offset=N时,将光标移动到文件后,产生空洞,但文件大小不变,只有在末尾追加后,空洞才会计入文件大小。
关闭:close(fd)
C库是介于应用程序和系统调用之间的一层,应用程序可以直接调用系统调用,不过为了便于应用在不同的系统之间移植(不同系统的系统调用是不同的),
C库向上提供统一的接口,根据实际情况来决定用库IO或系统调用
每一个打开的文件,在内核中都创建一个struct file结构体,里面记录了文件的全部信息,不过返回给上层一个整数fd,来代表此结构体。c库在fd的基础上,
把fd及读写缓存及文件读写的位置进行封装。用FILE代表此类结构。所以每次对文件读写,都会在FILE中记录,可以用fseek对读写位置重定位。
下面来说说缓存:
用C库IO时为了提高读写效率,开辟了读写缓存,应用程序的读写不会直接显示到输出流中,而是暂存在buffer中
全缓存:当填满标准I/O缓存后,再进行实际的I/O操作,对于磁盘上文件的I/O,通常就是采用全缓存进行的。可以通过fllush(fp)刷新,或者程序退出时,(\n不能刷新)进行实际的读写
行缓存:大小为1024,当遇到\n、fflush、退出时进行读写
不缓存:出错时不缓存,直接输出
文件IO函数有:
打开: int fd =open("path",flag,mode)
path为文件路径
flag为打开读写的权限:O_RDONLY、O_WRONLY、O_RDWR任选一,O_APPEND(追加到文件末尾),O_CREAT(没有则创建),O_TRUNC(存在在清零像w、w+)
mode 如果创建新文件(O_CREAT),则它确定了新文件的属性mode&~umask,默认情况下umask为0022,当mode为0666时,文件属性为0644.
读:char buff[N]
int n=read(fd,buff,N)
返回值:大于0,读到的字节数
等于0,读到文件末尾
小于0,失败
n<N
写:s_size n=write(fd,buff,n)
成功则返回写入的字节数一般等于n,失败返回-1
定位: 每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。按系统默认,当
打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0。
off_t lseek(fd,offset,whence)
whence为参考点,取值有SEEK_SET(开始)、SEEK_CUR(当前)、SEEK_END(末尾)
offset为偏移量。
当whence为SEEK_END时,offset=N时,将光标移动到文件后,产生空洞,但文件大小不变,只有在末尾追加后,空洞才会计入文件大小。
关闭:close(fd)
c函数库IO
打开流: FILE *fp=fopen("path","r/r+/w/w+/a/a+")
freopen在一个特定的流上(由fp指示)打开一个指定的文件(其路径名由pathname 指示),
如若该流已经打开,则先关闭该流。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出或标准出错
输入流:
安字符输入:
getc(fp)
fgetc(fp)
getchar(void)
getchar(void)等同于getc(stdin):等待标准输入
getc(fp)
安行输入:
fgets(buf,n,fp)
gets(buf)
fget指定了从fp流中读取最多n-1个字符到buf中,遇到\n为止,包括\n.最后一个字符为null
gets却不能指定读入buf的字节大小,所以可能造成buf越界,产生不安全
他们的另一点区别是gets只能从标准输入上读(和getchar一样)。
还有一点很重要的区别:gets不读入\n,对应的输出是用puts(),自动加上换行
输出流:
安字符输出:(和字符输入一一对应)
putc(int c,fp)
fputc(int c,fp)
putchar(int c)
安行输出:(和字符输出意义对应)
fputs(*buf,fp)
puts(*buf)
定位流:
fseek(fp,offset,whence)
ftell(fp)