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;
}

当我运行这个函数时,文件的长度总是被准确地检索到。但是,如果我用一个文件调用该函数一次,用一个不存在的文件再次调用它,然后用原始文件再调用一次,字符串'buffer'大于int'length'。

好吧,这可能不准确,而是 - 当字符串 'buffer' 被复制到字符串 'code' 时,'code' 比 'length' 长。在每个实例中,“代码”都在调用“getFileContents”之前立即实例化,因此这与先前值无关。

如果我检索文件的内容,随后从文件中添加或删除一些文本,然后再次检索相同文件的内容,这似乎也会发生。

我对字符串几乎没有经验,并且认为我没有正确使用它们,但是我使用的代码来自一个示例,我一生都找不到它有什么问题。

感谢您的帮助,怀亚特

4

2 回答 2

3

好吧,问题在于code = buffer依赖 NUL (\0) 字符来知道缓冲区的结束位置。有时您可能会偶然获得 NUL 字符(尤其是在程序刚刚启动时),但并非总是如此。因此,间歇性行为。

尝试替换code = buffercode = std::string(buffer, length).

于 2010-12-04T08:45:28.137 回答
0

除了aix描述的 \0 问题之外,您还进行了双重分配,这在此处没有必要并且不安全(之前可能是一个异常delete,并且您将有内存泄漏)。相反,您可以在字符串内分配缓冲区,如下所示:

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

并且不要忘记检查read. 不能保证length一步读取所有字节。

于 2010-12-04T08:58:35.407 回答