将文件读入缓冲区

Reading file into buffer

有个小问题想不通。
我正在尝试将文件读入缓冲区, 我的问题是有时它会在文本末尾添加一个随机字符。 (有时?和 abs 等)。所以我想知道为什么会这样。我还没有找到任何解决方案。这个问题是随机发生的,不是每次我读文件的时候。

    static char text[1024 * 16];
    std::ifstream File(FilePath, std::ios::in | std::ios::out | std::ios::binary | std::ios::ate);
    std::streamsize Size = File.tellg();
    File.seekg(0, std::ios::beg);
    char *string = new char[Size + 1];
    if (File.is_open()) 
    {
         File.read(string, Size);
         memset(text, 0, sizeof(text));
         snprintf(text, sizeof(text), "%s", string);

    }
    File.close();
    delete[] string;

请注意 read() 不附加空终止符,它只是原始二进制读取。换句话说,数据不是字符串,而是字节数组。您可能正在尝试将其打印出来或进行其他操作,并且它会一直运行直到它看到一个空终止符,可能会进入未初始化的内存中。您应该手动分配 size + 1 并在末尾添加空终止符。

一些风格说明:不建议使用变量名,例如"File" 或"Size"。这是合法但不好的做法,您可以查看一些流行的风格指南以获取更多信息(Google, LLVM)

其次,我会尝试使用 std::string 来实现这一点,而不是手动分配内存,即使是在堆栈上也是如此。查看 reserve() and data()

这是一个使用 std::string 的简洁示例。更具可读性,更易于编写,并且同样高效。

const char *somefile = "main.cpp";
std::ifstream fh(somefile, std::ios::in | std::ios::out | std::ios::binary |
                               std::ios::ate);
const size_t sz = fh.tellg();
if (sz <= 0) {
    // error handling here
}
fh.seekg(0, std::ios::beg);
// Initalizes a std::string with length sz, filled with null
std::string str = std::string(sz, '[=10=]');
if (fh.is_open())
    fh.read(&str[0], sz);
fh.close();
std::cout << str << "[EOF]\n";