在C中,人们可以写(无视任何目的的检查)
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 :(得分:5)
致电read
后直接致电gcount
会员功能。
pf.read(&v[0],bytes);
int n = pf.gcount();
答案 1 :(得分:2)
根据http://www.cplusplus.com/reference/iostream/istream/read/:
istream& read(char* s, streamsize n);
读取数据块
读取n个字符的数据块并将其存储在s指向的数组中。如果在读取n个字符之前达到文件结尾,则该数组将包含读取的所有元素,并且将设置failbit和eofbit(可以分别使用成员fail和eof进行检查)
请注意,这是一个未格式化的输入函数,提取的内容不会存储为c字符串格式,因此在字符序列的末尾不会附加结尾的空字符。
在此函数之后调用成员gcount可以获取读取的字符总数。
所以pf.gcount()
告诉你读了多少字节。
答案 2 :(得分:1)
pf.read(&v[0],bytes);
streamsize bytesread = pf.gcount();