簡體   English   中英

fstream 給了我錯誤的文件大小

[英]fstream gives me wrong file size

我寫了簡單的 function 將整個文件讀入緩沖區。

#include <iostream>
#include <fstream>
int main()
{
    std::ios_base::sync_with_stdio(0);
    std::ifstream t;
    t.open("C:\\Users\\sufal\\Desktop\\test.txt");
    t.seekg(0, std::ios::end);    
    long length = t.tellg();           
    t.seekg(0, std::ios::beg);  
    std::cout << "file size: " << length << std::endl;
    char* buffer = new char[length+1];    
    t.read(buffer, length);       
    t.close();
    buffer[length] = 0;
    std::cout << buffer << std::endl;

    
    return 0; 
}

這是 test.txt:

1
2
3

程序生成的 output 如下所示: 在此處輸入圖像描述

文件大小應為 5 個字節。 為什么我的程序顯示錯誤的文件大小? Windows Explorer 似乎也顯示錯誤的文件大小為 7 個字節。

在 Windows 上,換行符是"\r\n" ,它由兩個字節組成。 因此,如果您的文件不以換行符結尾,則7確實是它的大小:

1     <-- 1 byte for '1', 2 bytes for CRLF
2     <-- 1 byte for '2', 2 bytes for CRLF
3     <-- 1 byte for '3'

要在字節級別上正確讀取文件,您需要以二進制模式打開它:

t.open("C:\\Users\\sufal\\Desktop\\test.txt", ios_base::binary);

(您可以在文檔中閱讀有關此行為的詳細信息)。

您還可以在 C++ 中看到將整個文件讀入字符串的其他選項:

您的文件大小為 7 個字節,因為它使用 CRLF 換行符。

1[cr][lf]
2[cr][lf]
3

但是,您以文本模式打開文件,Windows 會將 CRLF 換行符標准化為 LF。 您正在為緩沖區分配 7 個char ,但read()僅輸出 5 個char

1[lf]
2[lf]
3

這就是為什么您會在打印 output 的末尾看到額外的 2 =的原因,因為您沒有將未使用的緩沖區空間清零,因此您會看到來自未初始化的 memory 的隨機垃圾。

要執行您正在嘗試的操作,請改為以二進制模式打開文件。

t.open("C:\\Users\\sufal\\Desktop\\test.txt", std::ios_base::binary);

有關更多詳細信息,請參閱 cppreference.com 上的二進制和文本模式

在 Windows 上,這個文件確實是 7 個字節: 1 \r\n 2 \r\n 3

Windows 用兩個字節編碼新行 - CR + LF(或\r + \n在其他表示法中)。

一切都是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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