文件描述符对应的标准I/O
STDIN_FILENO stdin 标准输入
STDOUT_FILENO stdout 标准输出
STDERR_FILENO stderr 标准错误输出
与底层的文件描述符0 ,1,2 对用
常用函数使用
在标准I/O库中与底层文件描述符对用的流(stream),它被实现为指向结构FILE的指针
fopen:
格式 FILE *fopen(const char *filename,const char *mode)
参数filename字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode的下列字符串中的值(注意各符号表示的意义,r(read): 读,w(write): 写,a(append): 追加,b(binary):二进制文件,+:读和写):
“r”或”rb”:以只读方式打开文件,该文件必须存在。
“w”或”wb”:以写方式打开,并把文件长度截短为0。
“a”或”ab”:以写方式打开,新内容追加在文件尾。
“r+”或”rb+”或”r+b”:以更新方式打开(读和写)。
“w+”或”wb+”或”w+b”:以更新方式打开(读和写),并把文件长度截短为0。
“a+”或”ab+”或”a+b”:以更新方式打开(读和写),并把文件内容追加在文件尾。
使用 b 是将文件区分为文本文件和二进制文件
注意:UNIX和Linux把所有文件都看作为二进制文件;mode参数必须是一个字符串,而不是一个字符,所以总是应该使用双引号而不是单引号。
fopen在成功时返回一个非空的FILE*指针,失败时返回NULL值,NULL值在头文件stdio.h中定义。
可用的文件流数量有限制,由头文件stdio.h中定义的FOPEN_MAX定义,在Linux系统中,通常是16.
使用例子
FLIE *pin,*pout ;
pin = fopen("file.in","r") ;
pout = fopen("file.out","w+") ;
fread:
格式 size_t fread(void *ptr, size_t size, size_t ntimes, FILE *stream);
从文件流stream中读数据,读取ntimes个记录,每个记录长度由size定义,如果调用成功返回成功读取到数据缓冲区里的记录个数,即nitems,而不是字节数。如不成功,返回实际读取的记录个数。当到达文件尾时,它的返回值可能会小于nitems,甚至可以为0.
fwrite:
格式 size_t fwrite(const void *ptr, size_t size, size_t ntimes,FILE *stream);
frwrite与fread有相似的接口,从制定的数据缓冲区里取出数据记录,并把它们写到输出流中。返回值是成功写入的记录个数。
注意:不推荐把fread和fwrite用于结构化数据。部分原因在于用fwrite写的文件在不同计算机体系结构之间可能不具备可移植性。
fclose:
用来关闭指定的文件流stream,使所有尚未写出的数据都写出,使用fclose()函数就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
格式 int fclose(FILE *fp);
因为stdio库会对数据进行缓冲,如果程序需要确保数据已经全部写出,就应该调用fclose函数。程序正差结束时,会自动敌对所有还打开的文件流调用fclose函数,但是如果这这样做就没机会检查fclose报告的错误了。如果流关闭成功,则返回0,否则返回EOF(-1);如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。
fclose(pin);
fflush:
格式 int fflush(FILE *stream);
fflush库函数作用是把文件流里的所有未写出数据立刻写出。注意:调用fclose函数隐含执行一次fflush操作,所以不必在调用fclose之前调用fflush。
int fgetc(FILE *stream); 程序文件流里取一个字节
int getc(FILE *stream); 可作为一个宏定义
这两者看似相同,但是有较大区别。 getc()可被实现为宏 ,而fgetc不能
因此:
getc的参数不应是具有副作用的表达式,因为可能会被计算多次
因为fgetc是一个函数,所以可以得到其地址,所以可将其地址作为参数传给另一个函数
fgetc所需时间可能比getc长。
fgetc(pin);
int getchar(void);
fgetc函数意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节并把取出的字节作为一个字符返回。如果读到文件末尾或者读取出错时返回EOF。
getc函数的作用和fgetc一样,但它有可能被实现为一个宏,所以不能将其作为函数指针传(某些编译器可以)。
getchar函数的作用相当于getc(stdin),从标准输入里读取下一个字符。
int fputc(int c, FILE *stream);
fputc(c,pout);
问题 何时用std io函数 何时用lowlevel io函数
答 一般考虑标准的 。考虑效率且I/O操作需不需要访问我们的物理资源时候,不需要缓存干扰我们时,用底层。
参考 http://blog.csdn.net/u012062760/article/details/42268779
http://blog.csdn.net/nkguohao/article/details/8718458