2012-02-23 19 views
0

私は、問題のコードのこの部分を実行するとデバッグがあります奇妙な行動

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を返すということです。私はそれをデバッグしようとした、そして、ここでは、最も奇妙な部分です。

は、私はそれが

return false; 

にperrorはおよび移動をスキップしかし、全く戻らないファイルがNULLではないにもかかわらず、その後、この1

if(file == NULL) { 

まで行ずつ行きます。

私は再び

何かをしているようだ
retr = true; 

まで行ずつ行く、しかしRETRは偽のまま。

次にファイルを閉じ、falseを返します。

私はこのようなことをしたことはありません。 私は、プロジェクトを掃除しようとしました、再構築、さらにはファイルを削除し、それらをsubversionから再ダウンロードしました。この関数を使う前に、私は似たようなものを使っています。私はPEヘッダを読みました。ですから、私はファイルを読むことに問題があるかもしれませんが、デバッグの動作を説明していません。

関数から復帰した後、私はperrorを使用し、Noエラーを書き込みます。

私はmingwをQtCreatorで使用します。

ありがとうございます。

+0

? それは何ですか? – Samuel

+0

OK、それはC++です。私はブールに気づきましたが、それは非常にCのようです(悪いです)。あなたのエラーはあなたのif(...)ブレークに来ていると思います。句。 – 111111

+0

それは非常にCのような(それは悪いです) - ありがとう、それは本当に悪いか悪い習慣ですか? – Samuel

答えて

0

役に立つかもしれません、これは両方の私とmingwのの問題でした。 QtSDK全体を再インストールしても何の効果もありません。それから、別のバージョンのmingwをインストールし、それを使用するためにqt creatorを設定しました。デバッガは問題なく動作します。私は何が起こったのか分かりませんが、cerr < < "テスト";また、古い丁との作業を停止し、これは100%正しいです。

111111が示唆したように、問題はブレーク句の場合です。私は読書のバイト数を読んで、これは単に真実ではないと思った:)。

111111のおかげで、彼の提案に感謝しています:)

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; 

テストされていない

これは、[OK]を http://en.cppreference.com/w/cpp/io