从文件和字符串问题中读取

Reading from file & String issues

本文关键字:读取 问题 字符串 文件      更新时间:2023-10-16

我正在使用 for 循环从文件中读取数据并将值存储在类成员中:

while (!bookstxt.eof())
 {
    for (int i = 0; i < x; i++) {
        getline(bookstxt, title);
        getline(bookstxt, author);
        getline(bookstxt, publisher);
        getline(bookstxt, isbn);
        cin.clear();
        cin.ignore(100, 'n');
        bookstxt >> price >> year >> numInStock;
        cout << title << "n" << author << "n" << publisher << "n" << isbn << "n" << price << "n" << year << "n" << numInStock;
        bookList[i].storeBook(title, author, publisher, isbn, price, year, numInStock); 
    }
}
问题

我在 ISBN 部分遇到了问题 - 它在循环中第一次正确执行需要做的事情,但在第二次它搞砸了 isbn 并以某种方式将其的一部分推送到接下来的两个变量。以下是断开的行的输出应如下所示

The World is Flat
Friedman, Thomas
Farrar, Straus and Giroux
0-374-29279-5
30.00
2006
12 

以下是实际发生的情况:

Starting Out with C++
Gaddis, Tony
Pearson
978-0-13-257625-3
129.98
2014
25
The World is Flat
Friedman, Thomas
Farrar, Straus and Giroux
0
-374
-29279
-5
30.00
2006
12
0
-374
-29279

它似乎在阅读 ISBN 部分的某个地方搞砸了。不胜感激任何帮助

您的cin.ignore()电话在错误的位置。 getline()吃掉它结束的换行符,所以没有什么可忽略的。>>运算符没有,因此您需要忽略它在流中留下的空格。将cin.ignore()移动到使用 >> 运算符之后:

while (!bookstxt.eof())
 {
    for (int i = 0; i < x; i++) {
        getline(bookstxt, title);
        getline(bookstxt, author);
        getline(bookstxt, publisher);
        getline(bookstxt, isbn);
        bookstxt >> price >> year >> numInStock;
        cin.ignore(100, 'n');
        cout << title << "n" << author << "n" << publisher << "n" << isbn << "n" << price << "n" << year << "n" << numInStock;
        bookList[i].storeBook(title, author, publisher, isbn, price, year, numInStock); 
    }
}

此外,在循环条件中使用.eof()是一个坏主意。

这是一个解决方案。它不使用循环中的.eof(),而是使用stringstream来提取数值。

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
int main () {
    string title, author, publisher, isbn, empty_line;
    string string_price, string_year, string_stock;
    double price;
    int year, stock;
    ifstream bookstxt ("books.txt");
    if(bookstxt.is_open()) {
        while(getline(bookstxt,title))
        {
            getline(bookstxt, author);
            getline(bookstxt, publisher);
            getline(bookstxt, isbn);
            getline(bookstxt, string_price);
            getline(bookstxt, string_year);
            getline(bookstxt, string_stock);
            getline(bookstxt, empty_line);
            stringstream(string_price) >> price;
            stringstream(string_year) >> year;
            stringstream(string_stock) >> stock;
            cout << title << "n" << author << "n" << publisher << "n" << isbn << "n" << price << "n" << year << "n" << stock << "nn";
        }
        bookstxt.close();
    } else {
        cout << "Unable to open file";
    }
    return 0;
}

我知道您的原始books.txt文件应该看起来像这样,如果我错了,请纠正我:

Starting Out with C++
Gaddis, Tony
Pearson
978-0-13-257625-3
129.98
2014
25
The World is Flat
Friedman, Thomas
Farrar, Straus and Giroux
0-374-29279-5
30.00
2006
12
0

祝你好运!