如何动态地知道文件的大小



我已经为一个文件创建了预览处理程序,当我点击该文件时,我会在预览窗格中获得该文件的预览,以及后面的场景。我通过创建流来读取该文件,并将该流存储在缓冲区中,然后播放缓冲区内容,以便在预览窗格上创建预览。

现在我的问题是,我想动态地(使用visual c++)分配该文件的大小(我已经创建了该文件的dpreview处理程序),这样我就不需要手动将内存分配到缓冲区。我的意思是,数据使用流到达缓冲区,然后我将内容存储在缓冲区中。所以实际上我需要通过这个流知道文件的大小。(或者我们必须在知道文件大小的情况下处理流)

有人知道怎么做吗??

// crt_stat.c
// This program uses the _stat function to
// report information about the file named crt_stat.c.
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
int main( void )
{
   struct _stat buf;
   int result;
   char timebuf[26];
   char* filename = "crt_stat.c";
   errno_t err;
   // Get data associated with "crt_stat.c": 
   result = _stat( filename, &buf );
   // Check if statistics are valid: 
   if( result != 0 )
   {
      perror( "Problem getting information" );
      switch (errno)
      {
         case ENOENT:
           printf("File %s not found.n", filename);
           break;
         case EINVAL:
           printf("Invalid parameter to _stat.n");
           break;
         default:
           /* Should never be reached. */
           printf("Unexpected error in _stat.n");
      }
   }
   else
   {
      // Output some of the statistics: 
      printf( "File size     : %ldn", buf.st_size );
      printf( "Drive         : %c:n", buf.st_dev + 'A' );
      err = ctime_s(timebuf, 26, &buf.st_mtime);
      if (err)
      {
         printf("Invalid arguments to ctime_s.");
         exit(1);
      }
      printf( "Time modified : %s", timebuf );
   }
}

最简单的解决方案如下:

std::vector<char> data( (std::istreambuf_iterator<char>( file )),
                        (std::istreambuf_iterator<char>()) );

这将创建一个与您阅读从性能的角度来看,这不是最佳的:会有重新定位和复制,因为矢量不能提前知道要分配多少。但这已经足够了大多数用途。(重新分配和复制通常花费较少时间比实际读数长。)

如果你真的想预分配,没有真正可移植的解决方案事实上,在包括Windows在内的许多系统上没有提前知道您将能够获得多少char的方法从以文本模式打开的文件中读取。然而在实践中,搜索到最后,然后转换的结果CCD_ 2到足够大的积分类型将在Windows和Unix系统下工作Unix下的结果,并且值通常有点太大(但可能高达实际大小的两倍)。和这是你所能到达的最接近的地方。(注意,从技术上讲,你甚至可以保证istream::tellg的结果是甚至可以转换为积分类型,或者如果是,则结果并不是什么神奇的饼干。然而,在实践中在Windows和Unix下工作,尽管可能不在大型机。)

否则,您可以使用系统特定的功能GetFileSize(或Unix下的stat),与限制:Unix的结果将是准确的如果您正在打开,则窗口将稍大文本模式下的文件。

我已经完成了,只是使用了一个新的运算符。在我使用有大小限制的堆栈和我的文件(将存储在缓冲区中的文件大小约为4mb)之前,堆栈溢出,我通过如下操作找到了解决方案-

const int Size=5348928;
char* Buffer = new char[Size + 1];

而不是这样做-

char buffer[5348928]; //it will give stack over flow because the size of stack is limited

而且效果很好。

相关内容

  • 没有找到相关文章

最新更新