1

ファイルの内容を取得するように設計された関数があります。

bool getFileContents(std::string loc, std::string &code) {
    std::ifstream file(loc.c_str());

    if(!file.is_open())
        return err("Source file could not be read");

    int length;
    file.seekg(0, std::ios::end);
    length = file.tellg();
    file.seekg(0, std::ios::beg);

    char *buffer = new char[length];
    file.read(buffer, length);
    code = buffer;
    delete[] buffer;

    file.close();

    return true;
}

この関数を実行すると、ファイルの長さは常に正確に取得されます。ただし、ファイルを使用して関数を1回呼び出し、存在しないファイルを使用して再度呼び出してから、元のファイルを使用してもう一度呼び出すと、文字列「buffer」がint「length」よりも大きくなります。

まあ、それは正確ではないかもしれません-文字列'buffer'が文字列'code'にコピーされるとき、'code'は'length'より長くなります。'code'は、いずれの場合も、'getFileContents'の呼び出しの直前にインスタンス化されるため、前の値の問題ではありません。

これは、ファイルの内容を取得し、その後ファイルにテキストを追加または削除して、同じファイルの内容を再度取得した場合にも発生するようです。

私は文字列の経験がほとんどなく、正しく使用していないことがわかりますが、使用しているコードは例からのものであり、私は一生の間、文字列に問題があることを見つけることができません。

助けてくれてありがとう、ワイアット

4

2 に答える 2

3

問題はcode = buffer、バッファがどこで終了するかを知るためにNUL(\ 0)文字に依存していることです。偶然に(特にプログラムが開始されたばかりのときに)NUL文字を取得する場合がありますが、常にそうとは限りません。したがって、断続的な動作。

に置き換えcode = bufferてみてくださいcode = std::string(buffer, length)

于 2010-12-04T08:45:28.137 に答える
0

aixで説明されている\0の問題とは別に、二重割り当てを行います。これはここでは不要であり、安全ではありません(以前は例外でdeleteあり、メモリリークが発生する可能性があります)。代わりに、次のように文字列内にバッファを割り当てることができます。

code.resize(length);
file.read(&code[0], length);

また、の戻り値を確認することを忘れないでくださいreadlengthすべてのバイトが1つのステップで読み取られることは保証されていません。

于 2010-12-04T08:58:35.407 に答える