0

EOF までテキスト ファイルから 1 文字ずつ読み取り、それらを文字配列に入れて、後で操作できるようにしようとしています。エラーなしで g++ でコンパイルされ、実行すると、入力ファイルの入力を求められますが、ハングします。

int main (int argc, char *argv[]) {
    string filename;
    ifstream infile;

    char *cp, c[1024];
    memset (c, 0, sizeof(c));
    cp = c;

    cout << "Enter file name: " << endl;
    cin >> filename;

    //open file
    infile.open( filename.c_str() );

    //if file can't open
    if(!infile) {
        cerr << "Error: file could not be opened" << endl;
        exit(1);
    }

    while (!infile.eof()); {
        infile.get(c, sizeof(infile));
       // get character from file and store in array c[]
    }
}//end main
4

3 に答える 3

1

istream::read()ではなく、メソッドを試す必要がありget()ます。これは、バッファ オーバーランを解決するのに役立ちます。

unsigned int chars_read = 0;
//...
// Read in the file.
if (!infile.read(c, sizeof(c))
{
    // Handle the read error here.
    // Also check for EOF here too.
}

// Obtain the number of characters actually read.
chars_read = infile.gcount();
于 2012-11-25T04:05:04.373 に答える
0

これを試して:

int cont = 0;
while(infile.good()) {
  c[cont++] = infile.get();
}
于 2012-11-25T03:33:09.173 に答える
0

まず、テストしたくないeof()! なんだか風車を見つけたドン・キホーテのような気分になります。ただし、ストリームを読み取ろうとする前に、それが成功するかどうかわからないため、読み取りを試みたに入力が成功したことを確認する必要があることは知っています。

あなたのプログラムは実際にはハングしません!文字を入力するか、入力を終了するのを待つだけですsizeof(infile)(たとえば、UNIX では Ctrl-D を使用し、Windows では Ctrl-Z を使用します)。もちろん、これはぶら下がっているプログラムのように見えるかもしれません。より小さなサイズを使用することで、これが実際に問題であることを確認できます4。もちろん、sizeof(infile)は小さな乱数とほぼ同じです。これは型のオブジェクトのサイズであり、それがstd::ifstream何であるかを誰が知ることができるでしょうか? おそらく、 へsizeof(c)の呼び出しget(c, n)が に収まる以上の文字を書き込まないようにするために を使用するつもりでしたc

于 2012-11-25T03:26:22.370 に答える