除了不带缓冲的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库,更贴和底层!
文章评论(0条评论)
登录后参与讨论