我试图建立和打印一个矩阵,它将从文本文件中获取其数据。为了使输出对齐(如矩阵的输出),我首先使用字符串流将文件中的数据提取为字符串,以获得元素在矩阵中具有的最大字符数。之后,我将这个字符串放回另一个字符串流中,然后根据我的项目的规范将它们提取为一个双字符串。问题是,每当我的文本文件中只有空白(而不是新行)分隔的数据时,它就只能获得行的第一个元素。
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我做错了什么?
发布于 2016-01-29 10:36:37
你为什么不直接用
while(s1 >> toAdd && size < (rows*columns)) 而不是
while(s1 >> temp && size < (rows*columns)) 或者,您可以在内部的stringstream s2块中定义如下所示的while:
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.clear()之后添加s2.str(""),clear()可以重置字符串中的错误状态(在本例中为:eof).因为您在operator>>之后立即调用了operator<<,所以s2到达文件末尾并设置了eof状态。根据c++ Refference的说法,如果您试图读取文件末尾,就会失败,然后将设置“fail”。这就是为什么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
}https://stackoverflow.com/questions/35080342
复制相似问题