C ++ FileIO для чтения и записи в объекты переменных - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь создать небольшую библиотечную систему, в которую пользователь может добавлять новые данные о книге (имя, автор и цена). При реализации системы FileIO для чтения из файла деталей каждой книги с использованием функций getline становится все труднее разделить мои переменные, когда я пытаюсь сохранить их во временных переменных.

Ex:

«Нет, это четырехбуквенное слово, Крис Иерихон, 17.67»,

«Гарри Поттер, Джоан Роулинг, 23,98»,

PS: Есть ли лучшее решение, чем добавление запятой?

Я пытался добавить символ ',', чтобы отделить каждую строку, но мне нужно лучшее и более эффективное решение, которое работает с функцией getLine.

int main(){
vector<Book> library;
//----Loading File Data_START
string line;
int nbArg=0;

string tempName, tempAuthor, tempPrice;


ifstream myfileL("List.txt");
if (myfileL.is_open())
{
    while (getline(myfileL, line))
    {
        tempPrice=tempAuthor = tempName = "";
        for (int j = 0; j < line.size(); j++){

            if (line.at(j) == ','){
                nbArg++;


                }
            else{
                switch (nbArg){
                case 0:
                    tempName += (line.at(j));
                    break;
                case 1:
                    tempPrice += (line.at(j));
                    break;
                case 2:
                    tempAuthor += (line.at(j));

                    break;

            }
            }
        }

        cout << tempName << endl << tempAuthor << endl << tempPrice << endl;
        cout << "End of Line"<< endl;
        nbArg = 0;
    }
    cout << "---------------------------" << endl;
    myfileL.close();
}

else cout << "Unable to open file";

//----Loading File Data_END
char inputKey = 's';
cout << "-----------------WELCOME----------------" << endl;
while (inputKey != 'q')
{
    cout << "---------------------------------------" << endl;
    cout << "Click \"1\" to add a book to your library" << endl;
    cout << "Click \"2\" to show how the number of books your possess" << endl;
    cout << "Click \"3\" to show details about your books" << endl;
    cout << "Click \"q\" to quit" << endl;
    cin >> inputKey;

    switch (inputKey)
    {
    case '1':
        addElem(library);
        break;

    case '2':
        cout << "You now own " << libSize(library) << " books !" << endl;
        break;

    case '3':
        showDetails(library);
        break;

    case 'q':
        cout << "GOODBYE!" << endl;
        Sleep(2000);
        break;
    }
}

return 0;

}

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Вот решение по плавному способу загрузки библиотеки.Вы можете позволить файлу BookList.txt быть разделенным TAB s \t между именем, автором и ценой вместо запятой ,, а затем использовать getline() для разделения с TAB, как в моем примере ниже.

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;

const char TAB = '\t';

struct StructBook {
    string Name, Author;
    double Price;
};

vector<StructBook> Library;

void GetBookDetails(string LineBookDetails, StructBook & Book) {
    string string_Price;
    stringstream StringStreamBookDetails(LineBookDetails);
    getline(StringStreamBookDetails, Book.Name, TAB);
    getline(StringStreamBookDetails, Book.Author, TAB);
    getline(StringStreamBookDetails, string_Price, TAB);
    stringstream(string_Price) >> Book.Price;
}

bool LoadLibrary() {
    ifstream FileBookList("BookList.txt");
    if(FileBookList.is_open()) {
        string LineBookDetails;
        StructBook Book;

        while(getline(FileBookList, LineBookDetails)) {
            GetBookDetails(LineBookDetails, Book);
            Library.push_back(Book);
            cout << Book.Name << ", " << Book.Author << ", " << Book.Price << endl;
        }

        FileBookList.close();
        return true;
    } else {
        return false;
    }
}

int main(){
    if(!LoadLibrary())
        cout << "Error: Unable to load library";

    //Rest of your program goes here

    return 0;
}

Ваш BookList.txt должен выглядеть следующим образом:

No Is a four letter word    Chris Jericho   17.67
Harry Potter    JK Rowling  23.98
1 голос
/ 19 апреля 2019

Использовать специализированный формат файла, который может содержать структуру (например, json, xml). Это предотвратит много-много проблем.

Если вы не можете, то добавьте символ разделителя (как вы это сделали), но выберите тот, который имеет наименьшие шансы на появление в реальных строках. Так, например, конец строки (каждая переменная будет идти в своей собственной строке) или \ 0 или \ t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...