使用两个字符串流但没有得到相同的结果
Using two string streams but not getting same result
我正在尝试制作并打印一个将从文本文件中获取数据的矩阵。为了能够使输出对齐(即像矩阵一样),我首先使用 stringstream 将文件中的数据提取为字符串,以获得矩阵中元素将具有的最大字符数。之后,我将这个字符串放回另一个字符串流中,然后根据我的项目规范将它们提取为双精度字符串。问题是,每当我的文本文件中的数据仅由空格分隔(不是新行)时,它只会获取该行的第一个元素。
while(getline(file, line) && size < (rows*columns))
{
stringstream s1(line);
stringstream s2;
string temp;
double toAdd;
while(s1 >> temp && size < (rows*columns))
{
if(temp.size() > columnWidth2)
columnWidth2 = temp.size();
s2 << temp;
s2 >> toAdd;
cout << "Size: " << size << "\nTo Add: " << toAdd << "\nTemp: " << temp << '\n';
dataContainer[size] = toAdd;
size++;
s2.str(string());
}
}
例如,我有一个包含以下数据的文本文件:
1 2 3 4 5
6
7
8
9
10
如果我输出我的 dataContainer 的所有内容,它会显示:
1 1 1 1 1 6 7 8 9 10
而不是:
1 2 3 4 5 6 7 8 9 10
我做错了什么?
你为什么不简单地使用
while(s1 >> toAdd && size < (rows*columns))
而不是
while(s1 >> temp && size < (rows*columns))
或者,您可以像这样在 while
块中定义 stringstream s2
:
while(s1 >> temp && size < (rows*columns))
{
if(temp.size() > columnWidth2)
columnWidth2 = temp.size();
stringstream s2;
s2 << temp;
s2 >> toAdd;
cout << "Size: " << size << "\nTo Add: " << toAdd << "\nTemp: " << temp << '\n';
dataContainer[size] = toAdd;
size++;
s2.str(string());
}
最好的方法是在s2.str("")
之后添加一个s2.clear()
,clear()
可以重置stringstream中的错误状态(在这种情况下:eof).. . 因为您在 operator<<
之后立即调用 operator>>
,s2
到达文件末尾并设置了 eof 状态。根据 c++ 参考,如果您尝试读取文件结尾,则会失败,然后 "fail state" 将被设置。这就是为什么s2
只能获取到第一个元素的原因。以下是要修改的代码:
while(s1 >> temp && size < (rows*columns))
{
if(temp.size() > columnWidth2)
columnWidth2 = temp.size();
s2 << temp;
s2 >> toAdd;
cout << "Size: " << size << "\nTo Add: " << toAdd << "\nTemp: " << temp << '\n';
dataContainer[size] = toAdd;
size++;
s2.str(string());
s2.clear(); //it can clear the eof state
}
我正在尝试制作并打印一个将从文本文件中获取数据的矩阵。为了能够使输出对齐(即像矩阵一样),我首先使用 stringstream 将文件中的数据提取为字符串,以获得矩阵中元素将具有的最大字符数。之后,我将这个字符串放回另一个字符串流中,然后根据我的项目规范将它们提取为双精度字符串。问题是,每当我的文本文件中的数据仅由空格分隔(不是新行)时,它只会获取该行的第一个元素。
while(getline(file, line) && size < (rows*columns))
{
stringstream s1(line);
stringstream s2;
string temp;
double toAdd;
while(s1 >> temp && size < (rows*columns))
{
if(temp.size() > columnWidth2)
columnWidth2 = temp.size();
s2 << temp;
s2 >> toAdd;
cout << "Size: " << size << "\nTo Add: " << toAdd << "\nTemp: " << temp << '\n';
dataContainer[size] = toAdd;
size++;
s2.str(string());
}
}
例如,我有一个包含以下数据的文本文件:
1 2 3 4 5
6
7
8
9
10
如果我输出我的 dataContainer 的所有内容,它会显示:
1 1 1 1 1 6 7 8 9 10
而不是:
1 2 3 4 5 6 7 8 9 10
我做错了什么?
你为什么不简单地使用
while(s1 >> toAdd && size < (rows*columns))
而不是
while(s1 >> temp && size < (rows*columns))
或者,您可以像这样在 while
块中定义 stringstream s2
:
while(s1 >> temp && size < (rows*columns))
{
if(temp.size() > columnWidth2)
columnWidth2 = temp.size();
stringstream s2;
s2 << temp;
s2 >> toAdd;
cout << "Size: " << size << "\nTo Add: " << toAdd << "\nTemp: " << temp << '\n';
dataContainer[size] = toAdd;
size++;
s2.str(string());
}
最好的方法是在s2.str("")
之后添加一个s2.clear()
,clear()
可以重置stringstream中的错误状态(在这种情况下:eof).. . 因为您在 operator<<
之后立即调用 operator>>
,s2
到达文件末尾并设置了 eof 状态。根据 c++ 参考,如果您尝试读取文件结尾,则会失败,然后 "fail state" 将被设置。这就是为什么s2
只能获取到第一个元素的原因。以下是要修改的代码:
while(s1 >> temp && size < (rows*columns))
{
if(temp.size() > columnWidth2)
columnWidth2 = temp.size();
s2 << temp;
s2 >> toAdd;
cout << "Size: " << size << "\nTo Add: " << toAdd << "\nTemp: " << temp << '\n';
dataContainer[size] = toAdd;
size++;
s2.str(string());
s2.clear(); //it can clear the eof state
}