热度 17
2016-5-26 17:38
1048 次阅读|
0 个评论
除了不带缓冲的read/write方式,C/C++还提供了带缓冲的标准IO库,而且后者更加方便。 虽然C和C++的实现方式有区别,但是它们都是对streams概念的操作,可以对比学习、加深印象。 ================================ a. C的标准IO库 当我们使用标准IO库打开或创建一个文件时,也可以说是我们为这个文件关联了一个流。 使用流的好处是(1)尽量减少read和write操作,(2)实现对buffer的自动管理。 标准输入/输出的文件描述符为STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,它们对应的stream分别是: stdin、stdout、stderr 有下面三种buffering: Fully buffered. Line buffered. Unbuffered. 标准IO库的函数有(部分列出): #include stdio.h void setbuf(FILE *restrict fp, char *restrict buf ); int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size); int fflush(FILE *fp); FILE *fopen(const char *restrict pathname, const char *restrict type); FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp); FILE *fdopen(int fd, const char *type); int fclose(FILE *fp); int getc(FILE *fp); int fgetc(FILE *fp); int getchar(void); int ferror(FILE *fp); int feof(FILE *fp); void clearerr(FILE *fp); int printf(const char *restrict format, ...); int fprintf(FILE *restrict fp, const char *restrict format, ...); 这些标准IO库函数的使用就不做实验了,因为它们很直观。 当需要使用它们的时候,根据功能调用相应的函数就好了,比如: printf("Standard IO library.\r\n"); ================================ b. C++的标准IO库 在C++里面,IO被定义成stream类及其对象,它们有三种: iostream、fstream、sstream cin是istream类的对象,cout是ostream类的对象。我们可以读取标志位来确定它们的状态。 如何刷新cout的输出缓冲区: * 程序正常结束时,会自动刷新。 * 缓冲区满了就会自动刷新。 * 使用endl等关键字。 * 使用unitbuf设置stream( cout unibuf)。 * 绑定stream,比如cin和cerr绑定到了cout上,执行前两者时一定会执行后者。 标准输入/输出的IO应该已经非常熟悉了,那如何将文件打开成stream IO呢? 举个例子: #include iostream #include fstream int main(int argc, char *argv[]) { ifstream in("hello_in"); string a, b, c, d; in a b c d; cout "Read:" a b c d endl; ofstream out; out.open("hello_out"); out "Write: Standard IO lib." endl; return 0; } 假如我们有一个文件hello_,它的内容是: $ cat hello_in My name is Marianna. 当程序执行时,会打印如下结果: $ ./UnixProg_01 Read:MynameisMarianna. 然后再查看hello_out文件的内容,它变成了: $ cat hello_out Write: Standard IO lib. ================================ 结论: C++的标准IO库,使用起来非常简单! C的标准IO库,更贴和底层!