我已经为文件创建了预览处理程序,当我点击该文件时,我在预览窗格中获得该文件的预览,后面的场景是我通过创建流来读取文件,并且我存储在一个流中缓冲区,然后我使用缓冲区内容,以便在预览窗格上创建预览。
现在我的问题是我想动态分配该文件的大小(我已经创建了dpreview处理程序)(使用visual c ++),这样我就不需要手动将内存分配给缓冲区了。我的意思是数据使用流进入缓冲区,然后我将内容存储在缓冲区中。所以实际上我需要通过该流知道文件的大小。(或者我们必须在知道文件大小时处理流)
任何人都知道如何做到这一点?
答案 0 :(得分: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 );
}
}
答案 1 :(得分:0)
最简单的解决方案是:
std::vector<char> data( (std::istreambuf_iterator<char>( file )),
(std::istreambuf_iterator<char>()) );
这将创建一个具有您的字节数的向量 读。从性能的角度来看,这不是最佳选择: 会有重新分配和副本,因为矢量不能 知道要提前分配多少。但这足够了 最常用的。 (重新分配和副本通常需要更少 时间比实际读数。)
如果你真的想要预先分配,那就没有真正的便携性
解。事实上,在许多系统上,包括Windows,都有
没有提前知道你能够多少char
的方法
从文本模式打开的文件中读取。然而,在实践中,
寻求到底,然后转换结果
istream::tellg()
到足够大的整数类型
在Windows和Unix系统下工作,准确无误
在Unix下的结果,一个值通常有点太大
(但可能高达实际大小的两倍)在Windows下。和
这就差不多了。 (请注意,从技术上讲,
你甚至保证istream::tellg
的结果是
甚至可以转换为整数类型,或者如果是,那就是
结果不是一些神奇的饼干。然而,在实践中,它会
在Windows和Unix下工作,尽管可能没有
大型机。)
否则,您可以使用系统特定功能
GetFileSize
(或Unix下的stat
),具有相同的功能
限制:Unix结果将是精确的,那些在
如果您打开,Windows将略大于必要的
文本模式下的文件。
答案 2 :(得分: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
它工作正常。