我正在使用Linux和C++.我有一个大小为210732字节的二进制文件,但使用seekg/tellg报告的大小为210728.
我从ls-la获得以下信息,即210732字节:
-rw-rw-r-- 1 pjs pjs 210732 Feb 17 10:25 output.osr
并使用以下代码片段,我得到210728:
std::ifstream handle;
handle.open("output.osr", std::ios::binary | std::ios::in);
handle.seekg(0, std::ios::end);
std::cout << "file size:" << static_cast<unsigned int>(handle.tellg()) << std::endl;
Run Code Online (Sandbox Code Playgroud)
所以我的代码关闭了4个字节.我已使用十六进制编辑器确认文件的大小是正确的.那么为什么我没有得到正确的尺寸?
我的回答:我认为这个问题是由于文件中有多个开放的fstream引起的.至少那似乎已经为我解决了.感谢所有帮助过的人.
简而言之:C中的跨操作系统,大文件支持是可怕的.
目标:我试图让"单向"(最可能是基于宏的)允许32位AND 64位具有大文件支持.理想情况下,使用typedef,#ifdef,#(n)定义等宏包装器可以允许以#include库或一组定义的宏的形式支持基本的大文件.
研究: POSIX的文件操作在BSD/Mac/Linux上的性能非常好,适用于32和64位IO,文件大小超过典型的2 ^ 31大小,但即使在Windows上使用clang或mingw,由于M $,我也无法利用这些调用.愚蠢的POSIX实现(如果这就是我们想要的那个......).我倾向于在Windows上使用CreateFile(),ReadFile(),WriteFile(),但这在方法和数据类型方面与POSIX的open()/ read()/ write()/ close()/ etc完全不同.用过的.
问题:在我的键盘和几本教科书上敲击之后,我决定轮询所有人,看看:你们/ gals如何完成支持大文件的跨操作系统文件I/O?
PS我有研究链接: