-3

我正在尝试通过以下操作获取 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;
}
4

3 回答 3

3

从可以观察到的情况来看,也许您想知道如何将文件大小以“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)内存,以防止内存泄漏。

于 2014-04-26T04:39:35.690 回答
0

您可以使用 POSIX 函数stat(2)直接找出文件的大小。如果您只想使用标准 C 库函数,那么您应该使用fseek(3)and ftell(3)

于 2014-04-26T04:30:41.833 回答
0

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;
}
于 2014-04-26T04:35:01.057 回答