2017-04-12 33 views
0

我目前正試圖在Visual Studio上編寫的程序在Qt上創建一個GUI。在vs中,運行代碼時沒有問題。當我在聲明中使用ifstream時,我的Qt程序編譯但崩潰

我創建了一個在Qt中運行良好的窗口,然後我決定從Visual Studio中添加一個類。我將它們添加到項目中,並進行編譯。編譯期間沒有錯誤。但是當我嘗試運行該程序時,它在顯示之前會崩潰,並顯示以下消息:「該程序已意外完成。」即使我實際上沒有調用該類的任何方法。

看來,如果我拿出使用ifstream File的代碼的所有部分,它不會崩潰。

下面是從類的完整代碼CPP:

#include "tableManager.h" 

ifstream ifsFile; // Stream du fichier en lecture 

tableManager::tableManager(void) 
{ 
    setTypeS(); 
} 

tableManager::tableManager(string fileN) 
{ 
    setTypeS(); 
    openFile(fileN); 
} 


tableManager::~tableManager(void) 
{ 
    ifsFile.close(); 
} 
string tableManager::getFileName() 
{ 
    return fileName; 
} 

int tableManager::getNbrTables() 
{ 
    return nbrTables; 
} 

int tableManager::getTypeData(int i) 
{ 
    return typeData[i]; 
} 

string tableManager::getTypeDataS(int i) 
{ 
    return typeDataS[typeData[i]]; 
} 

string tableManager::getName(int i) 
{ 
    return name[i]; 
} 

int tableManager::getNbrL(int i) 
{ 
    return nbrL[i]; 
} 

int tableManager::getNbrC(int i) 
{ 
    return nbrC[i]; 
} 

int tableManager::openFile(string fileN) 
{ 

    fileName = fileN; 
    ifsFile.open(fileName, ios::in | ios::binary); 
    if(ifsFile.is_open()) 
    { 
     std::cout << "Lecture du fichier binaire" << endl << endl; 
     nbrTables = readNbrTables(); 
     for(int i = 0; i < nbrTables; i++) 
     { 
      std::cout << endl; 
      typeData[i] = readTypeData(i); 
      name[i] = readTableName(i); 
      labelP.push_back(name[i]); 
      nbrL[i] = readNbrL(i); 
      nbrC[i] = readNbrC(i); 

      if(!readDataOCV(i)) 
      { 
       std::cout << "Les donnees n'ont pu etre chargees" << endl; 
       return 0; 
       break; 
      } 
     } 
    } 
    else 
    { 
     std::cout << "Erreur de lecture du fichier binaire" << endl; 
     return 0; 
    } 
    std::cout << endl; 
    return 1; 
} 

int tableManager::setTypeS() 
{ 
    typeDataS[0] = "char"; 
    typeDataS[1] = "unsigned char"; 
    typeDataS[2] = "short"; 
    typeDataS[3] = "unsigned short"; 
    typeDataS[4] = "integer"; 
    typeDataS[5] = "unsigned integer"; 
    typeDataS[6] = "float"; 
    typeDataS[7] = "double"; 
    typeDataS[8] = "MAC adress"; 
    return 1; 
} 

uint32_t tableManager::readNbrTables() 
{ 
    uint32_t a; 
    ifsFile.read(reinterpret_cast<char *>(&a), sizeof(a)); 
    std::cout << "Nbr de tables : " << a << endl; 
    return a; 
} 

uint32_t tableManager::readTypeData(int k) 
{ 
    uint32_t a; 
    ifsFile.read(reinterpret_cast<char *>(&a), sizeof(a)); 
    std::cout << "Type de donnees de la " << (k+1) << "e table : " << a - 1 << " --> " << typeDataS[a - 1] << endl; 
    return (a - 1); 
} 

string tableManager::readTableName(int i) 
{ 
    uint32_t a; 
    ifsFile.read(reinterpret_cast<char *>(&a), sizeof(a)); 
    nameLength[i] = a; 
    string nameTmp; 
    char c; 
    for(int l = 0; l < a; l ++) 
    { 
     ifsFile.read(&c, sizeof(c)); 
     nameTmp += c; 
    } 
    std::cout << "Le nom de la " << (i + 1) << "e table : " << nameTmp << endl; 
    return nameTmp; 
} 

