2014-04-22 46 views
1

說明:我有它的幾行文本文件,我想兩條線之間寫英寸開/ seekp /寫入截斷文件

我試過了:我有一個循環來決定我想要寫的位置。當我嘗試打開文件時使用seekp來定位輸入,然後寫入文件被截斷。

file.txt的:

Hello 
Write under this line 
Write above this line 

代碼:

ofstream myfileo; 
myfileo.open("file.txt"); 

cout<<myfileo.tellp()<<endl;//starts at 0 

myfileo.seekp(26);//move to 26 ...End of second line 
cout<<myfileo.tellp()<<endl;//says 26 

string institution ="hello"; 
myfileo<<"\n"<<institution<<"\n"; 
myfileo.close(); 

問題:我不知道爲什麼該文件被截斷。我嘗試使用append,但不管它寫入底部是什麼使得,但我不知道我做錯了什麼。

感謝, JT

+0

你怎麼知道的位置寫是26?您正在文本模式下打開文件,而不是二進制模式。因此,在文本文件中的位置26可能不會指向您認爲由於CR/LF轉換而指向的位置。 – PaulMcKenzie

+0

我認爲這是它應該如何工作的。您需要閱讀該點之後的行,然後用它們寫入新行。 –

+0

@PaulMcKenzie:點是它截斷文件。如果那個位置結果不正確,我可以找到解決這個問題的方法。我只是不明白我是怎麼想兩行之間的寫入,而無需加載整個生命到內存中,然後輸出回來......請告訴我,即使seekp的地步呢? –

回答

0

想做什麼我張貼的意見是可能的,但令人沮喪的。 這裏是代碼,對於這個特殊的例子作品,但在任何情況下不工作:

#include <algorithm> 
#include <fstream> 
#include <iterator> 
#include <string> 
#include <vector> 

int main (void) 
{ 
    std::fstream file ; 

    file.open ("test.txt") ; 
    file.seekg (28, file.beg) ; // 28 was the correct offset on my system. 

    auto begin = std::istream_iterator <std::string> (file) ; 
    auto end = std::istream_iterator <std::string>() ; 
    std::vector <std::string> buffer (begin, end) ; 

    file.clear() ; // fail-bit is sometimes set for some reaon. 
    file.seekg (28, file.beg) ; 
    file << "\n" "hello" "\n" ; 

    std::copy (std::begin (buffer), std::end (buffer), 
     std::ostream_iterator <std::string> (file, " ")) ; 

    return 0 ; 
} 

如果你不希望加載的一切到內存,更好的解決辦法是使用臨時文件。讓我們把它TEMP.TXT。那麼你會:

  1. 複製到TEMP.TXT一切從file.txt的要在其中插入文本之前。
  2. 插入你想插入TEMP.TXT文本。
  3. 複製到temp.txt其餘的file.txt
  4. 刪除file.txt的
  5. 重命名temp.txtfile.txt

步驟4和步驟5是操作系統特定的(除非您有一些可以執行此操作的便攜式庫)。