如何将矢量转换为字符串并转换回矢量

时间:2013-08-19 13:07:01

标签: c++ string vector fwrite fread

-----------------编辑-----------------------

根据juanchopanza的评论:我编辑标题

基于jrok的评论:我正在使用ofstream来编写,而ifstream则用于阅读。

我正在编写2个程序,第一个程序执行以下任务:

  1. 有一个整数向量
  2. 将其转换为字符串数组
  3. 将其写入文件
  4. 第一个程序的代码:

    vector<int> v = {10, 200, 3000, 40000};
    int i;
    stringstream sw;
    string stringword;
    
    cout << "Original vector = ";
    for (i=0;i<v.size();i++) 
    {
         cout << v.at(i) << " " ;
    }
    cout << endl;
    
    for (i=0;i<v.size();i++) 
    {
        sw << v[i];
    }
    stringword = sw.str();
    cout << "Vector in array of string : "<< stringword << endl;
    
    ofstream myfile;
    myfile.open ("writtentext");
    myfile << stringword;
    myfile.close();
    

    第一个程序的输出:

    Original vector : 10 200 3000 40000
    Vector in string : 10200300040000
    Writing to File ..... 
    

    第二个程序将执行以下任务:

    1. 阅读文件
    2. 将字符串数组转换回原始向量
    3. -----------------编辑-----------------------

      现在写作和阅读都很好,感谢Shark和Jrok,我使用逗号作为分隔符。第一个程序的输出:

      Vector in string : 10,200,3000,40000,
      

      然后我写了剩下的第二个程序:

      string stringword;
      
      ifstream myfile;
      myfile.open ("writtentext");
      getline (myfile,stringword);
      cout << "Read From File = " << stringword << endl;
      
      cout << "Convert back to vector = " ;
      for (int i=0;i<stringword.length();i++)
      {
          if (stringword.find(','))
          {
              int value;
              istringstream (stringword) >> value;
              v.push_back(value);
              stringword.erase(0, stringword.find(','));
          }
      }
      for (int j=0;j<v.size();i++) 
      {
          cout << v.at(i) << " " ;
      }
      

      但它只能转换并推回第一个元素,其余元素将被删除。这是输出:

      Read From File = 10,200,3000,40000,
      Convert back to vector = 10
      

      我做错了什么?感谢

2 个答案:

答案 0 :(得分:1)

最简单的方法是在编写时插入空格字符作为分隔符,因为这是operator>>的默认分隔符

sw << v[i] << ' ';

现在您可以直接读回int变量,格式化的流输入将自动为您进行转换。使用向量的push_back方法可以随时为其添加值。

答案 1 :(得分:1)

是的,这个问题已经超过一年了,可能与原始提问者完全无关,但谷歌带领我到这里,所以它也可能会带领其他人。

发布时,please post a complete minimal working example,必须添加#includemain才能更好地花时间帮助。由于你的问题,它也很重要。

为什么你的第二个代码不在这个块中

for (int i=0;i<stringword.length();i++)
{
    if (stringword.find(','))
    {
        int value;
        istringstream (stringword) >> value;
        v.push_back(value);
        stringword.erase(0, stringword.find(','));
    }
}
  1. istringstream (stringword) >> value将数据解释为逗号作为整数,即第一个值,然后存储。

  2. stringword.find(',')获取逗号的0索引位置。返回值为0表示该字符是字符串中的第一个字符,它不会告诉您字符串中是否有逗号。 In that case, the return value would be string::npos.

  3. stringword.erase从字符串的开头删除那么多字符。在这种情况下,它会删除10,从而生成字符串,200,3000,40000。这意味着在下一次迭代中stringword.find(',')返回0.

  4. if (stringword.find(','))表现不尽如人意。 if(0)将整数转换为bool,其中0为false,其他所有内容均为true。因此,它永远不会再次进入if-block,因为下一次迭代将继续检查这个未更改的字符串。

  5. 除此之外,还有:

    for (int j=0;j<v.size();i++) 
    {
        cout << v.at(i) << " " ;
    }
    

    它使用i。这是在for循环中声明的,在不同的范围内 您提供的代码根本无法编译,即使添加了main和includes也是如此。哎,v甚至没有在第二个程序中定义。

    然而,这是不够的,因为每个循环都会重新计算条件stringword.length()。在这个特定的例子中它可以工作,因为你的整数每次都得到一个额外的数字,但是让我们说你的输入文件是1,2,3,4,

    • 循环正常执行三次
    • 第四次,字符串字是4, stringword.length()返回2,但i已经被评估为3,因此i<stringword.length()无效,循环退出。

    如果要将字符串的长度用作条件,但在处理期间编辑字符串,请在编辑之前存储该值。即使您没有编辑字符串,也意味着对length()的呼叫次数减少。

    如果预先保存长度,则在这个新方案中为8。但是,在4个循环后,字符串已经为空,并且它执行for循环多次而没有效果。

    相反,当我们将字符串编辑为空时,请检查它。

    所有这些共同构成完全不同的代码使这项工作:

    while (!stringword.empty())
    {
        int value;
        istringstream (stringword) >> value;
        v.push_back(value);
        stringword.erase(0, stringword.find(',')+1);
    }
    for (int i = 0; i < v.size(); i++) 
    {
        cout << v.at(i) << " " ;
    }
    

    解决这个问题的另一种方法是不要试图从一开始就找到,而是从索引i开始,留下一串逗号。但是,如果你能做到这一点,为什么要坚持使用凌乱的东西。

    关于它。