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

C++ 如何动态地知道文件的大小,c++,winapi,stream,dynamic-memory-allocation,C++,Winapi,Stream,Dynamic Memory Allocation,我已经为一个文件创建了预览处理程序,当我单击该文件时,我会在预览窗格中获得该文件的预览,然后通过创建流读取该文件,该流存储在缓冲区中,然后播放缓冲区内容,以便在预览窗格中创建预览 现在我的问题是,我想动态地(使用visual c++)分配该文件的大小(我已经创建了dpreview处理程序),这样就不需要手动将内存分配给缓冲区。我的意思是,数据使用流进入缓冲区,然后我将内容存储在缓冲区中。因此,实际上我需要通过该流知道文件的大小。(或者我们必须在知道文件大小的过程中处理该流) 有人知道怎么做吗 /

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

现在我的问题是,我想动态地(使用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     : %ld\n", 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 );
   }
}
//该程序使用_stat函数 //报告有关名为crt_stat.c的文件的信息。 #包括 #包括 #包括 #包括 #包括 内部主(空) { 结构_statbuf; int结果; char-timebuf[26]; char*filename=“crt_stat.c”; 错误没有错误; //获取与“crt_stat.c”关联的数据: 结果=_stat(文件名,&buf); //检查统计数据是否有效: 如果(结果!=0) { perror(“获取信息的问题”); 开关(错误号) { 案例说明: printf(“未找到文件%s。\n”,文件名); 打破 案例EINVAL: printf(“对_stat的参数无效。\n”); 打破 违约: /*永远都不应该被联系到*/ printf(“u stat中出现意外错误。\n”); } } 其他的 { //输出一些统计数据: printf(“文件大小:%ld\n”,buf.st\u大小); printf(“驱动器:%c:\n”,buf.st_dev+'A'); err=ctime_s(timebuf、26和buf.st_mtime); 如果(错误) { printf(“ctime_s的无效参数”); 出口(1); } printf(“修改时间:%s”,timebuf); } }
最简单的解决方案是:

std::vector<char> data( (std::istreambuf_iterator<char>( file )),
                        (std::istreambuf_iterator<char>()) );
std::矢量数据((std::istreambuf_迭代器(文件)),
(std::istreambuf_迭代器());
这将创建一个向量,该向量正好包含您需要的字节数 阅读从性能的角度来看,这不是最优的: 将有重新分配和复制,因为向量不能 提前知道要分配多少。但这对我来说已经足够了 大多数用途。(重新分配和复制通常需要更少的时间。) 时间超过实际读数。)

如果你真的想预先分配,没有真正的可移植性 解决方案事实上,在许多系统上,包括Windows,都存在 无法预先知道您将能够使用多少个
char
从以文本模式打开的文件中读取。但实际上,, 寻找到底,然后转换结果
istream::tellg()
到足够大的整数类型 在Windows和Unix系统下工作,提供准确的 Unix下的结果,并且值通常有点太大 (但可能是实际尺寸的两倍)在Windows下。及 这差不多是你能到达的最接近的地方了。(注意,技术上, 您甚至可以保证,
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

而且工作正常。

对于Windows,
GetFileSize
可能更合适。但是,对于以文本模式打开的文件,所有Windows解决方案都将返回一个稍大的值。请告诉我您没有在代码中硬编码文件的大小。对不起…请解释您的问题??是的,我使用的文件大小为4-5mb。实际上,我正在这个缓冲区中存储一个流(它的大小很大,所以char buffer[5348928];不起作用),如果文件大小发生变化,会发生什么?如果它比这个尺寸大呢?如果它变小了,为什么要分配这么多?事实上,我绝望了。语言无法形容这有多糟糕。@Neil第一个解决方案是将大尺寸分配给“尺寸”变量,但这不是很好,你能给我一些建议吗???谢谢你关心我的问题,但你能告诉我如何动态声明吗?实际上,我希望缓冲区根据需要动态分配大小(不像我那样..它只是我程序中的一小部分,但不适用于每一个程序)。请给我这样做的建议看看本页上的示例代码,它显示了如何找到文件大小并将其读入内存。