打开流的几种方式:
fopen 打开一个指定的文件
freopen 在一个指定流上打开指定文件 如果该流已经打开,关闭之,若已定向,则清除之
fdopen 获取一个现有的文件描述符;并使一个标准的io流与该描述符相结合;
当以读和写类型打开一个文件时
1、如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟随输入;
2、如果中间没有fseek、fsetpos或rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能直接跟随输出;
按照系统默认,除非流引用终端设备,流被打开时是全缓冲的,若流引用终端设备,行缓冲,若是标准输入、输出、出错,无缓冲;
读、写:
1、每次一个字符:
getc 可被实现为宏,
fgetc 不能被实现为宏,
getchar =getc(stdin)
对于这三个函数,不管出错还是到达尾端,三个函数都会返回-1,这时候需要调用ferror或者feof来判断;
ungetc 把读出的字符压到流中,但是压送的顺序和读出顺序相反;
以上为输出函数:
下面输入函数:
putc
fputc
putchar==putc(c,stdout)
2、每次一行io:
fgets
gets
gets没有读缓冲限制,而且不将换行符存入缓冲区中;
fputs
puts
puts会将换行符写到标准输出中;
使用标准io的一个优点是无需考虑缓冲以及最佳io长度的选择,在使用fgets时只需要考虑最大行长,但是与选择最佳io长度比较,这要方便的多;
fgets是使用memccpy实现的,memccpy函数使用的汇编语言而非c语言来实现,所以要高效的多;
文件时间属性
st_atime 文件数据的最后访问时间
st_mtime 文件数据的最后修改时间
st_ctime i节点状态的最后更改时间
更改文件的权限、用户id、链接数等,都会影响到i节点,i节点的所有信息都是与文件的实际内容分开存放的
utime(const char *pathname,const struct utimbuf *times);
struct utimbuf{
time_t actime;
time_t modtime;
};设置文件的访问时间和内容修改时间;