欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++的cout.tellp()和cout.seekp()語法介紹

 更新時(shí)間:2023年09月24日 16:34:30   作者:向陽逐夢  
無論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會(huì)先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會(huì)輸出到指定位置,本文給大家介紹一下C++的cout.tellp()和cout.seekp()語法,需要的朋友可以參考下

無論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會(huì)先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會(huì)輸出到指定位置(屏幕或者文件中)。

值得一提的是,當(dāng)數(shù)據(jù)暫存于輸出流緩沖區(qū)中時(shí),我們?nèi)钥梢詫ζ溥M(jìn)行修改。ostream 類中提供有 tellp() 和 seekp() 成員方法,借助它們就可以修改位于輸出流緩沖區(qū)中的數(shù)據(jù)。

C++ tellp()成員方法

首先,tellp() 成員方法用于獲取當(dāng)前輸出流緩沖區(qū)中最后一個(gè)字符所在的位置,其語法格式如下:

streampos tellp();

顯然,tellp() 不需要傳遞任何參數(shù),會(huì)返回一個(gè) streampos 類型值。事實(shí)上,streampos 是 fpos 類型的別名,而 fpos 通過自動(dòng)類型轉(zhuǎn)換,可以直接賦值給一個(gè)整形變量(即 short、int 和 long)。也就是說,在使用此函數(shù)時(shí),我們可以用一個(gè)整形變量來接收該函數(shù)的返回值。

注意,當(dāng)輸出流緩沖區(qū)中沒有任何數(shù)據(jù)時(shí),該函數(shù)返回的整形值為 0;當(dāng)指定的輸出流緩沖區(qū)不支持此操作,或者操作失敗時(shí),該函數(shù)返回的整形值為 -1。

在下面的樣例中,實(shí)現(xiàn)了借助 cout.put() 方法向 test.txt 文件中寫入指定字符,由于此過程中字符會(huì)先存入輸出流緩沖區(qū),所以借助 tellp() 方法,我們可以實(shí)時(shí)監(jiān)控新存入緩沖區(qū)中字符的位置。

舉個(gè)例子:

    #include <iostream> //cin 和 cout
    #include <fstream> //文件輸入輸出流
    int main() {
        //定義一個(gè)文件輸出流對象
        std::ofstream outfile;
        //打開 test.txt,等待接收數(shù)據(jù)
        outfile.open("test.txt");
        const char * str = "http://c.biancheng.net/cplus/";
        //將 str 字符串中的字符逐個(gè)輸出到 test.txt 文件中,每個(gè)字符都會(huì)暫時(shí)存在輸出流緩沖區(qū)中
        for (int i = 0; i < strlen(str); i++) {
            outfile.put(str[i]);
            //獲取當(dāng)前輸出流
            long pos = outfile.tellp();
            std::cout << pos << std::endl;
        }
        //關(guān)閉文件之前,刷新 outfile 輸出流緩沖區(qū),使所有字符由緩沖區(qū)流入test.txt文件
        outfile.close();
        return 0;
    }

注意,此例中涉及到了文件操作的相關(guān)知識,初學(xué)者僅需借助注釋了解程序的執(zhí)行脈絡(luò)即可,不需要研究具體實(shí)現(xiàn)細(xì)節(jié)。有關(guān)文件操作,后續(xù)章節(jié)會(huì)做詳細(xì)講解。

讀者可自行運(yùn)行此程序,其輸出結(jié)果為 1~29。這意味著,程序中每次向輸出流緩沖區(qū)中放入字符時(shí),pos 都表示的是當(dāng)前字符的位置。比如,當(dāng)將 str 全部放入緩沖區(qū)中時(shí),pos 值為 29,表示的是最后一個(gè)字符 '/' 位于第 29 個(gè)位置處。

C++ seekp()成員方法

seekp() 方法用于指定下一個(gè)進(jìn)入輸出緩沖區(qū)的字符所在的位置。

舉個(gè)例子,假設(shè)當(dāng)前輸出緩沖區(qū)中存有如下數(shù)據(jù):

http://c.biancheng.net/cplus/

借助 tellp() 方法得知,最后一個(gè) '/' 字符所在的位置是 29。此時(shí)如果繼續(xù)向緩沖區(qū)中存入數(shù)據(jù),則下一個(gè)字符所在的位置應(yīng)該是 30,但借助 seekp() 方法,我們可以手動(dòng)指定下一個(gè)字符存放的位置。

比如通過 seekp() 指定下一個(gè)字符所在的位置為 23,即對應(yīng) "cplus/" 部分中字符 'c' 所在的位置。此時(shí)若再向緩沖區(qū)中存入 "python/",則緩沖區(qū)中存儲的數(shù)據(jù)就變成了:

http://c.biancheng.net/python/

顯然,新的 "python/" 覆蓋了原來的 "cplus/"。seekp() 方法有如下 2 種語法格式:

//指定下一個(gè)字符存儲的位置 ostream& seekp (streampos pos); //通過偏移量間接指定下一個(gè)字符的存儲位置 ostream& seekp (streamoff off, ios_base::seekdir way);