uint32_t tableManager::readNbrL(int j) 
{ 
    uint32_t a; 
    ifsFile.read(reinterpret_cast<char *>(&a), sizeof(a)); 
    std::cout << "Nbr de lignes de la " << (j+1) << "e table : " << a << endl; 
    return a; 
} 

uint32_t tableManager::readNbrC(int l) 
{ 
    uint32_t a; 
    ifsFile.read(reinterpret_cast<char *>(&a), sizeof(a)); 
    std::cout << "Nbr de colonnes de la " << (l+1) << "e table : " << a << endl; 
    return a; 
} 


vector<Mat> tableManager::getDataP() 
{ 
    return dataP; 
} 
vector<string> tableManager::getLabelP() 
{ 
    return labelP; 
} 

int tableManager::readDataOCV(int m) 
{ 
    int cpt = 0; 
    int total = nbrC[m]*nbrL[m]; 
    if(typeData[m]==8) nbrL[m]=6; 
    Mat tmpM(Size(nbrC[m], nbrL[m]), CV_64FC1); 

    switch (typeData[m]) 
    { 
    case 0: 
     char x0; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x0), sizeof(x0)); 
       tmpM.at<double>(Point(n,o)) = x0; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 1: 
     unsigned char x1; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x1), sizeof(x1)); 
       tmpM.at<double>(Point(n,o)) = x1; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 2: 
     short x2; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x2), sizeof(x2)); 
       tmpM.at<double>(Point(n,o)) = x2; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 3: 
     unsigned short x3; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x3), sizeof(x3)); 
       tmpM.at<double>(Point(n,o)) = x3; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 4: 
     int x4; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x4), sizeof(x4)); 
       tmpM.at<double>(Point(n,o)) = x4; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 5: 
     unsigned int x5; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x5), sizeof(x5)); 
       tmpM.at<double>(Point(n,o)) = x5; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 6: 
     float x6; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       //cout << "test 1" <<endl; 
       ifsFile.read(reinterpret_cast<char *>(&x6), sizeof(x6)); 
       //cout << "test 2" << endl; 
       tmpM.at<double>(Point(n,o)) = x6; 
       cpt++; 
       //cout << "test 3" << endl; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 7: 
     double x7; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x7), sizeof(x7)); 
       tmpM.at<double>(Point(n,o)) = x7; 
       cpt++; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    case 8: 
     uint8_t x8; 
     tmpM.empty(); 
     for(int n = 0; n < nbrC[m]; n++) 
     { 
      for(int o = 0; o < nbrL[m]; o++) 
      { 
       ifsFile.read(reinterpret_cast<char *>(&x8), sizeof(x8)); 
       tmpM.at<double>(Point(n,o)) = x8; 
      } 
     } 
     dataP.push_back(tmpM); 
     std::cout << "Les " << cpt << "/" << total << " donnees ont ete chargees avec succes" << endl; 
     break; 
    default: 
     std::cout << "Erreur de lecture des donn�es, type non d�fini"; 
     return 0; 
     break; 
    } 
    return 1; 
} 

正如我說,如果我拿出的是使用ifstream的功能,它可以正常運行。如果我不這樣做,它會編譯,但在執行時崩潰。

如果您發現任何問題,非常感謝您的回答!

+0

哪一行產生錯誤?用調試器運行你的項目,看看會發生什麼。由於您正在使用Visual Studio,請轉到「調試」菜單並單擊「開始調試」。 –

+0

因爲你似乎在使用全局變量,你可能會遭受[靜態初始化順序失敗](http://stackoverflow.com/questions/3035422/static-initialization-order-fiasco)。 –

+0

其實我正在使用Qt。我在Visual Studio上編寫的類將其導入到Qt中。我要檢查這個鏈接非常感謝。問題是我需要創建該類的不同對象,但如果將ifstream設置爲屬性,則無法存儲這些對象,這就是爲什麼我使用了全局變量。 –

回答

0

我發現了我的問題,即使並沒有看到它是如何與ifstream相關的。我需要在目錄中添加openCV的.dll文件,我忘了把它們放回去。因此它編譯了,但在Startup上崩潰。希望這有助於! 感謝您的幫助:)

相關問題