1

このコードでvc++を使用してテキストファイル全体を読み取ろうとします

ifstream file (filePath, ios::in|ios::binary|ios::ate);
    if (file.is_open())
    {
        size = (long)file.tellg();
        char *contents = new char [size];
        file.seekg (0, ios::beg);
        file.read (contents, size);
        file.close();
        isInCharString("eat",contents);

        delete [] contents;
    }

しかし、ファイル全体をフェッチするわけではありません。なぜ、どのようにこれを処理するのでしょうか。

注:ファイルサイズは1.87MBおよび39854行です

4

4 に答える 4

2

次の行がありません

file.seekg (0, file.end);

前:

size = file.tellg();
file.seekg (0, file.beg);

この例で説明されているように:http ://www.cplusplus.com/reference/istream/istream/read/

于 2013-03-21T12:46:18.223 に答える
2

これを行う別の方法は次のとおりです。

std::string s;
{
    std::ifstream file ("example.bin", std::ios::binary);
    if (file) {
        std::ostringstream os;
        os << file.rdbuf();
        s = os.str();
    }
    else {
        // error
    }
}

または、Cライブラリ関数fopen、fseek、ftell、fread、fcloseを使用することもできます。c-apiは、より多くのSTLインターフェイスを犠牲にして、場合によってはより高速になる可能性があります。

于 2013-03-21T12:47:08.663 に答える
0

あなたは本当にドキュメントを読む習慣を身につける必要があります。ifstream :: readは、すべてのバイトを読み取らない場合があることが文書化されており、

   The number of characters successfully read and stored by this function 
   can be accessed by calling member gcount.

file.gcount()したがって、とを調べて問題をデバッグすることができますfile.rdstate()。また、このような大きな読み取りの場合、(明示的なループで)istream::readsomeメンバー関数を使用する方が適切な場合があります。(たとえば、64Kバイトのチャンクで読み取ることをお勧めします)。

PSそれはいくつかの実装またはシステム固有の問題である可能性があります。

于 2013-03-21T12:36:24.563 に答える
0

おかげさまで、以下のコードがファイル全体を読み取るというエラーが見つかりました。問題はVSウォッチャー自体にあり、フルテキストファイルではなく特定の量のデータが表示されるだけでした。

于 2013-03-24T13:46:57.320 に答える