2012-11-21 22 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();