2014-01-07 30 views
0

我想要做的是相當基本的,但我有我的項目的麻煩。我的項目太大而無法包含所有內容,所以我只包含我正在編寫的兩個函數以及txt文件的外觀。這是在C++中。文件流讀取和寫入文本文件,然後轉換爲二進制文件在c + +

bookmark.cfg

No Title 
0 0 0 0 0 0 

No Title 
1 1 1 1 1 1 

No Title 
2 2 2 2 2 2 

No Title 
3 3 3 3 3 3 

No Title 
4 4 4 4 4 4 

No Title 
5 5 5 5 5 5 

這些都是我的寫作和閱讀的文本文件中的兩個函數和我的類的私有結構

struct BookMark { 
    std::string strFilename; 
    unsigned id; 
    unsigned bookID; 
    unsigned chapterNumber; 
    unsigned pageNumber; 
    unsigned lineNumber; 
    unsigned columnNumber; 
}; // BookMark 

// ---------------------------------------------------------------------------- 
// readConfigFile() 
bool BookManager::readConfigFile() { 
    using namespace std; 

    // Just To Be Safe Incase This Function Is Called In Multiple Places 
    _mBookMarks.clear(); 

    ifstream inFile(_strConfigFilename); 
    if (inFile.fail()) { 
     throw ExceptionHandler(__FUNCTION__ + std::string(" failed, could not open ")  + _strConfigFilename + std::string(" \nfor reading in book mark information \nInvalid file or file does not exist")); 
    } 

    // Read In The Book Mark Contents 
    std::vector<BookMark> vBookMarks; 
    BookMark bookMark; 
    string tempString = ""; 

    if (inFile.is_open()) { 
     while (!inFile.eof()) { 
      BookMark bookMark; 
      getline(inFile, bookMark.strFilename); 
      inFile >> bookMark.id; 
      inFile >> bookMark.bookID; 
      inFile >> bookMark.chapterNumber; 
      inFile >> bookMark.pageNumber; 
      inFile >> bookMark.lineNumber; 
      inFile >> bookMark.columnNumber; 
      getline(iniFile, tempString); 
      //_mBookMarks.insert(make_pair(bookMark.id, bookMark)); 
      vBookMarks.push_back(bookMark); 
     } 
    } 

    inFile.close(); 

    return true; 
} // readConfigFile 



// ---------------------------------------------------------------------------- 
// writeConfigFile() 
bool BookManager::writeConfigFile() { 
    using namespace std; 

    ofstream outFile; 
    outFile.open(_strConfigFilename, fstream::out); 
    if (outFile.fail()) { 
     throw ExceptionHandler(__FUNCTION__ + std::string(" failed, could not open ")  + _strConfigFilename + std::string(" \nfor writing book mark contents to file.")); 
    } 

    // Write Out Book Mark Contents 
    if (outFile.is_open()) { 
     unsigned i = 0; 
     for (i = 0; i < _mBookMarks.size(); i++) { 
      outFile << _mBookMarks.at(i).strFilename  << endl; 
      outFile << _mBookMarks.at(i).id    << " "; 
      outFile << _mBookMarks.at(i).bookID   << " "; 
      outFile << _mBookMarks.at(i).chapterNumber << " "; 
      outFile << _mBookMarks.at(i).pageNumber  << " "; 
      outFile << _mBookMarks.at(i).lineNumber  << " "; 
      outFile << _mBookMarks.at(i).columnNumber  << endl << endl;    
     } 
    } 

    outFile.close(); 

    return true; 
} // writeConfigFile 

我遇到的問題是,當我打電話寫功能所有的文本都正確顯示在我的文本文件中。第一行應該是一個包含書名或文件名的字符串。第二行應該是所有未簽名的整數,以指定參數以瞭解書籤位置的位置。到目前爲止,我只是使用for循環來填充任意數據的類結構,並遞增每個書籤參數以測試這些函數。在我的代碼中的其他地方,我首先調用我的寫入方法來創建此文本文件並寫入內容。這似乎工作正常。然後我調用我的讀取方法來讀取文件並填充我的結構的臨時向量,以查看從文件讀取的內容是否有效。一旦我得到這個工作正常,我會然後填充我的類的成員變量結構。

這裏我正在閱讀第一行使用getline函數,然後我使用流操作符來獲取其餘內容。當我通過read方法調試我的代碼並檢查我的臨時向量時,第一個元素具有正確的值,且沒有標題,每個參數都爲0.當我檢查下一個元素時,下一個BookMark結構對象中沒有字符串並且所有的值都是0.另外,我的臨時向量中應該只有5個元素,並且它應該跳出循環,但它會繼續,並且永遠不會跳出循環。爲什麼代碼的行爲如此?我做錯了什麼?我如何改變這種行爲來獲得我正在尋找的行爲?

如果你需要完整地看到這個類,讓我知道,但我認爲其餘的課並不重要,因爲我想要做什麼,只有這兩個函數應該足以描述我的情況。一旦我得到這個工作正常,然後我會改變讀取和寫入方法工作在二進制文件,而不是文本。

+0

請指明這是寫入的語言。 –

+0

從寫入函數的外觀您的書寫和每個書籤結構之間的空行,但是您不佔用讀取方法中的空行 –

+0

我知道你是說,我已經嘗試了這與一個臨時字符串和使用getline(此文件流,tempString)並獲得相同的結果 –

回答

0

我相信我已經解決了我自己的問題。在我的閱讀方法中,我不得不添加第二個getline(this fileStream,tempString);現在我的代碼似乎正常工作。我的向量具有正確的值,它只有5個元素,現在打破了循環。

相關問題