in |
以读方式打开 |
out |
以写方式打开 |
app |
每次写操作均定位到文件末尾 |
ate |
打开文件后立即定位到文件末尾 |
trunc |
截断文件 |
binary |
以二进制方式进行IO |
用文件名初始化一个流时或用open打开文件时都可以指定文件模式,但要注意下面几种限制:
<1>只可以对ofstream或fstream对象设定out模式。
<2>只可以对ifstream或fstream对象设定in模式。
<3>只有out设定时才可以设定trunc模式。
<4>只要trunc没有被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式 ,文件也总是以输出方式被打开。
<5>默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,我们必须同时指定app模式,这样只会将数据追加写到文件末尾;或者同时指定in模式,即打开文件同时进行读写操作。
<6>ate和binary模式可以用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
以out模式打开文件会丢弃已有数据,所以阻止一个ofstream清空给定文件内容的方法是同时指定app模式。
// 在这几条语句中,file1都被截断 ofstream out("file1"); // 隐含以输出模式打开文件并截断文件 ofstream out2("file1", ofstream::out); // 隐含地截断文件 ofstream out3("file1", ofstream::out | ofstream::trunc); // 显式截断文件 // 为了保留文件内容,我们必须显式指定app ofstream app("file2", ofstream::app); // 隐含为输出模式 ofstream app("file2", ofstream::app | ofstream::out);
7,使用字符流
sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。
7.1 使用istringstream
很多时候我们需要逐行处理文本,而且需要对行内的单词进行单独分析,这时候使用istringstream是很方便的。
比如,我们程序需要一次读取一行文本,然后将其中的单词分别取出保存在一个vector中。
string line,word; while (getline(cin, line)) { vector<string> wordList; istringstream lineText(line); while (lineText >> word) { wordList.push_back(word); } }
7.2 使用ostringstream
当我们逐步构造输出时,希望最后一起打印时,ostringstream是很有用的,它可以帮我们完成类似于itoa,ftoa这种数字转字符串的功能。
int num1 = 42; double pi = 3.1415926; string str = "some numbers"; ostringstream formatted; formatted << str << pi << num1; cout << formatted.str() << endl;
其中str成员函数是stringstream有几个特有操作之一。
string s; stringstream strm(s);// 保存s的一个拷贝,此构造函数是explicit的。 strm.str(); // 返回strm所保存的string对象的拷贝。 strm.str(s); // 将s拷贝到strm中,返回void。
8,格式化输入输出
8.1 操纵符
标准库定义了一组操纵符用来修改流的状态,一个操纵符是一个函数或是一个对象,会影响流的状态,并能用作输入或输出运算符的运算对象,比如我们熟悉的endl,就是一个操纵符。