2010-09-13 133 views
1

我正在做的是在主開始時使用fstream打開我的文件,並在最後關閉它。在我寫作「Hello World」之間,然後閱讀我寫的內容,但結果總是被人嘲笑,而不是「Hello World」。我確實做了一個角色,但沒有幫助。任何方式我可以做到這一點?同時讀取/寫入

+1

您是否檢查讀取操作是否成功?你如何閱讀? – 2010-09-13 04:12:53

+4

發佈您使用的代碼。 – 2010-09-13 04:12:59

回答

2

當您從閱讀轉爲寫作或反之時,您需要設置一個fseek調用。 (當然,你也需要fopen"r+"之類的,所以讀寫都是允許的,但我想你已經知道了 - 尋求在閱讀和寫作之間切換的需要是一個鮮爲人知的事實)。

作爲this page所說的那樣,

對於模式,其中讀取和 寫入(或附加)被允許 (那些包括「+」符號),則 流應該被刷新(fflush )或 重新定位(FSEEK,fsetpos,倒帶) 任一隨後的寫入操作的讀出操作 或 寫入操作之後是 讀取操作之間。

+0

fseek和fstream?我不這麼認爲。這個問題被標記爲C++而不是C,所以C++的答案會更合適。 – camh 2010-09-13 04:30:25

+0

@camh,在我的回答中,我從「cplusplus.com」引用了大量的內容:這不是我的錯(當然也不是'cplusplus.com'的人;-) C++將(C的一個版本)合併爲一個子集,因此這個答案工作得很好(而@麥克的回答指出,用'std :: fstream'做這件事不是那麼容易)。如果你認爲有更好的方法來做到這一點(使用'std :: fstream'和w/o'fopen'),爲什麼不把它發佈呢? – 2010-09-13 05:04:27

+0

如果我認爲你的答案有問題,我會對此做出評論,就像我所做的那樣。我不需要張貼我自己的答案參與。你不能混用iostream和stdio,所以你的回答最好是不相關的(stdio與iostreams的問題無關),最壞的情況是錯誤的。 C++包含C子集並不意味着在純C++程序中使用該子集是一個好主意。不是異常安全的(除非你編寫自己的包裝,否則不會自動關閉已打開的文件)足以讓我不鼓勵在純C++代碼中使用此C子集。 – camh 2010-09-13 07:18:45

1

我想如果這個工程,逗樂,因爲我總是要打開一個文件兩次做到這一點:一次讀取和一次寫。即使那樣,我也必須寫出整個文件並關閉它(刷新操作系統緩衝區),然後才能確定我能讀取整個文件,而不是早期的EOF。

時下,因爲我使用Unix風格的操作系統,我只會使用pipe()函數。不知道這是否可以在Windows中使用(因爲很多不如文件上的select())。

1

確保你正在尋找的文件的開頭讀,像這樣前:

fileFStream.seekg(0, ios_base::beg); 

如果不工作,發佈您的代碼。