gpt4 book ai didi

c++ - 当文件有足够的数据c++时无法从文件中读取足够的数据

转载 作者:行者123 更新时间:2023-11-27 23:15:07 25 4
gpt4 key购买 nike

我在 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?

最佳答案

t_rawImageFile.open(rawImageFileName, std::ifstream::in || std::ios::binary );

...不以二进制模式打开文件。由于 || 是惰性或运算符并且 std::ifstream::in 不为零,因此整个表达式的值为 1

t_rawImageFile.open(rawImageFileName, std::ifstream::in | std::ios::binary );

...肯定会更好。

关于c++ - 当文件有足够的数据c++时无法从文件中读取足够的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16855887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com