2013-08-04 34 views
-2

我想在已存在的文件中的特定位置寫入某些內容,但是我希望在寫入新內容之前擦除舊內容。寫入文件中的特定位置,但先擦除舊內容

例如,假設以下是目標文件的內容。

27013. 
Anderson Alston. 
22. 
9 Hall st. 
25/7/2013. 
0.  << target position here 

現在,修改後的文件內容將是

27013. 
Anderson Alston. 
22. 
9 Hall st. 
25/7/2013. 
190. << this position has been modified 

最後,下面是我的代碼,我寫的。

cout << "Amount of deposit: "; 
cin >> amount; 
ofstream ifile("file.txt", ios::out|ios::trunc); 
ifile.seekp(pos); // `pos` is variable that stores the position 
ifile << amount << "."; 
ifile.close(); 
+7

你意識到該文件被改變的長度,對不對?您不能輕易*將*插入文本文件中,只需要文件流(需要*移動*以下所有數據)。你最好的選擇是讀入文件,處理它,然後寫回去。 –

+0

@BrianNeal如果你想要,我們可以刪除所有這些註釋:-) –

回答

2

您不能以這種方式將數據插入到文件中。

文件是一組連續的字節,要將附加數據引入特定區域需要您爲新內容「騰出空間」。這是通過分配更多空間,然後轉移值來實現的,以便您可以寫入您想要的位置。

我當然不會建議移動(讀/寫)文件本身的字符。將文件的內容讀入char緩衝區,在該緩衝區中可以更輕鬆地操作數據。您可能會考慮使用char數組的數組,因此每行都會有一個char數組。通過這種方式,您可以在每行的基礎上操作數據,並在所有修改完成後回寫到文件。

3

您不能直接在文件的中間插入數據,就像你不能插入數據到一個數組的中間。您必須在插入點之後移動所有內容,以便爲新數據騰出空間。

一般來說,我認爲使用這樣的文件是一個壞主意。讀入文件,執行所需的任何處理,然後將完整文件寫回。此外,您可以避免以這種方式輕易破壞文件。

+0

C/C++沒有任何方法來擦除文件中的特定行?這種語言非常瑕疵。 –

+4

您對文件的工作方式缺乏基本的瞭解,這比C++本身就沒有能力執行此操作(低效率)更具有缺陷。 –

+0

這很好。那麼你應該考慮學習更多關於該語言的知識,然後再解僱它,因爲你認爲它沒有內置內容。請指引我使用任何內置行級文件編輯的語言。 –

0

好吧,這裏是希望給你一個答案...

首先,你要知道,你已經在這個問題問的只是部分可能。我的意思是,

a。您可以在不將整個文件讀入內存的情況下更改文件的記錄,但是

b。您不能在文件中間插入新記錄而不移動其他記錄。

要完成上述任務'a',您必須使用搜索功能找到需要的位置,然後更新記錄。

要做任務'b',因爲你是初學者,所以最好使用一個數組。我不打算在這裏爲你寫整個代碼。如果這是你想要的,你寧願在類比 C級:)

所以這裏有一個粗略的算法。

插入一條記錄:

Input data 
Open the file to append. (alternatively you may seek to the end of the file) 
Write the record 
Close the file. 

要編輯的記錄。

Input a record item to search. Eg: ID or name or something unique. 
Open the file (for read/write) 
RecordNum = 0 
found = false 
While not eof and not found 
    Read record 
    If match found 
    found= true 
    display info so you can see the data 
    input new fields (changes) 
    seek to postion RecordNum 
    Write the record to the position. 
    Else 
    Increment RecordNum 
    End if 
End while 
if not found show error or something you like. 
close file 

在上面的方法中,你必須使用輸入文件。這意味着您必須爲每條記錄定義一個記錄結構(使用struct)。

-1

您可以打開的文件是這樣的:

fstream ifile("file.txt", ios::in | ios::out); 
相關問題