gpt4 book ai didi

c++ - 为什么 basic_ifstream 显示错误的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:59 29 4
gpt4 key购买 nike

我有一个二进制文件。上半部分存储了2288*2288个经度浮点值,同样数量的纬度浮点值占据了下半部分。我使用以下代码将它们加载到浮点 vector 中。它可以像魅力一样运行,但给了我不正确的结果。关于我的二进制文件,浮点 vector 总共应该填充2288*2288*2=10469888个元素,但只有159005个,它们的值都是一样的200.0000。你能解释一下我的代码有什么问题吗?

提前致谢!

bool LoadData(const char* pszDataFile)
{
typedef char_traits<float> traits_type;
typedef std::codecvt<float, char, mbstate_t> cvt;

std::basic_ifstream<float, traits_type> input( pszDataFile, std::ios::binary );
std::locale loc(std::locale(), new cvt());
input.imbue(loc);

std::vector<float> fvBuffer;

// Copies all data into buffer
std::copy(std::istreambuf_iterator<float>(input),
std::istreambuf_iterator<float>( ),
std::back_inserter(fvBuffer));

long nSzie = fvBuffer.size(); // Wrong vector size (159005)

return true;
}

最佳答案

如果你在文件打开后 imbue() 一个文件流,imbue() 将默默地失败。

你必须执行 imbue() 然后打开文件:

std::basic_ifstream<float, traits_type> input;
std::locale loc(std::locale(), new cvt());
input.imbue(loc);

// Open after the imbue()
input.open( pszDataFile, std::ios::binary );

你的第二个问题是你混淆了术语二进制文件:

此代码使用运算符读取文本数据流(即文本文件)>>

std::copy(std::istreambuf_iterator<float>(input),          
std::istreambuf_iterator<float>( ),
std::back_inserter(fvBuffer));

打开文件时使用 std::ios::binary 只会影响“行尾序列”(EOLS) 的生成方式,与文件的性质无关文件。虽然因为您指定它,'\n' 字符不会转换为 EOLS,这在您生成二进制文件时很有用。

所以简短的回答是从文件中读取文本流会​​更好。

您的 vector 比您预期的短的原因是因为流读取遇到错误,因此停止响应读取请求。

此外,我无法编译您的代码。
所以你在做其他非标准的事情。

关于c++ - 为什么 basic_ifstream 显示错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6215092/

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