提取运算符重载以从具有多种数据类型的文件流中读取

时间:2017-05-24 01:22:47

标签: c++ ifstream extraction-operator

我有一个文本文件,其中包含多个图书名称及其相关的ISBN编号,格式如下所示,名称由标签空格分隔。

Neuromancer    345404475
DUNE    441172717
Ringworld    345020464
The Expanse    441569595
Do Androids Dream of Electric Sheep?    316129089

我使用提取运算符重载此数据,然后将此信息推回到BookData类向量中,然后使用迭代器进行循环,然后输出此数据。

一切都按计划运行,但有一个例外:包含空格的书名," Expanse",不显示。我现在明白了,经过一些阅读,提取操作员停在任何空白处。 "该"被读为名称,然后它试图阅读" Expanse"作为使其停止阅读的isbn数字。

我的问题:是否有任何可能的方法将参数添加到提取运算符以允许它忽略文本文件中的单个空格,但仍然停留在制表符或多个空格处以便可以使用包含空格的书名?

#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
#include "BookData.h"
#include <fstream>
using namespace std;

int main() {
    string line;
    string names;
    int isbns;

    ifstream fileObj1;
    fileObj1.open("bookNameAndIsbn.txt");       
    vector <BookData> bookDataVec;

    fileObj1 >> names >> isbns;
    while (getline(fileObj1, line)) {
        bookDataVec.push_back(BookData(names, isbns));
        fileObj1 >> names >> isbns; 
    }

    vector<BookData>::iterator it;
    for (it = bookDataVec.begin(); it != bookDataVec.end(); it++) {
    static int i = 0;
    cout << bookDataVec[i].getName() << " " << bookDataVec[i].getIsbn() << endl;
    i++;
    }
    _getch();
    return 0;
}

(下面的BookData类标题)

#pragma once
#include <string>    
using namespace std;

class BookData
{
public:
    BookData(string bookName, int bookIsbn);
    string getName();
    int getIsbn();

private:
    string _bookName;
    int _bookIsbn;
};    

(下面的BookData类的cpp)

#include "BookData.h"
#include <string>
using namespace std;

BookData::BookData(string bookName, int bookIsbn)
{
    _bookName = bookName;
    _bookIsbn = bookIsbn;
}

string BookData::getName() {
    return _bookName;
}

int BookData::getIsbn() {
    return _bookIsbn;
}

0 个答案:

没有答案