【问题标题】:C++ FileIO to read and write into objects variablesC++ FileIO 读取和写入对象变量
【发布时间】:2019-04-19 13:30:36
【问题描述】:

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

例如:

“不,是一个四个字母的单词,Chris Jericho,17.67,”

“哈利波特,JK 罗琳,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;

}

【问题讨论】:

  • 把你的元素写在不同的行上怎么样?

标签: c++ file-io


【解决方案1】:

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

如果你不能,那么添加一个分隔符(就像你做的那样),但选择一个,它在真实字符串中出现的机会最少。因此,例如行尾(每个变量都会在它自己的行上)或 \0 或 \t。

【讨论】:

    【解决方案2】:

    这里是一个平滑加载库的解决方案。您可以让 BookList.txt 文件在名称、作者和价格之间由 TABs \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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多