2009-05-26 58 views
1

我有一個文件,我寫,然後改變它的大小,以文字寫入它像大小:文件大小c是比大小的數據串的大小不同

FILE * file... 

我得到來自文件的所有數據並將文件的大小更改爲數據大小,但不同。字符串的大小比文件長度小,並且會將其切斷並丟失數據。 可能是什麼問題?

while(fgets(cLine, sizeof(cLine), file)) 
    str.append((string)cLine); 
fputs(str.c_str(),file); 
_chsize(fileno(file), (int)str.size()); 

當我檢查它總是fileLength(fileno(file))str.size()大!

+0

這看起來不像C.你想要C還是C++? – 2009-05-26 05:26:07

+0

我正在使用從c文件但我需要c + +(我知道fstream,但爲mu目的我需要c – sofr 2009-05-26 05:37:46

+0

你改變文件大小的方式是不正確的,你依靠不正確的假設文件大小應該是相同的作爲字符串中包含的字符數 – Andrey 2009-05-26 06:17:23

回答

9

也許是CRLF?當心:

fopen(filename, "r") VS fopen(filename, "rb")

,同樣

fopen(filename, "w") VS fopen(filename, "wb")

原因是因爲"r""w"會翻譯CRLF,而"rb""wb"會將數據視爲二進制。在大多數平臺上,這被忽略。例如,fopen man page on OS X

模式串還可以包括 字母「b」無論是作爲一第三 字符或如上述任何 兩個字符的字符串的字符之間 一個字符。 這與ISO/IEC 9899:1990(「ISO C90」) 嚴格兼容性爲 ,並且不起作用; 「b」被忽略了 。

fopen page on MSDN說不同的東西:

b

開啓在二進制(非翻譯)模式; 翻譯涉及回車 和換行字符 壓制。

如果b未在給定模式中, 缺省轉換模式由 全局變量_fmode定義。如果tb 以參數爲前綴,則 函數失敗並返回NULL

有關使用文本 和Unicode的二進制模式和多字節 流I/O的更多信息,請參閱Text and Binary Mode File I/OUnicode Stream I/O in Text and Binary Modes

1

根據您在您的CR/LF和你正在運行的操作系統的代碼在做什麼,可能會有一些翻譯在後臺發生的事情,當你讀/如果你在文本模式下打開它寫入文件。

1

喬納森擊中了頭部。

確保您正在以二進制格式讀取文件,或者如果您確定該文件僅包含文本(並且這些都是您想要的),則需要準備文件字符爲unicode或其他格式。

您還會發現額外的控制字符會自動添加,尤其是EOF字符。

我的問題是,爲什麼你從文件中讀取數據,只能重新寫回來?

相關問題