2012-11-21 34 views
4

在C可以寫(故意忽略任何檢查)的fread當量與fstream的

const int bytes = 10; 
FILE* fp = fopen("file.bin","rb"); 
char* buffer = malloc(bytes); 
int n = fread(buffer, sizeof(char), bytes, fp); 
... 

n將包含的實際字節數讀其可以是小於10(字節)。

你怎麼做C++中的相同呢?

我有這個,但它似乎不理想的(感覺很冗長,不額外的I/O),有沒有更好的辦法?

const int bytes = 10; 
    ifstream char> pf("file.bin",ios::binary); 
    vector<char> v(bytes); 

    pf.read(&v[0],bytes); 
    if (pf.fail()) 
    { 
    pf.clear(); 
    pf.seekg(0,SEEK_END); 
    n = static_cast<int>(pf.tellg()); 
    } 
    else 
    { 
    n = bytes; 
    } 

    ... 
+0

你可以做C的方式,但我認爲這可能不是你在找什麼。 –

+0

有什麼理由不使用[統計](http://linux.die.net/man/2/stat)?順便說一句,我認爲使用文件流方法是C++的方式。 – shinkou

回答

5

呼叫您的來電readgcount成員函數直接。

pf.read(&v[0],bytes); 
int n = pf.gcount(); 
+0

啊太棒了!就是我在找的東西! –

+0

事後做一個v.resize(n)會好嗎? –

+0

@AndersK:這聽起來很有道理,但我不知道你打算用向量做什麼,所以我不能回答你。 –

2

根據http://www.cplusplus.com/reference/iostream/istream/read/

istream& read(char* s, streamsize n);

數據
的讀取塊中讀取的n個字符,並將它存儲數據的由s指向的數組中的塊。

如果達到檔案結尾已被讀出的n個字符之前,該陣列將包含讀,直到它的所有元件,並且failbit和eofbit將被設置(其可以與成員失敗進行檢查和分別EOF )。

注意,這是一個未格式化的輸入功能,什麼被提取沒有被存儲爲C-字符串格式,因此沒有結局空字符在字符序列的末尾。能夠得到

此功能的字符的總數目讀取之後調用構件gcount的。

所以pf.gcount()告訴你讀了多少字節。

+0

+1感謝您提供豐富的答案 –

1
pf.read(&v[0],bytes); 

streamsize bytesread = pf.gcount();