C++ Primer 5th笔记(chap 17 标准库特殊设施)流随机访问
1. 流類型通常都支持對流中數(shù)據(jù)的隨機(jī)訪問。
可以重定位流, 使之跳過一些數(shù)據(jù), 首先讀取最后一行, 然后讀取第一行, 依此類推。
1.1 標(biāo)準(zhǔn)厙提供了一對函數(shù), 來定位( seek )到流中給定的位置, 以及告訴( tell) 我們當(dāng)前位置
- seek函數(shù):將標(biāo)記 seek 到一個給定位置來重定位它;
- tell 函數(shù):tell 我們標(biāo)記的當(dāng)前位置。
標(biāo)準(zhǔn)庫實(shí)際上定義了兩對 seek 和 tell 函數(shù):
- g 版本表示我們正在“ 獲得”( 讀取) 數(shù)據(jù)
- p 版本表示我們正在“ 放置”( 寫入) 數(shù)據(jù)
只適用于fstream和sstream。
| tellg() | tellp 返回一個輸入流中(tellg)或輸出流中(tellp)標(biāo)記的當(dāng)前位置。 |
| seekg(pos) | seekp(pos) 在一個輸入流或輸出流中將標(biāo)記重定位到給定的絕對地址。pos通常是一個當(dāng)前teelg或tellp返回的值。 |
| seekp(off, from) seekg(off, from) | 在一個輸入流或輸出流中將標(biāo)記定位到from之前或之后off個字符,from可以是下列值之一:beg,偏移量相對于流開始位置;cur,偏移量相對于流當(dāng)前位置;end,偏移量相對于流結(jié)尾位置。 |
1.2 只有一個標(biāo)記
標(biāo)準(zhǔn)庫區(qū)分 seek 和 tell 函數(shù)的“ 放置” 和“ 獲得” 版本這一特性可能會導(dǎo)致誤解。
即使標(biāo)準(zhǔn)庫進(jìn)行了區(qū)分, 但它在一個流中只維護(hù)單一的標(biāo)記—并不存在獨(dú)立的讀標(biāo)記和寫標(biāo)記
由于只有單一的標(biāo)記, 因此只要我們在讀寫操作間切換, 就必須進(jìn)行 seek 操作來重1定位標(biāo)記。 .
1.3 重定位標(biāo)記
seek 函數(shù)有兩個版本: 一個移動到文件中的“ 絕對” 地址: 另一個移動到一個給定位置的指定偏移量:
//將標(biāo)記移動到一個固定位置 seekg (new_position); / / 將讀標(biāo)記移動到指定的 pos_type 類型的位置 seekp (new_position); / / 將寫標(biāo)記移動到指定的 pos_type 類型的位置 / / 移動到給定起始點(diǎn)之前或之后指定的偏移位置 seekg (offset, from); / / 將讀標(biāo)記移動到距 from 偏移量為 offset 的位置 seekp (offset, from); / / 將寫標(biāo)記移動到距 from 偏移量為 of fset 的位置- pos_type表示一個文件位置
- off_type 表示距當(dāng)前位置的一個偏移量。
一個 off_type 類型的值可以是正的也可以是負(fù)品, 即可以在文件中向前移動或向后移動。
1.4 訪問標(biāo)記
函數(shù) tellg 和 tellp 返回一個pos_type表示流的當(dāng)前位置。tell 函數(shù)通常用來記住一個位置, 以便稍后再定位回來
ostringstream::writeStr;// 輸出 stringstream ostringstream::pos_type mark = writeStr.tellp ( ); // ... if (cancelEntry) / / 回到剛才記住的位置 writeStr.seekp (mark);/ / 以讀寫方式打開文件, 并定位到文件尾 fstream inOut("test_2.txt", fstream::ate|fstream::in|fstream::out);if(!inOut){return EXIT_FAILURE;}/ / inOut 以 ate 模式打開, 因此一開始就定義到其文件尾auto end_mark = inOut.tellg();//記住原文件尾位置inOut.seekg(0,fstream::beg);/ / 重定位到文件開始size_t cnt = 0;/ / 字節(jié)數(shù)累加器string line;/ / 保存輸入中的每行while(inOut&&inOut.tellg() != end_mark&&getline(inOut,line)){/ / 繼續(xù)讀取的條件: 還未遇到錯誤且還在讀取原數(shù)據(jù)/ / 且還可獲取一行輸入cnt += line.size()+1;/ / 加 1表示換行符cout << line.size() << endl;auto mark = inOut.tellg();/ / 記住讀取位置inOut.seekp(0,fstream::end);II 將寫標(biāo)記移動到文件尾inOut << cnt;/ / 輸出累計(jì)的長度 / / 如果不是最后一行, 打印一個分隔符if(mark != end_mark)inOut << " ";inOut.seekg(mark);/ / 恢復(fù)讀位置}inOut.seekp(0,fstream::end);原始文件:
abed efg hi j修改過的文件:
abed efg hi j5 9 12 14總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 17 标准库特殊设施)流随机访问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha