Standard C++ file size
来源:互联网 发布:搞怪声卡软件下载 编辑:程序博客网 时间:2024/06/06 01:40
groups中有一篇关于如何以标准的方式获得文件大小的帖子。帖子中指出一种方法,通过seek到文件末尾,并且进行tell获得当前的位置即可知道文件的大小。但是许多人指出该方式在不同系统上的表现是不一样的。
#include <fstream>#include <iostream>int main(){ std::ifstream in("somefile", std::ios::binary | std::ios::in); in.seekg(0, ios::end); std::cout << "file size: " << in.tellg() << std::endl;}
反对观点:
1. 有些系统(除unix, windows, mac),比如大型机系统(当然通常我们在pc上编程,这个不予考虑),text file和binary file是不同对待的,text file不能以binary方式打开,binary也不能以text方式打开。
2. 使用binary方式得到的文件大小和text方式得到的文件大小是不同,主要是因为text translation。在不同的系统上对于line ending的定义不同的,在windows上,是“\r\n”,而unix上是'\n',在mac上是'\r'。当无论是那种line ending,从file中读入后都是’/n'。在windows上读取到实际大小会小于存储在disk上的大小。
3. 文件大小的定义模糊。文件大小可能指,存储在disk上的文件所占用的扇区总和的大小,也可能是字符的个数,等等。可能文件中包含一些metadata,比如BOM。windows上的fseek在遇到bom的情况下,定义文件的起始处为BOM之后的数据,也就是说是实际文件的内容。
4. 使用seek到end的方式获得文件大小是不可移植的。在unix文件系统中,许多设备都被当成文件,但是不支持seek to end的方式,只能在读取内容后才能确定大小,比如/dev/tty。
5. 使用seek to end方式获得大小可能大于实际大小,因为文件的最后部分可能存在一些padding,这些garbbage数据也可能被计算在内。
总结:要想使用seek to end方式获得文件大小,在windows和unix上是可行的。如果要获得更加合理的大小,只能通过调用os特定的函数,比如windows上的GetFileSize*。
reference:
http://groups.google.com/group/comp.lang.c++/browse_thread/thread/a91eb83ba0e8377f/d27c88e57faadeb5?hl=en&#d27c88e57faadeb5
- Standard C++ file size
- File Size
- Standard C
- Standard C
- Standard File Descriptors
- get file size
- size of control file
- [C++] Size
- Unable to read TLD "META-INF/c.tld" from JAR file standard.rar
- HDFS 的 file size 和 block size
- C Standard Library
- C language standard headers
- C Standard Library
- The Standard C Library
- C Standard Library
- C Programming Language Standard
- C standard library headers
- C Standard Library
- 单反基础知识:光圈和快门
- 站着做人,跪着做事
- 常用数学符号的快速输入
- 在ubuntu上安装oracle10g
- 找两个对角线顶点之间的路径
- Standard C++ file size
- 我的Qzone记录
- CS书籍和方向
- COPY:CUDA3.0X86+WindowsXP32bitSP3+ VS2010+Visual assistX10.6安装指南
- 说说我们项目组的沟通
- DWR使用心得体会
- 浏览器设置
- C# 写Excel 代码
- 130道C#面试题