2

ファイル システム ライブラリを使用していて、readline 関数を作成しようとしています。

int al_fgetc(ALLEGRO_FILE *f)

5.0.0 で導入

指定されたファイルの次のバイトを読み取って返します。ファイルの終わりまたはエラーが発生した場合に EOF を返します。

それは私がライブラリから使用している関数です。私がやりたいのは、+= -1 である != EOF の場合、結果の文字を std 文字列に変換することです。正しい結果を得るためにキャストする必要があるかどうかはわかりません。このようなものはそれを行いますか:

bool File::readLine( std::string& buff )
{
    if(eof() || !isOpen())
    {
        return false;
    }
    buff = "";
    int c = 0;
    while(c = al_fgetc(m_file) != EOF && c != '\n')
    {
        buff += (char)c;
    }
    return buff.length() > 0;
}

ファイルから utf-8 を読み取るので、これが正しく機能することを確認する必要があります。

ありがとう

4

3 に答える 3

4

!=はい、これは機能しますが、演算子は演算子よりも優先順位が高いため、余分な括弧のセットが必要です=

while((c = al_fgetc(m_file)) != EOF && c != '\n')
    ...

代わりにがfgetc返される唯一の理由は、可能な戻り値が 257 あることです: 可能なすべての 256 バイト、またはファイルにデータが残っていないことを示します。常に 0 ~ 255 または のいずれかを返すため、戻り値をまたはに対してテストしたら安全にキャストできます。intcharEOFEOFcharunsigned charEOF

于 2012-07-24T19:17:13.000 に答える
1

ええ、int を返す唯一の理由は、EOF シグナリングに使用できる「空き」値が char にないためです。したがって、それが EOF ではないことを確認し、その後それを char にキャストすることは、まさに彼らが期待していることです。

于 2012-07-24T19:13:04.977 に答える
1

fgetc によって返された文字をチェックするのではなく、feof(m_file) を使用して、ファイルの終わりに達したことをチェックしてみてください。これにより、読み取りループが eof チェックから分離されるため、キャストは必要ありません。

于 2012-07-24T19:14:33.530 に答える