2016-05-12 140 views
0
myfile<<hashdugumu[key].numara; 

我有這段代碼。例如,我想寫到第八行。我如何在C++中做到這一點?在此先感謝。我如何寫入文本文件的特定行?

+1

http://stackoverflow.com/questions/16423538/how-to-write-on-a-specific-line-in-a-file?rq=1 –

+0

是你想要寫的線完全一樣的長度作爲已經存在的線?然後只計算七行(使用例如'std :: getline'),然後寫入文本。如果這些行的長度*不是完全相同,那麼您不得不使用另一個文件或內存作爲臨時存儲。 –

+0

是的他們是相同的長度 – user6207597

回答

0

您將打開文件流,搜索7個新行並在那裏寫入。

大概是這樣的:

int main() { 
    int number_of_lines = 7; 
    std::string line; 
    std::fstream f("f.txt"); 

    while (--lines_n && std::getline(f, line)); 
    f.setp(f.tellg()); 
    f << "writing at 8th line"; 
    return 0; 
} 
+0

@JoachimPileborg請更新 – 4pie0

0

如果你想寫線路正是相同的長度(以字節爲單位,不以字符,記住一些編碼(比如:如UTF-8)是可變長度)那麼這很容易:只要跳過前面的七行,然後寫下行。

雖然有一個警告:input streamsoutput streams有不同的流位置。所以,如果你從combined input/output file stream讀取,那麼只有讀取位置會改變,所以如果你只是試圖直接寫入,那麼你不會寫在相同的位置。要解決此問題,您需要獲取讀取位置,並將寫入位置設置爲相同的值。


作爲替代方案,或者,如果你想要寫的數據的尺寸與現有的數據相同,那麼你必須使用一個臨時的「緩衝」,是它的另一個文件或實際內存緩衝。

如果文件不大,可以使用內存緩衝區,例如使用std::vector作爲行。將每行讀入矢量,然後修改要修改的行(矢量中的元素)。最後重新打開文件進行寫入,截斷文件,然後將每個「行」寫入文件。

上面有一個小問題,但是當涉及重寫數據時,即如果文件被截斷,然後在寫入文件時出現錯誤,則可能會丟失數據。這可以通過使用臨時文件來解決。

使用臨時文件更容易不用打擾內存緩衝區,而是從原始文件讀取並直接寫入臨時文件。知道什麼時候應該寫點別的東西是通過跟蹤當前的行號完成的,如果你一次讀一行,這很容易。在你的例子中,你從原始文件中讀取前七行並將它們寫入臨時文件,在第七行寫出特殊八行之後,從原始文件中跳過原來的八行,然後繼續讀/寫剩下的線。完成關閉文件後,將臨時文件重命名爲原始文件。

+0

寫入文件截斷該文件到那個長度。 OP想要寫入文件的中間,這並不那麼簡單。 – stark

+0

@stark ['std :: fstream'](http://en.cppreference.com/w/cpp/io/basic_fstream)默認使用'ios :: out | ios :: in'作爲打開時的模式,根據[此參考](http://en.cppreference.com/w/cpp/io/basic_filebuf/open),它與['fopen']相同(HTTP://en.cppreference。com/w/cpp/io/c/fopen)模式'「r +」'這會打開一個用於讀寫的*現有*文件,不會截斷正在執行的操作,並且文件*必須*存在。 –

相關問題