我想要做的是相当基本的但是我的项目遇到了麻烦。我的项目太大而无法包含所有内容,因此我将只包含我正在编写的两个函数以及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个元素,它应该突破循环,但它会继续并且永远不会突破循环。为什么代码表现得像这样?我做错了什么?我怎样才能改变这个以获得我想要的行为?
如果你需要完整地看到这个课程让我知道,但我认为课程的其余部分对于我想要做的事情并不重要,只有这两个功能应该足以描述我的情况。一旦我正确地工作,那么我只是将读取和写入方法更改为二进制而不是文本。
答案 0 :(得分:0)
我相信我已经解决了自己的问题。在我的read方法中,我不得不添加第二个getline(这个fileStream,tempString);现在我的代码似乎正常工作。我的向量具有正确的值,它只有5个元素,现在突破了循环。