c++ - 使用两个字符串流但没有得到相同的结果

标签 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

我做错了什么?

最佳答案

你为什么不简单地使用

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++ 引用资料,如果您尝试读取文件末尾,则会失败,然后将设置“失败状态”。这就是为什么 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
  }

关于c++ - 使用两个字符串流但没有得到相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080342/

相关文章:

python - 导入使用多处理 Python 的模块

c++ - 如何在某些世界坐标下绘制立方体,OpenGL

c++ - 在 C++ 中使用大括号分隔代码

c++ - 重载构造函数中的成员初始化

python - 使用 SFrame 和 SArray 与 Graphlab 和/或 Numpy 进行矩阵乘法

algorithm - 有多少种方法可以访问给定矩阵的所有点?

C++ 无法重新填充字符串流

c++ - 如何在 C++ 中重用字符串流?

c++ - 错误 C2440 : 'initializing' : cannot convert from

c++ - 用于从文件填充类的 Lexer/Parser 的语法规则