C++ 为什么C++;StringStream跳过输入文件中的第一个数字,但显示其余数字?

C++ 为什么C++;StringStream跳过输入文件中的第一个数字,但显示其余数字?,c++,csv,getline,stringstream,argv,C++,Csv,Getline,Stringstream,Argv,好的,我有一个输入文件input.txt,它包含一个CSV序列:1,1,1,2,2,3,3,4,4 我试图用一个字符串流在逗号处把它分开;但是我这里有个小问题。由于某些原因,流甚至无法读取序列中的第一个数字。为了说明这一点,我创建了一个调试代码来查看发生了什么,我发现第一个数字存储在csvLine中,其他数字都被读取和转换得很好。我不明白为什么只省略了第一个数字。下面是一个例子图片显示了确切的我的意思num应具有相同的精确值和行,但不是。它包含除第一个值以外的所有值,第一个值存储在csvLine

好的,我有一个输入文件
input.txt
,它包含一个CSV序列:
1,1,1,2,2,3,3,4,4
我试图用一个字符串流在逗号处把它分开;但是我这里有个小问题。由于某些原因,流甚至无法读取序列中的第一个数字。为了说明这一点,我创建了一个调试代码来查看发生了什么,我发现第一个数字存储在
csvLine
中,其他数字都被读取和转换得很好。我不明白为什么只省略了第一个数字。下面是一个例子图片显示了确切的我的意思
num
应具有相同的精确值和
,但不是。它包含除第一个值以外的所有值,第一个值存储在
csvLine
中。为什么会这样

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int main(int argc, const char * argv[]) {
    ifstream file;
    string line;
    string csvLine; //comma seperated value line
    int num = 0;
    file.open(argv[1]);
    if(file.is_open()) {
        while(getline(file, line)) { //get the whole line and use string stream to break at commas
            cout << "\nLine: " << line << endl;
            //using stringstream to seperate at commas
            stringstream ss(line);
            while(getline(ss, csvLine, ',')) {
                cout << "csvLine: " << csvLine << " " << endl;
                //using stringstream to convert to int
                ss >> num;
                cout << "num: " << num << " " << endl;
            }
        }
    }
    return 0;
}

#包括
#包括
#包括
使用名称空间std;
int main(int argc,const char*argv[]{
ifstream文件;
弦线;
字符串csvLine;//逗号分隔的值行
int num=0;
打开(argv[1]);
if(file.is_open()){
while(getline(file,line)){//获取整行并使用字符串流在逗号处断开

cout问题是因为您使用的是
getline
,然后从
stringstream

您应该只使用
getline

 while(getline(ss, csvLine, ',')) 
{
    cout << "csvLine: " << csvLine << " " << endl;
    num = std::stoi( csvLine ) ;        
}
while(getline(ss,csvLine,,))
{

cout问题是因为您使用的是
getline
,然后从
stringstream

您应该只使用
getline

 while(getline(ss, csvLine, ',')) 
{
    cout << "csvLine: " << csvLine << " " << endl;
    num = std::stoi( csvLine ) ;        
}
while(getline(ss,csvLine,,))
{

cout问题是因为您使用的是
getline
,然后从
stringstream

您应该只使用
getline

 while(getline(ss, csvLine, ',')) 
{
    cout << "csvLine: " << csvLine << " " << endl;
    num = std::stoi( csvLine ) ;        
}
while(getline(ss,csvLine,,))
{

cout问题是因为您使用的是
getline
,然后从
stringstream

您应该只使用
getline

 while(getline(ss, csvLine, ',')) 
{
    cout << "csvLine: " << csvLine << " " << endl;
    num = std::stoi( csvLine ) ;        
}
while(getline(ss,csvLine,,))
{

当你阅读
getline(ss,csvLine,,)时,cout
第一次读取数字时,后面跟着“
”,“
”。对于接下来的数字,它只读取逗号,因为数字已经使用
ss>>num
提取。也就是说,最简单的修复方法是在执行循环后,只读取逗号之前的所有内容。因为字符串的值提取了逗号a没有使用。使用
ignore()
而不是
std::getline()

for(;ss>>num;ss.ignore(std::numeric_limits::max(),',')){
//用这个号码做点什么
}

以这种方式重新构造循环的另一个好处是,它可以检查读取数字是否成功。

当您读取
getline(ss,csvLine,,'))
第一次读取数字时,后面跟着“
”,“
”。对于接下来的数字,它只读取逗号,因为数字已经使用
ss>>num
提取。也就是说,最简单的修复方法是在执行循环后,只读取逗号之前的所有内容。因为字符串的值提取了逗号a没有使用。使用
ignore()
而不是
std::getline()

for(;ss>>num;ss.ignore(std::numeric_limits::max(),',')){
//用这个号码做点什么
}

以这种方式重新构造循环的另一个好处是,它可以检查读取数字是否成功。

当您读取
getline(ss,csvLine,,'))
第一次读取数字时,后面跟着“
”,“
”。对于接下来的数字,它只读取逗号,因为数字已经使用
ss>>num
提取。也就是说,最简单的修复方法是在执行循环后,只读取逗号之前的所有内容。因为字符串的值提取了逗号a没有使用。使用
ignore()
而不是
std::getline()

for(;ss>>num;ss.ignore(std::numeric_limits::max(),',')){
//用这个号码做点什么
}

以这种方式重新构造循环的另一个好处是,它可以检查读取数字是否成功。

当您读取
getline(ss,csvLine,,'))
第一次读取数字时,后面跟着“
”,“
”。对于接下来的数字,它只读取逗号,因为数字已经使用
ss>>num
提取。也就是说,最简单的修复方法是在执行循环后,只读取逗号之前的所有内容。因为字符串的值提取了逗号a没有使用。使用
ignore()
而不是
std::getline()

for(;ss>>num;ss.ignore(std::numeric_limits::max(),',')){
//用这个号码做点什么
}

以这种方式重新构造循环还有一个额外的好处,那就是检查读取数字是否成功。

不要混合
getline
>
。不要混合
getline
>
。不要混合
getline
。不要混合
getline