簡體   English   中英

將文件讀入緩沖區

[英]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,並在末尾添加空終止符。

幾個樣式說明:不建議使用變量名,例如“文件”或“大小”。 它是合法但不明智的做法,您可以查看一些流行的樣式指南以獲取更多信息( GoogleLLVM

其次,我將嘗試使它與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM