2013-03-05 42 views
2

我已經創建了一個解析器類來接收大量文本文件並執行各種操作。作爲這個類的成員,我有一個ifstream對象,它的縮寫爲ifstream fin。我有一個函數void SetFile(char* filename),該函數接受一個C字符串文本,並且應該調用fin.open()將該流連接到該文件,但由於某種原因,fin.fail()fin.open()調用後立即返回true。這是我的解析器類,希望有人注意到我做錯了!謝謝你的時間。正確使用ifstream對象作爲類的成員

Parser.h

#ifndef PARSER_H 
#define PARSER_H 
#include <fstream> 
#include <cstdlib> 
#include "Heap.h" 
#include "Word.h" 

enum FILESTREAM_ERRORS{OPEN_ERROR}; 

class Parser 
{ 
public: 
    Parser(); 
    void SetFile(const char *filename); 
    void LoadHeap(); 

//private: 
    int word, line, paragraph; 
    ifstream fin; 
    Heap<Word> *wordheap; 
    void LoadWord(); 
}; 

Parser::Parser() 
{ 
    word = line = paragraph = 0; 
} 

void Parser::SetFile(const char* filename) 
{ 
    fin.open(filename); 
    if(fin.fail()) 
     throw OPEN_ERROR; 
} 

void Parser::LoadWord() 
{ 
    QString wordstring; 
    char c; 
    fin.get(c); 
    if (c == '\n') 
    { 
     char p = fin.peek(); 
     if (p == '\n') 
     { 
      fin.get(c); 
      paragraph++; 
     } 
     line++; 
     fin.get(c); 
    } 
    while (isblank(c)) 
     fin.get(c); 
    while (!isblank(c)) 
     wordstring.append(c); 
    word++; 
    cout << qPrintable(wordstring) << endl; 
} 

#endif // PARSER_H 
+0

提示:爲您的異常管理使用一個類(請參閱 http://www.cplusplus.com/reference/stdexcept/)。我建議std :: runtime_error或一個子類。 – Geoffroy 2013-03-05 23:29:03

+0

什麼是文件名?調試器顯示了什麼?如何調用SetFile?請發佈最少量的可重新編譯的代碼,包括預期和實際的輸入和輸出。 – 2013-03-05 23:35:29

回答

2

檢查你的文件存在,就可以有效閱讀。

激活std::ios exceptions以獲取有關該錯誤的更多信息。

fail的另一個可能的原因是fstream已經有一個文件關聯到它。嘗試打開操作之前,請用is_open進行檢查。


從德魯·多爾曼評論更新:

如果指定相對路徑,即不是絕對路徑(通常與Windows上的驅動器盤符或在* nix斜線開始),你應該考慮當前工作目錄(CWD)的值。此值通常默認爲可執行文件的目錄,但某些操作系統或IDE可能會更改它,當然您的程序也可以更改它。

因此,如果您使用相對路徑,請檢查CWD(您可以在* nix上使用getcwd獲取它),或者爲了測試目的使用絕對路徑。

+1

這也許值得回顧一下「工作目錄」的含義。一個常見的錯誤是認爲相對文件路徑應該總是相對於可執行文件。 – 2013-03-05 23:36:51

+0

@DrewDormann更新,謝謝。 – Geoffroy 2013-03-05 23:45:17

+0

我把我的文件放在項目目錄的錯誤部分。我認爲它屬於頭文件所在的文件夾,但實際上它希望它位於包含發佈/調試文件夾的文件夾中。 – BrownBeard93423 2013-03-06 20:02:18

相關問題