gpt4 book ai didi

c++ - 使用 std::find 查找从二进制文件读取的字符并转换为 std::vector 中的 std::string 会产生这种不可预测的行为吗?

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

抱歉,标题太长了。我不知道如何用简短的词来形容它。

你愿意重现我正在经历的问题吗?

您可以使用任何 wav 文件来阅读。

我在这里尝试查询 wav 文件中的 block ,这是代码的简化版本,但我认为如果出现问题,重新创建可能就足够了。

我用的是 mac,用 g++ -std=c++11 编译.

当我运行此代码并且不包括行 std::cout << query << std::endl; 时然后std::find(chunk_types.begin(), chunk_types.end(), query) != chunk_types.end()在所有迭代中返回 0。但我知道二进制文件包含其中一些 block 。如果我包含该行,那么它可以正常工作,但这也是不可预测的,可以说它有时可以正常工作。

我有点困惑,我在这里做错了什么吗?

#include <fstream>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main(){

std::vector<std::string> chunk_types{
"RIFF","WAVE","JUNK","fmt ","data","bext",
"cue ","LIST","minf","elm1",
"slnt","fact","plst","labl","note",
"adtl","ltxt","file"};

std::streampos fileSize;
std::ifstream file(/* file path here */, std::ios::binary);
file.seekg(0, std::ios::beg);

char fileData[4];

for(int i{0};i<100;i+=4){ //100 is an arbitrary number

file.seekg(i);
file.read((char*) &fileData[0], 4);
std::string query(fileData);

std::cout << query << std::endl;

/* if i put this std::cout here, it works or else std::find always returns 0 */


if( std::find(chunk_types.begin(), chunk_types.end(), query) != chunk_types.end() ){
std::cout << "found " + query << std::endl;
}

}

return 0;

}

最佳答案

std::string query(fileData)fileData 上使用 strlen 来查找它的终止 0,但没有找到,因为 fileData 不是零终止的,它会继续在堆栈中搜索 0,直到找到它或遇到超出堆栈末尾的不可访问内存并导致 SIGSEGV

另外file.read可以读取的符号比预期少,必须使用gcount来提取上次读取的实际字符数:

修复:

file.read(fileData, sizeof fileData);
auto len = file.gcount();
std::string query(fileData, len);

一个稍微更有效的解决方案是直接读入 std::string 并继续重用它以避免内存分配(如果没有短字符串优化)和复制:

std::string query;
// ...
constexpr int LENGTH = 4;
query.resize(LENGTH);
file.read(&query[0], LENGTH);
query.resize(file.gcount());

关于c++ - 使用 std::find 查找从二进制文件读取的字符并转换为 std::vector<string> 中的 std::string 会产生这种不可预测的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026110/

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