在寻找读取文件和解析数据的最快算法的过程中,出现了错误。最初,文件中可读行的类型(即感兴趣的float类型的最后一个数字,其余为垃圾):12242BENZ H6 24 11.060 8.703 4.112
例如,由于在 Habré 上介绍了使用 iostream的不同方法,由于我在 c ++ 方面的资质较低,我决定不费心使用 Boost::Spirit::Qi(尽管如果有工匠可以建议通过 Boost: :Spirit::Qi 解析器创建浮点数的方法,我将不胜感激)并使用一个相当简单的算法:
ifstream fid("Benzene_Simu1_0_35ns.gro");
if (!fid) throw exception("Bad opening");
std::ios::sync_with_stdio(false);
char buffer[80];
char * test;
//vector <float> coordinates(3);
float coordinates = 0.0;
vector <float> coordinate;
while (true)
{
if (fid.eof()) break;
fid.ignore(std::numeric_limits<size_t>::max(), '\n');
fid.ignore(std::numeric_limits<size_t>::max(), '\n');
for (int i = 0; i < 120; i++) {
fid.getline(buffer, sizeof(buffer));
test = strrchr(buffer, ' '); //take pointer on last float in string
std::advance(test, 1);
sscanf(test, "%f", &coordinates); //select z_axis value
coordinate.push_back(coordinates);
}
fid.ignore(std::numeric_limits<size_t>::max(), '\n');
}
cout << coordinate[sizeof(coordinate) - 1] << endl;
cout << clock()/1000 << endl;
_getch();
所以,作为这样一个算法在代码行中运行的结果
sscanf(test, "%f", &coordinates); //select z_axis value
一个错误
Unhandled exception at 0x5B031BCC (ucrtbased.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0x00000001. occurred
对于这种情况和代码会有什么评论和评论?
如果没有找到空间,它将
strrchr(buffer, ' ');返回一个空指针。因此,您需要 1) 检查您的行是否已被读取,2) 检查是否找到了空格。除其他外,您有一堆忽略的行(即无处读取它们)+ 不正确的文件结尾检查。所以问题是 - 你确定你读过这些台词吗?
您没有检查该行是否已被读取...也许缓冲区中有一些废话?
顺便说一句,你
advance(test,1)的完全没用。与检查是否test == nullptr...