首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用两个字符串流但没有得到相同的结果

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

Stack Overflow用户
提问于 2016-01-29 08:51:36
回答 1查看 180关注 0票数 0

我试图建立和打印一个矩阵,它将从文本文件中获取其数据。为了使输出对齐(如矩阵的输出),我首先使用字符串流将文件中的数据提取为字符串,以获得元素在矩阵中具有的最大字符数。之后,我将这个字符串放回另一个字符串流中,然后根据我的项目的规范将它们提取为一个双字符串。问题是,每当我的文本文件中只有空白(而不是新行)分隔的数据时,它就只能获得行的第一个元素。

代码语言:javascript
复制
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());
  }
}

例如,我有一个包含这些数据的文本文件:

代码语言:javascript
复制
1 2 3 4 5
6
7
8
9
10

如果输出dataContainer的所有内容,它会读到:

代码语言:javascript
复制
1 1 1 1 1 6 7 8 9 10

而不是:

代码语言:javascript
复制
1 2 3 4 5 6 7 8 9 10

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-29 10:36:37

你为什么不直接用

代码语言:javascript
复制
while(s1 >> toAdd && size < (rows*columns)) 

而不是

代码语言:javascript
复制
while(s1 >> temp && size < (rows*columns)) 

或者,您可以在内部的stringstream s2块中定义如下所示的while

代码语言:javascript
复制
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只能获得第一个元素的原因。以下是要修改的代码:

代码语言:javascript
复制
  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
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35080342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档