我正在开发一个小程序,它接受输入文件并处理文件中的数据。使用我当前的代码(见下文),当你输入一个有效的文件名时,它只是冻结命令行(下拉一行,只显示一个闪烁的_),我必须杀死该程序才能退出。如果输入无效的文件名,则调用if(!file)并运行正常。 真奇怪的是,如果我将调试cout放在if语句之上,那么如果文件名正确则不会调用它。希望您能提供帮助,如果您需要更多信息,请告诉我们!
这是我目前的代码:
using namespace std;
#include <iostream>
#include <stdexcept>
#include <string>
#include <fstream>
#include <vector>
#include <cctype>
#include "Student.h"
int main(){
string filename, name;
char *inputfile;
ifstream file;
vector<Student> students;
const int SIZE = 200;
char buffer [SIZE];
int regno, i;
cout << "Enter file name: ";
cin >> filename;
inputfile = const_cast<char*> (filename.c_str());
file.open(inputfile);
if (!file){
cout << "Failed to open " << filename << endl;
exit(1);
}
while (!file.eof()){
file.getline(buffer, SIZE);
i = 0;
regno = 0;
while (isdigit(buffer[i])){
regno = (regno*10)+buffer[i];
}
cout << regno;
}
file.close();
}
答案 0 :(得分:3)
你的问题是你永远不会在循环中增加我。
这里:
i = 0;
regno = 0;
while (isdigit(buffer[i])){
regno = (regno*10)+buffer[i];
}
你进入无限循环,因为我总是保持0。
另外你为什么要做const_cast?您也可以使用const char *打开。所以你可以这样写:
cin >> filename;
file.open(filename.c_str());
代码仍然有用。
答案 1 :(得分:1)
您的代码中有关使用getline()
和eof()
的其他问题。逐行读取文件的惯用方法是:
std::string line;
while(getline(in, line)) {
// handle line here
}
in
引用一些输入流,如std :: ifstream或std :: cin。重点是读取一行可能会失败(例如由于EOF),您在上面的循环中检查。您的版本仅检查之前是否遇到EOF,而不是后续的getline()
调用实际产生了任何数据。