2010-09-29 69 views
2

假設我想要讀取內存中的整個文件。我會以二進制模式打開它,使用fseek到達文件末尾,然後執行ftell以獲得其大小。 然後我會分配一個與文件大小相同的字符串,然後把它讀入,對不對?size_t或長爲包含文件的字符串的大小?

問題是ftell返回long int,而malloc應該收到size_t參數。現在,size_t可以long int大,據我可以告訴(我剛剛檢查C:一本參考手冊由哈比森和斯蒂爾和第11章提到size_t可以定義爲unsigned long long,取決於編譯器)。我想相反可能是真實的(這將是一個真正的問題,因爲我會投到long,或類似的東西)

所以我的問題是我該如何處理?

謝謝!

編輯:謝謝你們,那真的很快!我將使用mmap(和posix_madvise,我在找到關於mmap的信息後發現它)!

+1

正確的處理方法是跳過上述所有內容,並使用'mmap'或'CreateFileMapping' /'MapViewOfFile'(取決於您的操作系統)。 – 2010-09-29 19:41:26

回答

3

我想你想用mmap()代替。

+1

'mmap'這裏是不正確的,因爲字符串不會以null結尾。那麼除了在文件大小恰好是操作系統頁面大小的倍數的情況下,在特定情況下,您的程序將在映射後崩潰或讀入隨機的其他內存。 – 2010-09-29 21:06:05

+1

假設使用以空字符結尾的字符串處理磁盤文件中的字節很可能是錯誤的,特別是當出現「binary」一詞時。除非文件碰巧是一個序列化的以null結尾的字符串,否則通常無法獲取這些字節並將它們視爲以null結尾的字符串,無論是通過mmap還是通過讀取文件的其他方式。實際上,如果這樣做,它很可能看起來比實際文件大小要短得多,因爲在文件的最後一個字節之前,文件中的某個點可能會有一個空字節。 – Nico 2010-09-30 14:42:02

1

我認爲鑄造的問題是沒有意義的。由於兩個中的較小者long的最大值爲+ 2^31(如果已簽名),如果您一次讀完所有內容,則會佔用2GB的內存。這通常是一個壞主意。

1

如果你的文件足夠大,這是一個問題,它們也足夠大,內存分配幾乎肯定會失敗。

請不要擔心它,或切換到操作系統特定的內存映射技術。

相關問題