[英]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()不會附加空終止符,而只是原始的二進制讀取。 換句話說,數據不是字符串,而是字節數組。 您可能正在嘗試將其打印出來,或者一直打印下去,直到看到空終止符為止,並可能將其存入未初始化的內存中。 您應該手動分配大小+ 1,並在末尾添加空終止符。
幾個樣式說明:不建議使用變量名,例如“文件”或“大小”。 它是合法但不明智的做法,您可以查看一些流行的樣式指南以獲取更多信息( Google , LLVM )
其次,我將嘗試使它與std :: string一起使用,而不是手動分配內存,即使在堆棧上也是如此。 簽出reserve()和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, '\0');
if (fh.is_open())
fh.read(&str[0], sz);
fh.close();
std::cout << str << "[EOF]\n";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.