0

私はこの理論を持っています.fseekとftellを使用してファイルサイズを取得し、動的配列をバッファとして構築できます。次に、fgets() のバッファーを使用します。私は現在、それを行う方法を思い付くことができません。

私の理論は、最初のファイルのサイズをバイト単位で知らないことに基づいています。したがって、構築するバッファの大きさがわかりません。ファイルが 2 GB を超える場合はどうなりますか? SearchInFile() に入れるファイルのファイル サイズを変更して認識するバッファーを構築できるようにしたいと考えています。

これが私がこれまでに持っているものです:

int SearchInFile(char *fname, char *fname2)
{
    FILE *pFile, *pFile2;
    int szFile, szFile2;

    // Open first file
    if( (fopen_s(&pFile, fname, "r")) != NULL )
    {
        return(-1);
    }

    // Open second file
    if( (fopen_s(&pFile2, fname2, "r")) != NULL )
    {
        return(-1);
    }

    // Find file size 
    fseek(pFile, 0L, SEEK_END);
    szFile = ftell(pFile);
    // Readjust File Pointer
    fseek(pFile, 0L, SEEK_SET);

    std::vector <char> buff;
    //char buff[szFile];

    while(fgets(buff.push_back(), szFile, pFile))
    {


    }

どんな考えや例も素晴らしいでしょう。ここ数時間、ネットで検索しています。

4

1 に答える 1

1

ベクトルは大きくなる可能性があるため、事前にサイズを知る必要はありません。次の 4 行は、必要なことを行います。

std::vector<char> buff;
int ch;
while ((ch = fgetc(pFile)) != EOF)
    buff.push_back(ch);

fgetcを使用するよりも簡単な、単一の文字を読み取る関数fgetsです。

ファイルサイズが事前にわかっている場合はbuff.reserve(szFile)、ループの前に呼び出すことができます。これにより、ループが少し効率的になります。

于 2012-11-10T13:13:56.063 に答える