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
和
。