【问题标题】:Extracting specific tokens with stringstream使用 stringstream 提取特定标记
【发布时间】:2018-09-08 04:47:16
【问题描述】:

我在 csv 文件的每一行中准确提取 14 个标记,我的问题是,在任何标记中,如果其中有空格,我想保留它,但我使用的是 stringstream,所以当我尝试提取数据,我排除了同一个标记之间的空格,它没有正确输入,之后会弄乱所有数据。我需要一种使用 stringstream 的方法,但仍然能够在令牌中保留空格。我正在寻找准确提取第三个令牌(在我的情况下),但很高兴知道一般我如何获取任何令牌

例如:csv 文件是:

PHIL, 100, Intro to Philosophy, 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();         
}

这是我读取文件的主要位置,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,我的真实数据中的“Intro”之后也会出现一堆 0,所以这也让我感到困惑,因为我认为之后的每个标记这将获得我想要输入的令牌所获得的值,除非这是因为其他最多 13 个字段是整数。

【问题讨论】:

标签: c++ file stringstream


【解决方案1】:

Streams 并不适合您要解决的问题。虽然可能有几种不同的方式,但您必须经历很多麻烦才能使其正常工作。相反,阅读整行/任何内容然后标记字符串要容易得多 - 我认为在这里使用正则表达式非常有意义。

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2018-12-23
    • 2010-10-07
    • 1970-01-01
    • 2013-01-17
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多