关于读取二进制文件数据放入数组的问题

haven_t 2008-12-08 10:26:47
fread函数能把文件数据读入数组,其首个参数是一个void*(一个指向数组首地址的指针),但在文件读入前并不知道该为这个数组分配多少空间,我想的方法是使用vector <char>储存数据,在获得文件大小后使用resize分配足够的空间,再用begin获得首地址,然后调用但不知道这样使用有没有什么隐患,请问还有什么更好的方法?

vector <char> byte;
vector <char>::iterator iter=byte.begin();
int filesize=buf.st_size;
fread(iter,sizeof(char),filesize,file);
...全文
439 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
haven_t 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
干嘛要管vector大小呢?空间不够会自动增长的。要是为了效率,可以估计个值reserve就行了。
读入可以用泛型的copy函数,和插入迭代器。
[/Quote]

fread是一次性读入,并非使用push逐个读入,所以要预先分配空间啊。
xiaohou0701 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Chiyer 的回复:]
C/C++ code
这样去得到文件大小

FILE* pFile = fopen("test.dat", "rb");
long s = ftell(pFile);
fseek(pFile, 0, SEEK_END);
long fileSize = ftell(pFile) - s;
fseek(pFile, s, SEEK_SET);


其中fileSize 就是文件大小,然后你就可以根据这个大小去创建你的数组
[/Quote]

UP,我就是这样做的,得到filesize之后,
用char* ch = new char[filesize];创建
xyxwangkai 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Chiyer 的回复:]
C/C++ code
这样去得到文件大小

FILE* pFile = fopen("test.dat", "rb");
long s = ftell(pFile);
fseek(pFile, 0, SEEK_END);
long fileSize = ftell(pFile) - s;
fseek(pFile, s, SEEK_SET);


其中fileSize 就是文件大小,然后你就可以根据这个大小去创建你的数组
[/Quote]

同意
huangpeng8612 2008-12-09
  • 打赏
  • 举报
回复
其实fread的参数设计时没有把它看作是一个数组,仅仅就是一个指针.所有的实现都把它作为一个地址对待的.真正从内存地址的角度思考,从汇编的角度理解才是对的.
cba_v 2008-12-09
  • 打赏
  • 举报
回复
up
lann64 2008-12-08
  • 打赏
  • 举报
回复
或者干脆这样
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>

using namespace std;

int main()
{
ifstream infile("t.txt");
istream_iterator<char> fin(infile);
istream_iterator<char> endfs;

vector<char> vec(fin,endfs);
infile.close();
return 0;
}

星羽 2008-12-08
  • 打赏
  • 举报
回复

这样去得到文件大小

FILE* pFile = fopen("test.dat", "rb");
long s = ftell(pFile);
fseek(pFile, 0, SEEK_END);
long fileSize = ftell(pFile) - s;
fseek(pFile, s, SEEK_SET);


其中fileSize 就是文件大小,然后你就可以根据这个大小去创建你的数组


lann64 2008-12-08
  • 打赏
  • 举报
回复
干嘛要管vector大小呢?空间不够会自动增长的。要是为了效率,可以估计个值reserve就行了。
读入可以用泛型的copy函数,和插入迭代器。
梦之安魂曲 2008-12-08
  • 打赏
  • 举报
回复
vector能自动增加容量,不需要这样做。
梦之安魂曲 2008-12-08
  • 打赏
  • 举报
回复
这样用不行吧。iter是一个迭代器对象,而fread函数的第一个参数是指针,,参数类型不同,应该会有编译错误。
ma100 2008-12-08
  • 打赏
  • 举报
回复
都能resize分配足够的空间
为什么不能new char[n]

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