0

以下のコードはクラッシュするか、入力ファイルの大きさに応じて無限ループに陥ります。A2T 行がオーバーフローを引き起こしていると思いますが、代わりに何を使用すればよいかわかりません。コードを簡潔で安全なものにするための助けをいただければ幸いです。

ご協力いただきありがとうございます。

#define END "\r\n"
#define TAG "Is this string in this line"
std::fstream myFile;
std::fstream outFile;
char cLine[300];
while (!myFile.eof() && !myFile.fail())
{
    tstring tTemp = A2T(cLine);
    if ( tstring::npos == tTemp.find(TAG))
    {
        outFile.write(cLine, strnlen(cLine, 300));
        if (!outFile.bad())
        {
            outFile.write(END, strnlen(END, 300));
        }

        if (outFile.bad())
        {
           break;
        }
    }
    myFile.getline(cLine, 300);
}
4

1 に答える 1

0

「A2T」は「alloca()」を使用するため、入力ファイルの内容全体をスタックに割り当てます。大きなファイルはスタックを吹き飛ばします。「tstring」を使用して大量の割り当てオーバーヘッドを発生させる代わりに、「strstr()」などの関数を使用して cLinep[] を直接検索します。そのコピーをいくつか作成する必要はありません。

編集: IInspectable が指摘したように、このコードは ANSI としてコンパイルされているように見えるため、「T」は「char」であり、A2T はノーオペレーションです。つまり、実際のコードがここに表示されていないものを示している場合を除きます。いずれにせよ、TAG を検索するためだけに文字列に変換する必要はないので、以下のコードの方が優れています。

#define END "\r\n"
#define TAG "Is this string in this line"
std::fstream myFile;
std::fstream outFile;
char cLine[300] = {0}; // Make sure this is initialized

while (!myFile.eof() && !myFile.fail())
{
    char *p = strstr(c, TAG);
    if (p == 0)  // Exclude lines with "TAG" in them.
    {
        outFile.write(cLine, strnlen(cLine, 300));
        if (!outFile.bad())
        {
            outFile.write(END, strnlen(END, 300));
        }

        if (outFile.bad())
        {
           break;
        }
    }
    myFile.getline(cLine, 300);
}
于 2013-09-19T18:40:58.007 に答える