2012-09-10 59 views
1

使用Linux系統調用打開讀取。該閱讀調用接受3個參數將文件讀入C中的char數組中:或者如何動態分配數組?

read(File descriptor, Buffer array, Size of the buffer array); 

我的問題是有關說法3#。假設我有多個文本文件需要讀入我的緩衝區數組中。但據我所知C沒有像VectorArrayList或任何其他具有動態大小的結構。

有沒有簡單的方法來計算文件的大小,所以我知道我應該爲我的char數組分配多少空間?

+1

linux上的'man 2 stat'。 –

回答

7

stat()該文件可能以確定其大小,然後撥打mmap()就可以了。您的文件將顯示爲「陣列」,而不需要malloc()內存。

+0

我可能會避免嘗試將數組和指針等同起來,即使只是爲了使事情變得簡單。 – oldrinb

+0

美麗的答案 – cnicutar

2

那麼,如果你在Linux上,你可以使用stat(2)來獲取文件大小。結構stat包含字段st_size,其指示總大小(以字節爲單位)。


正在讀取內存中的整個文件真的是最好的方法嗎?

+0

'off_t'是否安全轉換爲'size_t'? – oldrinb

+0

@oldrinb不確定: - ?不要這麼想 – cnicutar

+0

我只是好奇,因爲'malloc'需要'size_t'。 – oldrinb

1

通常的做法是讀入固定長度的緩衝區,然後將每個「記錄」複製到動態分配的結構中(例如malloc(),struct *或char *)。

正如cnicutar建議的那樣,您還可以「統計」文件,malloc()一個大小的緩衝區,並一次讀取文件。

+0

爲什麼不'realloc? – oldrinb

2

我不知道這是否有資格作爲有效的,但它是「易」簡單地從那裏轉移到文件末尾,抓住長度:

fseek(readf, 0, SEEK_END); 
    fileLen=ftell(readf); 
    buffer=(char *)malloc(fileLen); 
+0

'ftell'返回'long int';可以安全地轉換爲'size_t'嗎? – oldrinb

+0

@oldrinb看到我對它的其他評論。基本上,不要擔心所有這些不可缺少的類型...... – 2012-09-10 18:16:11

+0

@ H2CO3我並不特別擔心演員是否會出演......演員陣容可能會帶來令人驚喜的事情:-) – oldrinb

相關問題