我在c ++中有这个代码(在我做了一些测试之后才知道为什么我无法从文件中读取足够的数据,因此它不是最终代码,我希望找到为什么我得到这个结果)
size_t readSize=629312;
_rawImageFile.seekg(0,ifstream::end);
size_t s=_rawImageFile.tellg();
char *buffer=(char*) malloc(readSize);
_rawImageFile.seekg(0);
int p=_rawImageFile.tellg();
_rawImageFile.read(buffer,readSize);
size_t extracted = _rawImageFile.gcount();
cout << "s="<< s <<endl;
cout << "p="<< p <<endl;
cout << "readsize="<< readSize<<endl;
cout << "extracted="<< extracted <<endl;
cout << "eof ="<< _rawImageFile.eofbit<<endl;
cout << "fail="<< _rawImageFile.failbit <<endl;
输出如下:
s=3493940224
p=0
readsize=629312
extracted=2085
eof =1
fail=2
正如你所看到的文件大小是3493940224并且我在文件的开头(p = 0)而我正在尝试读取629312字节,但我只能读取2085字节?
此代码有什么问题?我在其他方法中打开了这个文件并从中读取了一些数据,但我使用seekg将指针移动到文件的开头。
该文件以二进制文件形式打开。
编辑1
要找到解决方案,我将所有代码放在一个函数中,就在这里:
_config=config;
ifstream t_rawImageFile;
t_rawImageFile.open(rawImageFileName,std::ifstream::in || std::ios::binary );
t_rawImageFile.seekg (0);
size_t readSize=629312;
t_rawImageFile.seekg(0,ifstream::end);
size_t s=t_rawImageFile.tellg();
char *buffer=(char*) malloc(readSize);
t_rawImageFile.seekg(0);
size_t p=t_rawImageFile.tellg();
t_rawImageFile.read(buffer,readSize);
size_t x=t_rawImageFile.tellg();
size_t extracted = t_rawImageFile.gcount();
cout << "s="<< s <<endl;
cout << "p="<< p <<endl;
cout << "x="<< x <<endl;
cout << "readsize="<< readSize<<endl;
cout << "extracted="<< extracted <<endl;
cout << "eof ="<< t_rawImageFile.eof()<<endl;
cout << "fail="<< t_rawImageFile.fail() <<endl;
结果是:
s=3493940224
p=0
x=4294967295
readsize=629312
extracted=2085
eof =1
fail=1
有趣的是,读取后文件指针移动到一个非常大的值。是否有可能由于文件大小很大,应用程序失败了?
编辑2
使用其他文件测试相同的代码。结果如下:
s=2993007872
p=0
x=4294967295
readsize=629312
extracted=1859
eof =1
fail=1
我从这个测试中可以看到的是: 读取后,文件指针移动到一个总是相同的大数字。它读取的数量取决于文件(!)。
编辑3
将size_t更改为fstream :: pos_type后,结果如下:
s=2993007872
p=0
x=-1
readsize=629312
extracted=1859
eof =1
fail=1
为什么文件位置在读取后会变为-1?
答案 0 :(得分:2)
t_rawImageFile.open(rawImageFileName, std::ifstream::in || std::ios::binary );
...不以二进制模式打开文件。由于||
是惰性或运算符且std::ifstream::in
不为零,因此整个表达式的值为1
。
t_rawImageFile.open(rawImageFileName, std::ifstream::in | std::ios::binary );
......一定会更好。
答案 1 :(得分:1)
您没有显示正在打开文件的部分,但我很确定它缺少ios::binary
以确保C运行时代码不解释CTRL-Z(或CTRL-D) )作为文件的结尾。
答案 2 :(得分:1)
更改此行:
t_rawImageFile.open(rawImageFileName,std::ifstream::in || std::ios::binary );
进入这个:
t_rawImageFile.open(rawImageFileName,std::ifstream::in | std::ios::binary );