Filestreams чтение и запись в текстовый файл, затем преобразование в двоичный файл в С++

То, что я пытаюсь сделать, довольно элементарно, но у меня возникают проблемы с моим проектом. Мой проект слишком велик, чтобы включить все, поэтому я просто включу две функции, которые я пишу, и то, как выглядит 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
</bookmark>

Проблема, с которой я столкнулась, заключается в том, что когда я вызываю функцию записи, текст полностью отображается в текстовом файле. Первая строка должна содержать строку, содержащую название книги или имя файла. Во второй строке должны быть все неподписанные ints, чтобы указать параметры для определения положения закладки. На данный момент я просто заполнил структуру классов произвольными данными с помощью цикла for и увеличил каждый параметр закладок только для проверки этих функций. Где-то еще в моем коде я сначала вызываю свой метод записи, чтобы создать этот текстовый файл и написать содержимое. Кажется, это работает нормально. Затем я вызываю свой метод чтения для чтения в файле и заполняю временный вектор моей структуры, чтобы проверить, действительно ли содержимое, считанное из файла, является допустимым. Как только я получу это для правильной работы, я тогда просто закрою свою переменную-структуру класса.

Здесь я читаю в первой строке, используя функцию getline, тогда я использую операторы потока, чтобы получить остальную часть содержимого. В то время как я отлаживаю свой код, проходящий через метод чтения, и проверяя свой временный вектор, первый элемент имеет правильное значение с No Title, и каждый из параметров равен 0. Когда я проверяю следующий элемент, в следующем объекте структуры BookMark нет строки и все значения равны 0. Также в моем временном векторе должно быть только 5 элементов, и оно должно выйти из цикла, но оно продолжается и никогда не выходит из цикла. Почему код ведет себя так? Что я делаю неправильно? Как я могу изменить это, чтобы получить поведение, которое я ищу?

Если вам нужно увидеть этот класс в полной мере, дайте мне знать, но я думаю, что остальная часть класса не важна для того, что я пытаюсь сделать, только для этих двух функций должно быть достаточно, чтобы описать мою ситуацию. Как только я получу это для правильной работы, я просто изменю методы чтения и записи для работы в двоичном формате, а не в тексте.

1 ответ

Я считаю, что решил свою проблему. В моем методе чтения мне пришлось добавить вторую getline (этот файлStream, tempString); И теперь мой код работает правильно. Мой вектор имеет правильные значения и имеет только 5 элементов и теперь выходит из цикла.

licensed under cc by-sa 3.0 with attribution.