繁体   English   中英

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

[英]How to convert vector to string and convert back to vector

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

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

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

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

  1. 有一个整数向量
  2. 将其转换为字符串数组
  3. 把它写在一个文件中

第一个程序的代码:

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. 将字符串数组转换回原始向量

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

现在写作和阅读都很好,感谢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

我做错了什么? 谢谢

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

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

现在你可以直接读回一个int变量,格式化的流输入会自动为你做转换。 使用vector的push_back方法可以随时添加值。

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

发布时, 请发布一个完整的最小工作示例 ,必须添加#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表示该字符是字符串中的第一个字符,它不会告诉您字符串中是否有逗号。 在这种情况下,返回值将是string::npos

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

  4. if (stringword.find(','))表现不如希望的那样。 if(0)将整数强制转换为bool ,其中0为false ,其他一切都为true 因此,它永远不会再次进入if块,因为下一次迭代将继续检查这个未更改的字符串。

除此之外还有这个:

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

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

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

  • 循环正常执行三次
  • 第四次,stringword为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开始,留下一串逗号。 但是,如果你能做到这一点,为什么要坚持使用凌乱的东西。

这就是它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM