2017-04-12 50 views
0

我需要做的是從輸入文件中讀取一些參數值,其中在該行的開頭加上*來標識註釋。在「有用」行值由分號像這樣分離:C++ - 在輸出流的行首替換一個字符與另一個字符

10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03; 

我有多行這樣在我的輸入文件。

我想要做的就是在每行的開頭插入一個*,一旦我讀了它,如果我第二次讀該文件,我將跳過該行並直接轉到以下內容一。

我需要這個,因爲我的目標是讓我的程序的多個實例同時運行並按順序訪問文件以獲取所需的輸入參數。所以我希望每個實例都會得到不同的參數。

我想到了就去做每一行的開頭插入一個虛擬人物,像這樣:

b10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03; 

,然後(在這個例子中b)替換它與*當我讀到它,以便我第二次讀到這條線就會被當作評論。

我試圖用put('*')<< '*'一次我和一個peek()調用read b*角色總是在文件的末尾。我讀過,雖然我不能在文件中間寫入文件,但可以在文件中間覆蓋。我能做什麼?

這裏是一個可能的輸入文件的例子:

* FORMAT: 
* MAX_HEIGHT; SEED; p0; p1; pd; pp; epsilon; 

b10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03; 
b40; 32541615; 0.18; 0; 0.00015; 0.01485; 0.03; 
+0

你不需要知道你的程序實例使用什麼參數?我可能會爲每個實例使用一個參數文件,並將該文件名作爲命令行參數傳遞。或者,如果您堅持使用單個文件,那麼我會讓每個實例從文件中的給定行讀取其參數(再次作爲命令行參數傳遞)。 Imho有幾個程序讀取和寫入同一文件的實例只是不必要的過度複雜 – user463035818

+0

一個基本問題是,如果沒有一些額外的同步,您將無法防止多個程序實例讀取同一行之前的競爭條件他們中的任何人都會更新以更新該行。如果/當你解決了這個問題,那麼你就可以以更簡潔的方式解決你原來的問題。 –

+0

@MichaelBurr我知道。當然,我將在實際上有多個線程同時從同一個文件讀取之前實現某種同步。但我很想知道這個問題是否有一個簡單的答案 – jackscorrow

回答

1

所以要修改,你正在閱讀的文件嗎?那麼你基本上必須從頭開始重寫它。

一個常見的方法是將整個文件讀入內存,修改內存緩衝區,然後用(修改過的)內存緩衝區覆蓋文件。

另一種常見的方法是,如果文件大到適合內存,則逐行讀取,修改行並將其寫入新的臨時文件。然後,當所有輸入都被讀取後,您將臨時文件重命名爲實際文件,從而替換其中的數據。

這兩種解決方案都可以在不需要任何特殊標記字符的情況下使用,例如b在要更換的行的開頭。

+0

但我想要做的是用另一個'char'替換一個'char',它將佔用相同的空間。我是否仍然需要從頭開始編寫整個文件? – jackscorrow

+0

@jackscorrow你必須*通過文件尋找*來找到替換特殊字符的正確位置。在我的回答中,實際上可能比我所說的可能的方法更多的工作。另外,對於我提出的可能的解決方案,您不必具有特殊字符,這樣可以更輕鬆地讀取第一個數字(您不必將其讀作字符串,刪除第一個字符,然後將字符串轉換爲一個整數值)。 –

+0

好的。我想我會最終與這一切。但你說 - 將它作爲一個字符串讀取,刪除第一個字符,並將字符串轉換爲整數值_,請原諒我的無知,但還有其他方法來讀取整數或雙數嗎?因爲這些正是我爲了存儲這種值而正在遵循的步驟 – jackscorrow

相關問題