文件流读取和写入文本文件,然后在c ++中转换为二进制文件

时间:2014-01-07 20:50:47

标签: file-io fstream ifstream ofstream

我想要做的是相当基本的但是我的项目遇到了麻烦。我的项目太大而无法包含所有内容,因此我将只包含我正在编写的两个函数以及txt文件的外观。这是用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

我遇到的问题是,当我调用write函数时,所有文本都在我的文本文件中正确显示。第一行应该是包含书籍标题或文件名的字符串。第二行应该是所有无符号整数,以指定参数以了解书签位置的位置。到目前为止,我只使用for循环使用任意数据填充我的类结构,并递增每个书签参数以测试这些函数。在我的代码中的其他地方,我首先调用我的write方法来创建这个文本文件并编写内容。这似乎工作正常。然后我调用我的read方法读取文件并填充我的结构的临时向量,以查看从文件中读取的内容是否有效。一旦我正常工作,我就会填充我班级的成员变量结构。

这里我使用getline函数读取第一行,然后我使用流操作符来获取其余内容。当我通过read方法调试我的代码并检查我的临时向量时,第一个元素具有No Title的正确值,每个参数都是0.当我检查下一个元素时,下一个BookMark结构对象中没有字符串并且所有值都是0.此外,我的临时向量中应该只有5个元素,它应该突破循环,但它会继续并且永远不会突破循环。为什么代码表现得像这样?我做错了什么?我怎样才能改变这个以获得我想要的行为?

如果你需要完整地看到这个课程让我知道,但我认为课程的其余部分对于我想要做的事情并不重要,只有这两个功能应该足以描述我的情况。一旦我正确地工作,那么我只是将读取和写入方法更改为二进制而不是文本。

1 个答案:

答案 0 :(得分:0)

我相信我已经解决了自己的问题。在我的read方法中,我不得不添加第二个getline(这个fileStream,tempString);现在我的代码似乎正常工作。我的向量具有正确的值,它只有5个元素,现在突破了循环。