C++ getline()在读取整个文件之前重新启动

use*_*070 0 c++ getline

我的问题的关键是我正在读取一个文件,其中的字段用#分隔,除了行的结尾.当我查看我正在阅读书籍结构的字段的打印语句(使用for循环遍历整个数据文件/书籍列表(理论上))时,它们都具有相同的值.例如,有200个完全相同的id后跟200个完全相同的标题,而不是在数据文件上进一步向下读取.

确切的代码是:

void loadTable(book table[], int size){
    for (int i = 0; i < size; i++){
        book newBook;
        ifstream ifs("inventory.txt");
        string bit;
        getline(ifs, bit, '#');
        newBook.bookId = atoi(bit.c_str());
        cout << "BookID: " << newBook.bookId;
        getline(ifs, bit, '#');
        newBook.title = bit;
        cout << "Title: " << newBook.title;
        getline(ifs, bit, '#');
        newBook.author = bit;
        getline(ifs, bit, '#');
        newBook.cost = atof(bit.c_str());
        getline(ifs, bit, '#');
        newBook.price = atof(bit.c_str());
        getline(ifs, bit);
        newBook.quantity = atoi(bit.c_str());
        loadBook(table, newBook, size);
    }

}
Run Code Online (Sandbox Code Playgroud)

确切的结果是:

tiesBookID: 116807Title: A Tale of Two CitiesBookID: 116807Title: A Tale of Two
CitiesBookID: 116807Title: A Tale of Two CitiesBookID: 116807Title: A Tale of Tw
o CitiesBookID: 116807Title: A Tale of Two CitiesBookID: 116807Title: A Tale of
Two CitiesBookID: 116807Title: A Tale of Two CitiesBookID: 116807Title: A Tale o
f Two CitiesBookID: 116807Title: A Tale of Two CitiesBookID: 116807Title: A Tale
 of Two CitiesBookID: 116807Title: A Tale of Two CitiesBookID: 116807Title: A Ta
...
Run Code Online (Sandbox Code Playgroud)

tao*_*ocp 5

为什么总是在for循环中打开文件?您应该首先打开文件,然后遍历文件并将您从文件中读取的内容放入结构中.在这种情况下,您总是阅读前几行,其中包含自您一次又一次打开文件以来的第一本书的信息,同时,您没有关闭您的文件,这是不好的.