其中,各個(gè)參數(shù)的含義如下:

  • pos:用于接收一個(gè)正整數(shù);、
  • off:用于指定相對于 way 位置的偏移量,其本質(zhì)也是接收一個(gè)整數(shù),可以是正數(shù)(代表正偏移)或者負(fù)數(shù)(代表負(fù)偏移);
  • way:用于指定偏移位置,即從哪里計(jì)算偏移量,它可以接收表 1 所示的 3 個(gè)值。

同時(shí),seekp() 方法會(huì)返回一個(gè)引用形式的 ostream 類對象,這意味著 seekp() 方法可以這樣使用:

  • cout.seekp(23) << "當(dāng)前位置為:" << cout.tellp();
    #include <iostream> //cin 和 cout
    #include <fstream> //文件輸入輸出流
    using namespace std;
    int main() {
        //定義一個(gè)文件輸出流對象
        ofstream outfile;
        //打開 test.txt,等待接收數(shù)據(jù)
        outfile.open("test.txt");
        const char * str = "http://c.biancheng.net/cplus/";
        //將 str 字符串中的字符逐個(gè)輸出到 test.txt 文件中,每個(gè)字符都會(huì)暫時(shí)存在輸出流緩沖區(qū)中
        for (int i = 0; i < strlen(str); i++) {
            outfile.put(str[i]);
            //獲取當(dāng)前輸出流
        }
        cout << "當(dāng)前位置為:" << outfile.tellp() << endl;
        //調(diào)整新進(jìn)入緩沖區(qū)字符的存儲位置
        outfile.seekp(23);  //等價(jià)于:
                            //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);
        //關(guān)閉文件之前,刷新 outfile 輸出流緩沖區(qū),使所有字符由緩沖區(qū)流入test.txt文件
        outfile.close();
        return 0;
    }

以上就是C++的cout.tellp()和cout.seekp()語法介紹的詳細(xì)內(nèi)容,更多關(guān)于C++ cout.tellp()和cout.seekp()的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C/C++實(shí)現(xiàn)快速排序算法的思路及原理解析

    C/C++實(shí)現(xiàn)快速排序算法的思路及原理解析

    這篇文章主要介紹了C/C++實(shí)現(xiàn)快速排序算法的思路及原理解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • C語言中無符號數(shù)和有符號數(shù)之間的運(yùn)算

    C語言中無符號數(shù)和有符號數(shù)之間的運(yùn)算

    C語言中有符號數(shù)和無符號數(shù)進(jìn)行運(yùn)算默認(rèn)會(huì)將有符號數(shù)看成無符號數(shù)進(jìn)行運(yùn)算,其中算術(shù)運(yùn)算默認(rèn)返回?zé)o符號數(shù),邏輯運(yùn)算當(dāng)然是返回0或1了。下面通過一個(gè)例子給大家分享C語言中無符號數(shù)和有符號數(shù)之間的運(yùn)算,一起看看吧
    2017-09-09
  • 基于C語言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)

    基于C語言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)

    這篇文章主要為大家詳細(xì)介紹如何基于C語言實(shí)現(xiàn)一個(gè)簡單的隨機(jī)點(diǎn)名器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下
    2022-07-07
  • C++實(shí)現(xiàn)查找二叉樹中和為某一值的所有路徑的示例

    C++實(shí)現(xiàn)查找二叉樹中和為某一值的所有路徑的示例

    這篇文章主要介紹了C++實(shí)現(xiàn)查找二叉樹中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹并進(jìn)行遍歷,需要的朋友可以參考下
    2016-02-02
  • Qt編寫地圖之實(shí)現(xiàn)覆蓋物坐標(biāo)和搜索

    Qt編寫地圖之實(shí)現(xiàn)覆蓋物坐標(biāo)和搜索

    地圖應(yīng)用中經(jīng)常會(huì)需要有覆蓋物坐標(biāo)和搜索的功能,本文將利用Qt實(shí)現(xiàn)這一功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-03-03
  • Qt實(shí)現(xiàn)轉(zhuǎn)動(dòng)輪播圖

    Qt實(shí)現(xiàn)轉(zhuǎn)動(dòng)輪播圖

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)轉(zhuǎn)動(dòng)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C語言中sizeof()與strlen()的區(qū)別詳解

    C語言中sizeof()與strlen()的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于C語言中sizeof()與strlen()區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Qt4和Qt5的信號和槽的使用區(qū)別

    Qt4和Qt5的信號和槽的使用區(qū)別

    本文主要介紹了Qt4 和 Qt5 的信號和槽的連接 connect 與斷開 disconnect 區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解c++優(yōu)先隊(duì)列priority_queue的用法

    詳解c++優(yōu)先隊(duì)列priority_queue的用法

    本文詳細(xì)講解了c++優(yōu)先隊(duì)列priority_queue的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 基于C++的拼多多算法在線筆試題示例

    基于C++的拼多多算法在線筆試題示例

    這篇文章主要介紹了基于C++的拼多多算法在線筆試題,列舉了四個(gè)拼多多的算法筆試題,包括分治法、大數(shù)相乘、貪心算法以及迷宮問題,需要的朋友可以參考下
    2017-08-08

最新評論