C++的cout.tellp()和cout.seekp()語法介紹
無論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會輸出到指定位置(屏幕或者文件中)。
值得一提的是,當數(shù)據(jù)暫存于輸出流緩沖區(qū)中時,我們?nèi)钥梢詫ζ溥M行修改。ostream 類中提供有 tellp() 和 seekp() 成員方法,借助它們就可以修改位于輸出流緩沖區(qū)中的數(shù)據(jù)。
C++ tellp()成員方法
首先,tellp() 成員方法用于獲取當前輸出流緩沖區(qū)中最后一個字符所在的位置,其語法格式如下:
streampos tellp();
顯然,tellp() 不需要傳遞任何參數(shù),會返回一個 streampos 類型值。事實上,streampos 是 fpos 類型的別名,而 fpos 通過自動類型轉換,可以直接賦值給一個整形變量(即 short、int 和 long)。也就是說,在使用此函數(shù)時,我們可以用一個整形變量來接收該函數(shù)的返回值。
注意,當輸出流緩沖區(qū)中沒有任何數(shù)據(jù)時,該函數(shù)返回的整形值為 0;當指定的輸出流緩沖區(qū)不支持此操作,或者操作失敗時,該函數(shù)返回的整形值為 -1。
在下面的樣例中,實現(xiàn)了借助 cout.put() 方法向 test.txt 文件中寫入指定字符,由于此過程中字符會先存入輸出流緩沖區(qū),所以借助 tellp() 方法,我們可以實時監(jiān)控新存入緩沖區(qū)中字符的位置。
舉個例子:
#include <iostream> //cin 和 cout
#include <fstream> //文件輸入輸出流
int main() {
//定義一個文件輸出流對象
std::ofstream outfile;
//打開 test.txt,等待接收數(shù)據(jù)
outfile.open("test.txt");
const char * str = "http://c.biancheng.net/cplus/";
//將 str 字符串中的字符逐個輸出到 test.txt 文件中,每個字符都會暫時存在輸出流緩沖區(qū)中
for (int i = 0; i < strlen(str); i++) {
outfile.put(str[i]);
//獲取當前輸出流
long pos = outfile.tellp();
std::cout << pos << std::endl;
}
//關閉文件之前,刷新 outfile 輸出流緩沖區(qū),使所有字符由緩沖區(qū)流入test.txt文件
outfile.close();
return 0;
}注意,此例中涉及到了文件操作的相關知識,初學者僅需借助注釋了解程序的執(zhí)行脈絡即可,不需要研究具體實現(xiàn)細節(jié)。有關文件操作,后續(xù)章節(jié)會做詳細講解。
讀者可自行運行此程序,其輸出結果為 1~29。這意味著,程序中每次向輸出流緩沖區(qū)中放入字符時,pos 都表示的是當前字符的位置。比如,當將 str 全部放入緩沖區(qū)中時,pos 值為 29,表示的是最后一個字符 '/' 位于第 29 個位置處。
C++ seekp()成員方法
seekp() 方法用于指定下一個進入輸出緩沖區(qū)的字符所在的位置。
舉個例子,假設當前輸出緩沖區(qū)中存有如下數(shù)據(jù):
借助 tellp() 方法得知,最后一個 '/' 字符所在的位置是 29。此時如果繼續(xù)向緩沖區(qū)中存入數(shù)據(jù),則下一個字符所在的位置應該是 30,但借助 seekp() 方法,我們可以手動指定下一個字符存放的位置。
比如通過 seekp() 指定下一個字符所在的位置為 23,即對應 "cplus/" 部分中字符 'c' 所在的位置。此時若再向緩沖區(qū)中存入 "python/",則緩沖區(qū)中存儲的數(shù)據(jù)就變成了:
http://c.biancheng.net/python/
顯然,新的 "python/" 覆蓋了原來的 "cplus/"。seekp() 方法有如下 2 種語法格式:
//指定下一個字符存儲的位置 ostream& seekp (streampos pos); //通過偏移量間接指定下一個字符的存儲位置 ostream& seekp (streamoff off, ios_base::seekdir way);
其中,各個參數(shù)的含義如下:
- pos:用于接收一個正整數(shù);、
- off:用于指定相對于 way 位置的偏移量,其本質(zhì)也是接收一個整數(shù),可以是正數(shù)(代表正偏移)或者負數(shù)(代表負偏移);
- way:用于指定偏移位置,即從哪里計算偏移量,它可以接收表 1 所示的 3 個值。

同時,seekp() 方法會返回一個引用形式的 ostream 類對象,這意味著 seekp() 方法可以這樣使用:
- cout.seekp(23) << "當前位置為:" << cout.tellp();
#include <iostream> //cin 和 cout
#include <fstream> //文件輸入輸出流
using namespace std;
int main() {
//定義一個文件輸出流對象
ofstream outfile;
//打開 test.txt,等待接收數(shù)據(jù)
outfile.open("test.txt");
const char * str = "http://c.biancheng.net/cplus/";
//將 str 字符串中的字符逐個輸出到 test.txt 文件中,每個字符都會暫時存在輸出流緩沖區(qū)中
for (int i = 0; i < strlen(str); i++) {
outfile.put(str[i]);
//獲取當前輸出流
}
cout << "當前位置為:" << outfile.tellp() << endl;
//調(diào)整新進入緩沖區(qū)字符的存儲位置
outfile.seekp(23); //等價于:
//outfile.seekp(23, ios::beg);
//outfile.seekp(-6, ios::cur);
//outfile.seekp(-6, ios::end);
cout << "新插入位置為:" << outfile.tellp() << endl;
const char* newstr = "python/";
outfile.write("python/", 7);
//關閉文件之前,刷新 outfile 輸出流緩沖區(qū),使所有字符由緩沖區(qū)流入test.txt文件
outfile.close();
return 0;
}以上就是C++的cout.tellp()和cout.seekp()語法介紹的詳細內(nèi)容,更多關于C++ cout.tellp()和cout.seekp()的資料請關注腳本之家其它相關文章!
相關文章
C++實現(xiàn)查找二叉樹中和為某一值的所有路徑的示例
這篇文章主要介紹了C++實現(xiàn)查找二叉樹中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹并進行遍歷,需要的朋友可以參考下2016-02-02
C語言中sizeof()與strlen()的區(qū)別詳解
這篇文章主要給大家介紹了關于C語言中sizeof()與strlen()區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
詳解c++優(yōu)先隊列priority_queue的用法
本文詳細講解了c++優(yōu)先隊列priority_queue的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12

