C ++ FileIO读取和写入对象变量

时间:2019-04-19 13:30:37

标签: c++ file-io

我正在尝试建立一个小型图书馆系统,用户可以在其中添加新书的详细信息(名称,作者和价格)。当实现FileIO系统以使用getline函数从每本书中读取每本书的详细信息时,当我尝试将它们存储在临时变量中时,分离变量变得更加困难。

例如:

“不是四个字母的单词,克里斯·杰里科(Chris Jericho),17.67,”

“ Harry Potter,JK Rowling,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 个答案:

答案 0 :(得分:1)

使用专用文件格式,该文件格式可以包含结构(例如json,xml)。这样可以避免很多问题。

如果不能这样做,则添加一个分隔符(就像您所做的一样),但是选择一个,在真实字符串中出现的可能性最小。因此,例如行尾(每个变量都在其自己的行上)或\ 0或\ t。

答案 1 :(得分:1)

这是一种顺利加载库的解决方案。您可以在名称,作者和价格之间用TAB的{​​{1}}分隔\t,而不用逗号,分隔,然后使用getline()用{ {1}},例如下面的示例。

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