将文件读入缓冲区
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";
有个小问题想不通。
我正在尝试将文件读入缓冲区,
我的问题是有时它会在文本末尾添加一个随机字符。 (有时?和 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";