如何将矢量转换为字符串并转换回矢量
How to convert vector to string and convert back to vector
------------------编辑------------------
根据juancapanza的评论:我编辑标题
基于jrok的评论:我用ofstream来写,用ifstream来读。
我正在写两个程序,第一个程序完成以下任务:
- 具有整数向量
- 将其转换为字符串数组
- 把它写在文件中
第一个程序的代码:
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>>
的默认分隔符
sw << v[i] << ' ';
现在您可以直接读取回int
变量,格式化的流输入将自动为您进行转换。使用矢量的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
,生成字符串字,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) << " " ;
}
它使用CCD_ 18。这是在不同范围的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开始,留下一个逗号串。但是,如果你能做到这一点,为什么还要坚持做乱七八糟的事情呢。
仅此而已。
- wcstombs_s(),转换字符串的长度
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 无法转换字符串插入函数的参数
- 转换字符串向量:基于先前的值跳过元素
- 从中间器转换字符串不起作用,出了什么问题?
- 失败的证明转换字符串到枚举类
- 如何使用正则表达式和提升转换迭代器标记和转换 c 字符串
- 使用java jni时转换字符串类型
- 如何避免在转换字符串令牌流时重复istringstream构造
- 阿托伊未正确转换字符串
- C++,转换字符串,使连续下划线序列变为单个下划线
- 使用长算术转换字符串
- 转换字符串十进制数时的精度
- 将词法转换字符串提升为双精度
- 使用marshal_as函数转换字符串的性能
- C++不会从数据转换字符串
- 无论如何,在c++ /Qt中转换字符串到结构中的字段
- C++ 隐式类型转换字符串 -> int?
- 转换字符串到浮点数,c++实现
- 用于转换字符串大小写的函数