c++ 读取二进制文件时tellg()=-1

我有文件夹binarytry.dat,里面是6行168750列的数据,都是unsigned char型。
我想读取第一行的数据,于是写了如下代码:
const size_t featureDim = 168750;
ifstream inin("binarytry.dat");
unsigned char arr[featureDim];
inin.read((char*)&arr,featureDim*sizeof(unsigned char));
cout<<inin.tellg()<<endl;//这里输出-1
inin.seekg(0,ios::end);
cout<<inin.tellg()<<endl<<endl;//这里也输出-1

我不明白这是为什么呢?
我测试了一下,当读到第1151个数时,tellg()=4096,我不明白这是为什么呢?
第1151个数时26

输出-1是因为inin到了文件的末尾以后,指针inin已经变成NULL或者指向未知位置。所以调用tellg()时,始终返回-1,表示失败。可以将featureDim适当调小,应该能返回正值。至于问题补充情况,是因为文件的读取方式未选择二进制。将ifstream inin("binarytry.dat");改成ifstream inin("binarytry.dat",std::ifstream::binary);应该能够解决。追问

谢谢您!!
嗯嗯,确实加了ios::binary后正确了,但是我想不明白为什么呢?

追答

读取方式会影响结果,二进制的文件应该用二进制方式读取。这可能跟文件流的内在机制有关。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-27
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。
读到文件末,返回EOF被C++eof()捕获置流为-1
二进制,EOF返回,流正常本回答被网友采纳
相似回答