我有这个简单的代码,在文件中搜索“数据”步步在PCM WAV文件中使用FSEEK工作:C++ O3优化符while循环
FILE * waveFile;
waveFile = fopen (this->fileLocation.c_str (), "rb");
// ... some other code here between, then ... //
int seekTo = 0;
bool found = false;
char data[4];
rewind (waveFile);
while (!found && (fseek (waveFile, seekTo, SEEK_SET) == 0)) {
fread (data, sizeof (data), 1, waveFile);
if ((std::strcmp (data, "data") == 0) || (std::strcmp (data, "Data") == 0) || (std::strcmp (data, "DATA") == 0)) {
found = true;
fread (&waveHeader->DATA_SIZE, sizeof (waveHeader->DATA_SIZE), 1, waveFile);
}
seekTo++;
}
的代码工作正常,并在测试文件它找到数据,读取剩余的数据。由于“数据”即使是最大的文件也接近开始,所以这段代码对我来说可以。
但是,当我添加cpp标志-O3时,代码变得不合时宜,while循环永远不会结束。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
我使用cmake + LLDB(OSX,克利翁),如果我用GDB同样的事情发生。
有什么问题,我该如何解决这个问题?
PS。我并没有试图改进你看到的代码,我试图理解为什么编译器优化会在循环中破解这个。
PSS。 这里是终止工作代码空:
int seekTo = 0;
char data[5];
rewind (waveFile);
while ((fseek (waveFile, seekTo, SEEK_SET) == 0)) {
fread (data, 4, 1, waveFile);
data[ 4 ] = '\0';
if ((std::strcmp (data, "data") == 0) || (std::strcmp (data, "Data") == 0) || (std::strcmp (data, "DATA") == 0)) {
fread (&waveHeader->DATA_SIZE, sizeof (waveHeader->DATA_SIZE), 1, waveFile);
break;
}
seekTo += 1;
}
'std :: strcmp(data,“data”)== 0'读出'data'的范围。你忘记了空终止。也许你想''memcmp'长度为'4'。 –
你还应该检查'fread'是否成功,如果失败,请打破循环 –
@ M.M我原来在代码中检查了fread的size_t,它在某些时候返回0。但是,在每个文件中都有“数据”,并且在找到任何内容之前都已经达到文件结尾。所以我删除了调试结束检查。 – emrahgunduz