由于不能拷貝IO對(duì)象,因此函數(shù)通常以引用方式傳遞和返回流辉懒。
練習(xí)8.1:編寫函數(shù),接受一個(gè)istream&參數(shù)谍失,返回值類型也是istream&眶俩。此函數(shù)須從給定流中讀取數(shù)據(jù),直到遇到文件結(jié)束標(biāo)識(shí)時(shí)停止快鱼。它將讀取的數(shù)據(jù)打印在標(biāo)準(zhǔn)輸出上颠印,完成這些操作后,在返回流之前抹竹,對(duì)流進(jìn)行復(fù)位线罕,使其處于有效狀態(tài)
#include <iostream>
#include <vector>
using namespace std;
std::istream& read(std::istream &is)
{
string temp;
while (is >> temp)
{
cout << temp << " ";
}
cout << endl;
is.clear(); //如果沒有clear則在讀入一個(gè)結(jié)束符后不會(huì)執(zhí)行while語句
return is;
}
int main()
{
while (read(cin))
{
cout << endl << 1;
break;
}
return 0;
}
輸出緩沖
緩沖刷新
- 程序正常結(jié)束,作為main函數(shù)的return操作的一部分窃判,緩沖刷新被執(zhí)行钞楼。
- 緩沖區(qū)滿的時(shí)候
- 使用操縱符endl
- 使用unitbuf設(shè)置流的內(nèi)部狀態(tài)
- 一個(gè)輸出流被關(guān)聯(lián)到另一個(gè)流
練習(xí)8.4:編寫函數(shù),以讀模式打開一個(gè)文件袄琳,將其內(nèi)容讀入到一個(gè)string的vector中询件,將每一行作為一個(gè)獨(dú)立的元素存于vector中
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
void get(std::ifstream &is, vector<string> &temp);
int main()
{
vector<string> a;
string t;
ifstream in("1.txt");
get(in, a);
for (auto i : a)
cout << i << endl;
return 0;
}
void get(std::ifstream &is, vector<string> &temp)
{
string str;
if (is)
{
while (is >> str) //第一題getline(is, str)
{
temp.push_back(str);
}
}
}
- 只可以對(duì)ofstream或fstream對(duì)象設(shè)定out模式。
- 只可以對(duì)ifstream或fstream對(duì)象設(shè)定in模式
- 只有當(dāng)out也被設(shè)定是才可設(shè)定trunc模式
- 只有trunc沒被設(shè)定唆樊,就可以設(shè)定app模式宛琅。在app模式下,即使沒有顯試指定out模式逗旁,文件也總以輸出方式被打開
- 默認(rèn)情況下嘿辟,即使我們沒有指定trunc,以out模式打開的文件也會(huì)被截?cái)唷?/li>
保留被ofstream打開的文件中已有數(shù)據(jù)的唯一方法是顯式指定app或in模式
練習(xí) 8.9:使用istringstream對(duì)象讀取打印內(nèi)容
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
std::istream& read(std::istream &is)
{
string temp;
while (is >> temp)
{
cout << temp << " ";
}
cout << endl;
is.clear(); //如果沒有clear則在讀入一個(gè)結(jié)束符后不會(huì)執(zhí)行while語句
return is;
}
int main()
{
string a = "adfdsfgasdf asdf adsadsg ads";
istringstream record(a);
read(record);
return 0;
}