我在运行和调试这段代码时遇到问题:
bool readSectionHeaders(char* path, int numOfSections, int peSectionsOff, IMAGE_SECTION_HEADER* out) {
bool retr = false; //return value
//open file
FILE* file;
file = fopen (path, "rb");
if(file == NULL) {
perror("WRG"); //TODO
return false;
}
do { //do while(false) only for easier error correction
//seek to first section
fseek(file, peSectionsOff, SEEK_SET);
//read all sections
unsigned int count;
IMAGE_SECTION_HEADER sectionHeaders[numOfSections];
count = fread(sectionHeaders, sizeof(IMAGE_SECTION_HEADER), numOfSections, file);
//check Bytes count
if(count != sizeof(IMAGE_SECTION_HEADER)*numOfSections) {
break;
}
//copy sections
memcpy(out, sectionHeaders, count);
//exit successfully
retr = true;
} while(false);
//exit
fclose(file);
return retr;
}
奇怪的是,即使它读取文件,它也会返回false。我试着调试它,这是最奇怪的部分。
我一行一行地直到这个
if(file == NULL) {
然后,即使file不是NULL,它也会跳过perror并移至
return false;
但根本不回来。
我再次一行一行直到
retr = true;
它似乎做了什么,但是后来仍然是假的。
然后它关闭文件并返回false。
我从未遇到过这样的事情。 我尝试清理项目,重建,甚至删除文件,并从subversion重新加载它们。在使用此功能之前,我使用类似的功能 - 我读取PE头。所以我虽然问题可能在于读取文件但它没有解释调试行为。
从函数返回后,我使用perror并写入No error。
我在QtCreator中使用mingw。
提前致谢。
答案 0 :(得分:0)
我会做更像这样的事情,如果它能够加载整个数组,那么它将返回true。
std::ofstream file(path, std::ios::binary);
if(!file) {
std::cerr << "failed to load file" << std::endl;
return false;
}
file.seekg (peSectionsOff, ios::beg);
IMAGE_SECTION_HEADER sectionHeaders[numOfSections];
size_t size=sizeof(sectionHeaders)*numOfSections;
return //return true if the whole buffer is filled
file.readsome(static_cast<char*>(sectionHeaders), size) == size;
UNTESTED
这可能会有所帮助 http://en.cppreference.com/w/cpp/io
答案 1 :(得分:0)
好的,这是我和明星的问题。我重新安装了整个QtSDK没有任何效果。然后我安装了不同版本的mingw并设置qt creator以使用它。现在调试器没有问题。我不确定发生了什么,但cerr&lt;&lt; “测试”;也停止了与老明星合作,这是100%正确。
正如111111所建议的,问题在于if break子句。我认为read返回读取的字节数,这根本不是真的:)。
现在它正在工作,感谢111111的建议:)。