-----------------编辑-----------------------
根据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
我做错了什么?感谢
答案 0 :(得分:1)
最简单的方法是在编写时插入空格字符作为分隔符,因为这是operator>>
的默认分隔符
sw << v[i] << ' ';
现在您可以直接读回int
变量,格式化的流输入将自动为您进行转换。使用向量的push_back
方法可以随时为其添加值。
答案 1 :(得分:1)
是的,这个问题已经超过一年了,可能与原始提问者完全无关,但谷歌带领我到这里,所以它也可能会带领其他人。
发布时,please post a complete minimal working example,必须添加#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表示该字符是字符串中的第一个字符,它不会告诉您字符串中是否有逗号。 In that case, the return value would be string::npos
.
stringword.erase
从字符串的开头删除那么多字符。在这种情况下,它会删除10
,从而生成字符串,200,3000,40000
。这意味着在下一次迭代中stringword.find(',')
返回0.
if (stringword.find(','))
表现不尽如人意。 if(0)
将整数转换为bool
,其中0为false
,其他所有内容均为true
。因此,它永远不会再次进入if-block,因为下一次迭代将继续检查这个未更改的字符串。
除此之外,还有:
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开始,留下一串逗号。但是,如果你能做到这一点,为什么要坚持使用凌乱的东西。
关于它。