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];
    }

i は常に 0 のままなので、無限サイクルに入ります。

また、なぜ const_cast を行うのですか? const char * を使用して開くこともできます。したがって、これを書くことができます:

cin >> filename;
file.open(filename.c_str());

そして、コードは引き続き機能します。

于 2013-01-12T13:11:38.557 に答える
1

との使用に関して、コードに別の問題がありgetline()ますeof()。ファイルを 1 行ずつ読み取る慣用的な方法は次のとおりです。

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

instd::ifstream や std::cin などの入力ストリームを参照します。ポイントは、行の読み取りが失敗する可能性があることです (たとえば、EOF が原因で)。ループの上でチェックインします。お使いのバージョンでは、以前に EOF が発生したかどうかのみがチェックされますが、その後のgetline()呼び出しで実際にデータが生成されたかどうかはチェックされません。

于 2013-01-12T13:19:05.560 に答える