0

我正在开发一个小程序,该程序采用输入文件并处理文件中的数据。使用我当前的代码(见下文),当您输入有效的文件名时,它只会冻结命令行(下拉一行并仅显示闪烁的 _ ),我必须终止程序才能退出。如果您输入无效的文件名,则 if(!file) 会被调用并正常运行。真正奇怪的是,如果我在 if 语句上方放置一个调试 cout,如果文件名正确,它将不会被调用。希望您能提供帮助,如果您需要更多信息,请告诉我!

这是我当前的代码:

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();

}
4

2 回答 2

3

你的问题是你永远不会在循环中增加 i 。

这里:

    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());

并且代码仍然可以工作。

于 2013-01-12T13:11:38.557 回答
1

您的代码中还有一个关于使用getline()and的问题eof()。逐行读取文件的惯用方法是:

std::string line;
while(getline(in, line)) {
    // handle line here
}

in指一些输入流,例如 std::ifstream 或 std::cin。关键是读取一行可能会失败(例如,由于 EOF),您可以在上面的循环中检查它。您的版本仅检查之前是否遇到过 EOF,但不会检查后续getline()调用是否实际产生任何数据。

于 2013-01-12T13:19:05.560 回答