为什么 getline 不多次拆分 stringstream?

Why is getline not splitting up the the stringstream more than once?

当我试图从文件中读取数据时,它没有更新 tempString2 的值。

它不抓取并拆分新行,它只保存第一条数据行的最后一个值。

我认为第二个 getline 是问题的原因是数据正在被读入,循环是 运行 我需要它们的确切次数。

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

void PopulateWindLog(int dataIndex, std::string fileName, int const headerVecSize)
{
    std::string tempString;
    std::string tempString2;
    std::stringstream tempStream;

    // open data file
    std::ifstream dataFile(fileName);

    // skip the header line
    std::getline(dataFile, tempString);

    // while there is still data left in the file
  
    while(std::getline(dataFile, tempString))
    {
        tempStream << tempString;
        std::cout << tempString << std::endl;

        for(int i = 0; i < headerVecSize; ++i)
        {
            std::getline(tempStream, tempString2, ',');
            std::cout << tempString2 << std::endl;

            if(i == dataIndex)
            {
                std::cout << tempString2 << " INSIDE IF STATEMENT !!!! " << std::endl;
            }
            
        }
    }
}

这是我正在使用的数据集。对于复制,我正在寻找 'S' 列(索引 10)。 headerVecSize 为 18.

WAST,DP,Dta,Dts,EV,QFE,QFF,QNH,RF,RH,S,SR,ST1,ST2,ST3,ST4,Sx,T
31/03/2016 9:00,14.6,175,17,0,1013.4,1016.9,1017,0,68.2,6,512,22.7,24.1,25.5,26.1,8,20.74
31/03/2016 9:10,14.6,194,22,0.1,1013.4,1016.9,1017,0,67.2,5,565,22.7,24.1,25.5,26.1,8,20.97
31/03/2016 9:20,14.8,198,30,0.1,1013.4,1016.9,1017,0,68.2,5,574,22.7,24,25.5,26.1,8,20.92

这是我得到的输出。 Output of the built program

std::getline() 从输入中提取字符并将它们附加到 str 直到出现以下情况之一(按列出的顺序检查)

  • end-of-file 输入条件,在这种情况下,getline 设置 eofbit。
  • 下一个可用的输入字符是 delim,正如 Traits::eq(c, delim) 测试的那样,在这种情况下,分隔符是从输入中提取的,但不会附加到 str。
  • str.max_size() 个字符已被存储,在这种情况下 getline 设置 failbit 和 returns.

(来自 https://en.cppreference.com/w/cpp/string/basic_string/getline

因此,在读取第一行输入的所有元素后,tempstream.good() 为假。没有进一步的输入被读取。

建议的解决方案:将 tempstream 的定义移动到 while 循环中。您将获得每行 good 状态的流。