[英]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
文件大小應為 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.