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 回答