2014-09-29 57 views
1

我的任務是寫入一個精確的位置到file.txt與C + + 而且因爲我的文件是靜態的(它不會被改變)我決定計算的位置curseur在哪裏我必須寫。 (我知道這是不是二本最好的辦法) 這是我的文件,我有後「=」寫: enter image description here使用ios :: ate覆寫數據

很清楚,我想通過寫「空」; 但我不明白爲什麼在otehr行中的「int main」也過度寫了!看看下面請以undersatnd我的問題: enter image description here

我的問題有以下幾點:

  • 我怎樣才能避免這種情況?
  • 你有沒有其他想法來實現上述目標?

的是我的嘗試:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    ofstream monFlux("client.txt",ios::in | ios::ate); 
    if(monFlux)  
{ 
    monFlux.seekp(61, ios::beg); 
    int position = monFlux.tellp(); 

    monFlux<< "DECryptBlockWithPCRYPT(d);"; 


    } 
    else 
    { 
     cout << "ERROR" << endl; 
    } 
    system("pause"); 
    return 0; 
} 
+0

只有在用等號字符替換X字符時,您的想法纔有效。 – imran 2014-09-29 12:19:51

+0

由於您似乎正在使用Qt,請查看'QString :: replace'或Qt的正則表達式庫。 – imran 2014-09-29 12:28:31

+0

對不起@Imran,我正在使用C++ 我對要修改的文件內容不感興趣。但機會,我想modifu的文件包含QT代碼 – xtensa1408 2014-09-29 12:34:57

回答

2

首先,它看起來像你閱讀(ios::in)打開一個輸出流是正確的?

我不認爲你可以用你描述的方式插入字符。
你的方法更像是一個人會在文本編輯器中做到這一點。另一方面的流對象只是讓你訪問磁盤上的字節。它沒有「選擇和替換」文本功能。

我覺得這個方法可以工作:

  1. 打開文件進行讀取和寫入一個輸出流的輸入流。
  2. 將前N個字符直接流到輸出流。
  3. 跳過「null」並插入替換字符串。
  4. 將輸入文件的其餘部分流式傳輸到輸出流中。
  5. 成功時,用新的文件替換原始文件。
+0

感謝您的答案。我同意你的方法可以幫助我實現我的目標。 (實際上,這個解決方案通常適用於我們想要修改文件的情況)但是,由於我知道文件的內容,我知道我必須修改的位置,而且最重要的是我的文件是靜態的,所以我的情況稍有不同。 所以,我不知道它是否更有效率。 – xtensa1408 2014-09-29 14:03:18

+1

這不關乎效率。它是用長度爲M的另一個長度替換長度爲N的字符串。要執行擦除/插入操作,可以將整個文件讀入字符串/矢量。但使用流將可以擴展更大的文件。 – foraidt 2014-09-30 19:26:23