这似乎给了我一些麻烦。该方法应该生成一个随机数并将其分配给char。 getline从文本文件中获取整个字符串并将其分配给食物。 y的目的是在食物串中保存它所在的位置。然后它将使用该int从字符串中删除并打印出剩下的内容。
我一直得到“程序已经请求以不寻常的方式因运行时错误而关闭”并且它已锁定。提前致谢。
void feedRandomFood()
{
int y = 0;
int x = rand() % food.size() + 1; //assigns x a random number between 1 and food.size MAX
char c = '0' + x; //converts int to char for delimiter char.
ifstream inFile;
inFile.open("OatmealFood.txt", ios::in);
string foods = "";
getline(inFile, foods);
inFile.close();
y = foods.find(c);
foods.erase(y); //erase characters up to the char found
cout << foods;
}
答案 0 :(得分:2)
如果find
方法无法在字符串c
中找到foods
怎么办?它返回npos
,当你在erase
中使用它时,你的程序会被打击。
因此,您需要在执行erase
之前添加此检查:
y = foods.find(c);
if( y != string::npos) {
foods.erase(y);
}
另外,在尝试从中读取一行之前,应始终确保文件open
成功。
inFile.open("OatmealFood.txt", ios::in);
if(!inFile.is_open()) {
// open failed..take necessary steps.
}
答案 1 :(得分:1)
我无法评论来自dcp的上述解决方案(还没有足够的帖子),为什么不使用其他可用的擦除方法?你为什么需要一个while循环?
你可以简单地打电话:
foods.erase(0,loc);
(你能不能?)
答案 2 :(得分:0)
尝试:
请注意,foods.erase(y)将从'f'向前删除字符。如果要将字符删除到'f',请参阅此示例:
以下是如何删除字符的简单示例:
string x = "abcdefghijk";
// find the first occurrence of 'f' in the string
int loc = x.find('f');
// erase all the characters up to and including the f
while(loc >= 0) {
x.erase(x.begin()+loc);
--loc;
}
cout<<x<<endl;
节目输出:
---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
ghijk
> Terminated with exit code 0.
所以对于你的例子,你需要这样的东西:
while(y >= 0) {
foods.erase(foods.begin() + y);
--y;
}
修改强>
您也可以消除while循环,只需调用重载的erase
,如下所示:
string x = "abcdefghijk";
int loc = x.find('f');
if (loc >= 0) {
x.erase(x.begin(),x.begin()+loc+1);
cout<<x<<endl;
}
节目输出:
---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
ghijk
> Terminated with exit code 0.