题
我怎么能找出的文件的大小、字节?
#include <stdio.h>
unsigned int fsize(char* file){
//what goes here?
}
解决方案
根据NilObject的代码:
#include <sys/stat.h>
#include <sys/types.h>
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
更改:
- 做出的文件参数
const char
. - 纠正
struct stat
定义,这是缺失的变量名称。 - 返回
-1
在错误,而不是的0
, 这将是模糊的一个空的文件。off_t
是的签名类型,因此这是可能的。
如果你想要的 fsize()
打印一个消息上的错误,可以使用这样的:
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
fprintf(stderr, "Cannot determine size of %s: %s\n",
filename, strerror(errno));
return -1;
}
在32位系统您应该编制这样的选择 -D_FILE_OFFSET_BITS=64
, 否则 off_t
将只持有的价值为2GB。看到的"使用劳动力调查"的部分的 大文件支持在Linux 对于细节。
其他提示
不要用 int
.文件超过2千兆字节的尺寸是常见的作为土的这些天
不要用 unsigned int
.文件超过4千兆字节的尺寸是常见的一些稍微不太常见的污垢
请参考标准图书馆的定义 off_t
作为一个未签名的64位整数,这是什么每个人都应该使用。我们可以重新定义,是128位在几年的时候,我们开始有16台的文件。
如果你在窗,应该使用 GetFileSizeEx -它实际上使用的一个签署了64位整数,所以他们就开始打的问题8的文字的文件。愚蠢的微软!:-)
马特的解决方案应工作,除了它的C++而不是C,最初说不应该是必要的。
unsigned long fsize(char* file)
{
FILE * f = fopen(file, "r");
fseek(f, 0, SEEK_END);
unsigned long len = (unsigned long)ftell(f);
fclose(f);
return len;
}
固定你准备你了。;)
更新:这不是真的最好的解决办法。这是限于4G文件,在Windows并很可能低于仅仅使用一种特定平台呼叫喜欢 GetFileSizeEx
或 stat64
.
**不要这样做(为什么?):
引用C99标准的医生,我在网上找到的:"设置文件的指示器位置,以最终文件,作为与fseek(文件,0,SEEK_END),具有不确定行为的一个二流(因为可能的后null人物)或者用于任何流与国家依赖编码,不肯定的结束,在初始转移的状态。**
改变定义int使得错误信息,可以传送,然后使用fseek()and ftell()将确定文件的大小。
int fsize(char* file) {
int size;
FILE* fh;
fh = fopen(file, "rb"); //binary mode
if(fh != NULL){
if( fseek(fh, 0, SEEK_END) ){
fclose(fh);
return -1;
}
size = ftell(fh);
fclose(fh);
return size;
}
return -1; //error
}
如果你没有使用std c图书馆:
#include <sys/stat.h>
off_t fsize(char *file) {
struct stat filestat;
if (stat(file, &filestat) == 0) {
return filestat.st_size;
}
return 0;
}
POSIX
的 POSIX 标准的具有其自己的方法得到的文件的大小。
包括 sys/stat.h
头使用的功能。
概要
- 获得的文件的统计数据的使用
stat(3)
. - 获得
st_size
财产。
例
注意到:它限制了尺寸 4GB
.如果不 Fat32
文件系统则使用的64位。
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char** argv)
{
struct stat info;
stat(argv[1], &info);
// 'st' is an acronym of 'stat'
printf("%s: size=%ld\n", argv[1], info.st_size);
}
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char** argv)
{
struct stat64 info;
stat64(argv[1], &info);
// 'st' is an acronym of 'stat'
printf("%s: size=%ld\n", argv[1], info.st_size);
}
ANSI C(标准)
的 ANSI C 不直接提供的方式来确定长度的文件。
我们将必须使用我们的心灵。现在,我们将使用所寻求的方法!
概要
例
#include <stdio.h>
int main(int argc, char** argv)
{
FILE* fp = fopen(argv[1]);
int f_size;
fseek(fp, 0, SEEK_END);
f_size = ftell(fp);
rewind(fp); // to back to start again
printf("%s: size=%ld", (unsigned long)f_size);
}
如果文件是
stdin
或管。 POSIX,ANSI C 不会的工作。
它将会返回0
如果文件是一种管道或者stdin
.见:你应该使用 POSIX 标准,而不是。因为,它有64位的支持。
如果你建立一个Windows的应用程序,使用 GetFileSizeEx API为CRT文件I/O混乱,特别是用于确定文件长度,由于特殊性在文件表示在不同的系统;)
快速搜索的在谷歌找到 方法的使用fseek和ftell 和一线与这个问题的答案,它不能做的只有C在另一种方式。
我使用这套代码,以查找的文件的长度。
//opens a file with a file descriptor
FILE * i_file;
i_file = fopen(source, "r");
//gets a long from the file descriptor for fstat
long f_d = fileno(i_file);
struct stat buffer;
fstat(f_d, &buffer);
//stores file size
long file_length = buffer.st_size;
fclose(i_file);
试试这个--
fseek(fp, 0, SEEK_END);
unsigned long int file_size = ftell(fp);
rewind(fp);
这不会是第一个,找到结束文件;然后,报告在文件指针。最后(这是可选)它倒回到开头的文件。注意, fp
应该是一个二流。
file_size包含的数字节的文件包含的内容。注意,由于(根据climits.h)unsigned long类型限于4294967295字节(4千兆字节),你会需要找到一个不同的变量类型,如果你有可能处理的文件比大。
这里有一个简单和清洁能返回的文件的大小。
long get_file_size(char *path)
{
FILE *fp;
long size = -1;
/* Open file for reading */
fp = fopen(path, "r");
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fp.close();
return
}
你要需要使用一个图书馆功能检索的细节的文件。C是完全独立的平台,你们需要让我们知道平台/操作系统正在开发。
看问题, ftell
可以很容易地获得数字节。
long size ;
size = ftell(FILENAME);
printf("total size is %ld bytes",size);
你可以打开文件,转到0相对偏从底部的文件
#define SEEKBOTTOM 2
fseek(handle, 0, SEEKBOTTOM)
返回的值从fseek是该文件的大小。
我没有代码C很长一段时间,但我认为它应的工作。