[英]How to convert vector to string and convert back to vector
-----------------编辑-----------------------
根据juanchopanza的评论:我编辑标题
基于jrok的评论:我正在使用ofstream来编写,而ifstream则用于阅读。
我正在编写2个程序,第一个程序执行以下任务:
第一个程序的代码:
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 .....
第二个程序将执行以下任务:
-----------------编辑-----------------------
现在写作和阅读都很好,感谢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
方法可以随时添加值。
是的,这个问题已经超过一年了,可能与原始提问者完全无关,但谷歌带领我到这里,所以它也可能引领其他人。
发布时, 请发布一个完整的最小工作示例 ,必须添加#include
和main
和时间更好地花时间帮助。 由于你的问题,它也很重要。
为什么你的第二个代码不能正常运行
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(','));
}
}
istringstream (stringword) >> value
将数据解释为逗号作为整数,第一个值然后存储。
stringword.find(',')
获取逗号的0索引位置。 返回值为0表示该字符是字符串中的第一个字符,它不会告诉您字符串中是否有逗号。 在这种情况下,返回值将是string::npos
。
stringword.erase
从字符串的开头删除那么多字符。 在这种情况下,它删除10
,使stringword ,200,3000,40000
。 这意味着在下一次迭代中, stringword.find(',')
返回0。
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,
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.