使用两个字符串流但结果不一样

时间:2016-01-29 08:51:36

标签: c++ matrix stringstream

我正在尝试制作并打印一个矩阵,该矩阵将从文本文件中获取数据。为了能够使输出对齐(即像矩阵的输出),我首先使用stringstream从文件中提取数据作为字符串,以获得元素在我的矩阵中将具有的最大字符数。之后,我将这个字符串放回另一个字符串流中,然后根据我的项目规范将它们提取为double。问题是,每当我的文本文件中的数据只用空格(不是新线)分隔时,它只获得该行的第一个元素。

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

为什么不简单地使用

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,如果您尝试读取文件结尾,则会失败,然后将设置“失败状态”。这就是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
  }