使用 lseek 在 C 中获取文件的大小? [关闭]
Posted
技术标签:
【中文标题】使用 lseek 在 C 中获取文件的大小? [关闭]【英文标题】:Getting a file's size in C with lseek? [closed] 【发布时间】:2014-04-26 04:14:26 【问题描述】:我正在尝试通过以下操作获取 C 中文件的大小...我是 C 新手
这是我文件顶部的 struct mem:
struct mem size_t size;
;
这是使用局部变量/返回语句等的正确设置吗?
struct mem* fileSize(char* filename)
currentPos = lseek(filename, (size_t)0, SEEK_CUR);
size = lseek(filename, (size_t)0, SEEK_END);
lseek(filename, currentPos, SEEK_SET); // seek back to the beginning of file
return size;
【问题讨论】:
您缺少变量定义。或者,如果这些是全局变量,它们应该是本地变量。您应该粘贴完整的可编译代码。或者,如果问题在于获取要编译的代码,则包括编译器错误。 在它的初始化上方定义 currentPos? How do you determine the size of a file in C?的可能重复 请记住,如果文件中包含 holes,则像这样使用lseek()
不会为您提供磁盘上文件的实际大小。
lseek()
也不将char *
作为其第一个参数。这段代码 sn-p 有很多错误,很难知道从哪里开始。就目前而言,逻辑大致是正确的,但是当您将函数定义为返回 struct mem *
时,您尝试返回某种整数,对 lseek()
使用错误的参数等。
【参考方案1】:
从可以观察到的情况,也许您想知道如何将文件大小以“mem”结构(您自己的设计)传递回调用者。这当然是可能的;然而,'fileSize()' 函数必须提供内存来返回这个 'mem' 结构。也许是这样的:
struct mem* fileSize(char* filename)
struct mem *m = malloc(sizeof(*m));
添加上面的行来分配合适大小的内存。
...也许还有一个小的oversite... lseek() 没有将文件名作为第一个参数。相反,它需要一个“文件描述符”,可以通过实现“open()”(从文件名)获得:
int fd = open(filename, O_RDONLY);
现在,fd 可以传递给 'lseek()',而不是文件名。
off_t currentPos = lseek(fd, (size_t)0, SEEK_CUR);
m->size = lseek(fd, (size_t)0, SEEK_END);
“m”是一个“struct mem *”,您现在可以在其中存储大小。
lseek(fd, currentPos, SEEK_SET); // seek back to the beginning of file
完成后不要忘记关闭文件:
close(fd);
return(m);
分配和初始化的'm'返回给调用者(m->size)。
(fileSize 的)调用者在完成后应该“释放()”(struct mem)内存,以防止内存泄漏。
【讨论】:
如果发布的代码显示为正确,您也应该更正lseek()
调用的错误参数。
@PaulGriffiths,感谢您的建议。如果他的问题更多是关于如何返回结构,我不想让他无所事事。我会按照你的建议去做。
我认为@PaulGriffiths 的意思是lseek(filename..
应该是lseek(fd...
@evolvedmicrobe,谢谢。 (固定)【参考方案2】:
您可以使用 POSIX 函数stat(2)
直接找出文件的大小。如果你只想使用标准 C 库函数,那么你应该使用fseek(3)
和ftell(3)
。
【讨论】:
@JohnSmith 然后先阅读它的手册。【参考方案3】:lseek() 不适用于文件名。它需要一个整数文件句柄。试试 stat() 代替。此外,不要使用指针返回值。像这样的:
size_t fileSize(char* filename)
size_t rv = 0; // I like to return 0, if badness occurs
struct stat file_info;
if ( (filename != NULL) && (stat(filename,&file_info) == 0) ) //NULL check/stat() call
rv = (size_t)file_info.st_size; // Note: this may not fit in a size_t variable
return rv;
【讨论】:
以上是关于使用 lseek 在 C 中获取文件的大小? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章