7

在 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;
  }

  ...
4

3 回答 3

8

在调用 . 之后直接调用gcount成员函数read

pf.read(&v[0],bytes);
int n = pf.gcount();
于 2012-11-21T06:34:55.910 回答
3

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

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

读取数据块
读取 n 个字符的数据块,并将其存储在 s 指向的数组中。

如果在读取 n 个字符之前到达文件结尾,则数组将包含直到它读取的所有元素,并且将设置 failbit 和 eofbit(可以分别通过成员 fail 和 eof 进行检查)。

请注意,这是一个未格式化的输入函数,提取的内容不存储为 c-string 格式,因此在字符序列的末尾没有附加结束空字符。

在此函数后调用成员 gcount 可以获得读取的字符总数。

所以pf.gcount()告诉你读取了多少字节。

于 2012-11-21T06:35:01.807 回答
1
pf.read(&v[0],bytes);

streamsize bytesread =  pf.gcount();
于 2012-11-21T06:40:30.520 回答