-1

我已经为一个文件创建了预览处理程序,当我单击该文件时,我会在预览窗格中获得该文件的预览,背后的场景是我通过创建一个流来读取文件,并且该流我存储在缓冲区中,然后我使用缓冲区内容以在预览窗格上创建预览。

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

任何人都知道如何做到这一点?

4

3 回答 3

0

最简单的解决方案是:

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

这将创建一个与您读取的字节数完全相同的向量。从性能的角度来看,这并不是最优的:会有重新分配和复制,因为向量无法提前知道要分配多少。但这对于大多数用途来说已经足够了。(重新分配和复制通常比实际读取花费的时间更少。)

如果你真的想预先分配,没有真正可移植的解决方案。事实上,在包括 Windows 在内的许多系统上, 无法预先知道char您可以从以文本模式打开的文件中读取多少内容。然而,在实践中,寻求结束,然后将结果转换为 istream::tellg()足够大的整数类型将在 Windows 和 Unix 系统下工作,在 Unix 下给出精确的结果,并且值通常有点太大(但可能高达实际大小的两倍)在 Windows 下。这几乎是你能做到的。(请注意,从技术上讲,您甚至可以保证istream::tellg甚至可以转换为整数类型,或者如果是,结果不是一些神奇的 cookie。然而,在实践中,它可以在 Windows 和 Unix 下工作,尽管可能不在大型机上。)

否则,您可以使用系统特定的功能 GetFileSize(或stat在 Unix 下),但有相同的限制:Unix 的结果将是准确的,如果您以文本模式打开文件,则 Windows 下的结果会比所需的稍大。

于 2013-07-22T08:33:50.073 回答
0
// 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 );
   }
}
于 2013-07-22T08:32:39.090 回答
0

我已经完成了,只是使用了一个新的运算符。在我使用具有大小限制的堆栈之前,我的文件(要存储在缓冲区中的大小约为 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

它工作正常。

于 2013-07-29T16:14:22.553 回答