C 从文件功能读取循环时无法退出
C++ reading from file function failing to exit while cycle
可能的重复:
中的文件结束
C
我编写了一个函数来读取.txt文件的数据,但是当我调用它时,它会不断崩溃。这是代码:
void beolvas(vector<int> &charge, vector<int> &deliver, vector<Robot*> &robots) {
string s;
ifstream f;
do {
cout << "Add meg a filenevet" << endl;
cin >> s;
f.open(s.c_str());
} while (!f.good());
cout << "adatok beolvasasa..." << endl;
int napok;
if (!(f >> napok)) throw 1;
charge.resize(napok);
deliver.resize(napok);
for (int i = 0; i<napok; i++) {
if (!(f>>charge[i])) throw 1;
if (!(f>>deliver[i])) throw 1;
}
string type, name;
int battery;
while (!f.eof()) {
cout << " a ";
if (f>>type && f>>name && f>>battery) {
if (type=="Mac") {
Mac r = Mac(name,battery);
robots.push_back(&r);
};
if (type=="Eco") {
Eco r = Eco(name,battery);
robots.push_back(&r);
};
if (type=="Pro") {
Pro r = Pro(name,battery);
robots.push_back(&r);
};
};
};
}
似乎问题出现在当时的循环中。如果我想从3行长文本中阅读,我会在屏幕上收到4个字母A-S(我在阅读每一行之前就打印了一个。
)。 f.eof()
不是我需要在这里使用的功能吗?
这是从文件读取的最常见问题之一。检查f.eof()
只能确定您是否上一个阅读点击文件的末尾。因此,在上次成功阅读(您获得第三个" a"印刷)之后,eof()
返回false,您的循环再执行一次,输出额外的" A"。
相反,使用提取行作为while
循环的条件:
while (f>>type && f>>name && f>>battery) {
if (type=="Mac") {
Mac r = Mac(name,battery);
robots.push_back(&r);
}
if (type=="Eco") {
Eco r = Eco(name,battery);
robots.push_back(&r);
}
if (type=="Pro") {
Pro r = Pro(name,battery);
robots.push_back(&r);
}
}
这有效,因为一旦您的一种提取命中文件末尾,while
条件将是错误的,并且循环不会执行。
如果您想在格式不佳的线路后继续,我建议您使用std::getline
:
std::string line;
while (std::getline(f, line)) {
std::stringstream ss(line);
if (ss >> type && ss >> name && ss >> battery) {
// ...
}
}
使用此std::getline
方法的原因是,如果正确格式化了一半的线路,您将遇到问题。您的方法可能会在type
和name
中读取,然后在battery
上失败,并且循环的下一个迭代将从同一位置开始。
您还将对将指针推向具有自动存储持续时间的对象的事实有问题。当创建对象结束的块时,指针将指向无效的对象。
这是一个常见问题。在C/C 中,只有在您尝试读取过去末端之后才能触发文件末端条件。因此,您不能从feof()== false中假设输入可用(因为您可以正好处于文件的末尾,但是尚未过去)。您应始终测试有效输入读取操作。
相关文章:
- C++ 自动点击器未退出循环
- 使用 while 或 do while 退出循环
- 退出循环,除非未给出输入
- C++线程退出循环条件
- 在C++测试家庭作业问题中的字符串输入时无法退出循环(作为数据验证)
- 虽然具有多个 OR 条件的循环不退出循环
- 如果程序退出循环是goto已删除的本地变量
- 中断语句未退出循环
- 计算平均值,而不向退出循环添加负等级
- 使用键盘挂钩时无法动态退出循环
- 定义时间后退出C 循环
- 使用goto来干净地退出循环
- getchar 有什么问题(因为程序在没有检查的情况下退出循环)
- 尝试退出循环时,Ctrl+Z 不起作用
- 如何获取用户输入以退出循环
- 正在销毁线程并退出循环
- 中断语句不会退出循环
- 通过输入一个特定的字母c++来退出循环
- 在c++中,当输入不是unsigned时立即退出循环
- 编程原理和实践使用C++while-loop演练。找不到退出循环的方法