使用stringstream提取特定令牌

时间:2018-09-08 04:47:17

标签: c++ file stringstream

我正在csv文件的每一行中准确提取14个令牌,我的问题是在任何令牌中如果有空格,我想保留它,但是我正在使用stringstream,所以当我尝试提取时数据,我排除了相同令牌之间的空格,并且输入不正确,之后将弄乱所有数据。我需要一种使用stringstream的方法,但仍然能够保留令牌中的空间。我正打算提取第三个令牌(以我的情况为准),但总的来说我很高兴如何获得任何令牌

例如:csv文件为:

PHIL,100,哲学概论,6,Bobby,...(全部一行)

我有一个构造函数,该构造函数引用应该用于初始化我的数据成员的stringstream对象。当我到达一个通常有空格的令牌时,它将停在一个空格处,在本示例中,它将仅取“ Intro”,然后将其存储到我的classTitle变量中,但是我想要整个“ Intro to Philosophy”。我也有一个老师名字的字段,但是一个人的名字几乎没有空格。但总的来说,如何保留间距?

这是我的构造函数:

Course( stringstream &ss ){


    ss >> dept >> courseNumber >> courseTitle >> numAs >> numBs >> numCs >> numDs >> numFs >> numIs >> numNRs
    >> numSs  >> numUs >> numWs >> instructor;

    dump();         
}

这主要是我读取文件的地方,转储只是我用来输出要验证其是否正确的数据的功能:

string dummyLine; // string meant to be used to skip over first line
    getline(gradeFile, dummyLine);
    while ( gradeFile.good() ){ // read until the end of the file

        stringstream ss;
        getline(gradeFile, input); // r)ead a line of input, stop at a comma
        replace(input.begin(), input.end() , ',', ' ');

        ss << input;
        Course course(ss);


        if ( count == 0 ){
            //course.dump();
        }

        count++;

        break;
    }

但是实际上在我的输出中,即使csv文件中的数字不为0,我在真实数据中的“简介”之后也得到了很多0,所以这也让我感到困惑,因为我认为会得到我想要输入的令牌将具有的值,除非是因为最多13个其他字段是整数。

1 个答案:

答案 0 :(得分:0)

Streams并不是非常适合您要解决的问题。尽管可以通过几种不同的方式来实现,但要使其正常工作,您将不得不经历很多麻烦。取而代之的是,仅读取整行/任何内容然后对字符串进行标记化就容易得多-我认为在这里使用正则表达式是很合理的。