C++读取一个未知大小和结构的二进制文件

我要读取一个二进制文件,不知道大小每次读入一个指针指向的一定大小缓冲区使用fstream而不是FILE*关键在于我不知道如何停止(读到文件尾)读到文件尾时我要知道缓冲区中... 我要读取一个二进制文件,不知道大小 每次读入一个指针指向的一定大小缓冲区 使用fstream 而不是 FILE*

关键在于我不知道如何停止(读到文件尾)
读到文件尾时我要知道缓冲区中有效区有多大;
请附上源代码
void binaryread(string filename)
{
const int BUFFER_SIZE=0x100000;
ifstream ifs(filename,ios::in|ios::binary);
void* buffer=malloc(BUFFER_SIZE);
while(???)
{
//read into buffer

//do something with buffer

}

free(buffer);
}
展开
 我来答
百度网友96ffcf7
推荐于2018-04-13 · 知道合伙人互联网行家
百度网友96ffcf7
知道合伙人互联网行家
采纳数:22721 获赞数:118724
从事多年网络方面工作,有丰富的互联网经验。

向TA提问 私信TA
展开全部
#include <fstream>
using namespace std;

// AuthInfo 是自定义的 struct
struct AuthInfo auth_info;
string susername, spassword;
/* 写文件 */
// 清零
ZeroMemory ( &auth_info, sizeof ( auth_info ) );
susername = "tanggaowei@gmail.com";
spassword = "000000";
// 内存拷贝
memcpy(auth_info.username, susername.c_str(), susername.length());
memcpy(auth_info.password, spassword.c_str(), spassword.length());
// 定义打开输出流
ofstream fout("mbc.dat", ios::binary);
// 写入
fout.write((char *)(&auth_info), sizeof(auth_info));
// 关闭输出流
fout.close();
/* 读文件 */
ZeroMemory ( &auth_info, sizeof ( auth_info ) );
ifstream fin ( "mbc.dat", ios::binary );
fin.read((char *)(&auth_info), sizeof(auth_info));
susername = auth_info.username;
spassword = auth_info.password;
ZeroMemory ( auth_info.username, 100 ); // AuthInfo.username[100]
ZeroMemory ( auth_info.password, 50 ); // AuthInfo.password[50]
memcpy(auth_info.username, susername.c_str(), susername.length());
memcpy(auth_info.password, spassword.c_str(), spassword.length());
fin.close();
百度网友066b1b220
2012-10-24 · 超过21用户采纳过TA的回答
知道答主
回答量:81
采纳率:0%
帮助的人:66.8万
展开全部
int n;
while (cin >> n)
{
  ...
}
这是读整数读到文件结束
char c;
while (cin.get(c))
{
  ...
}
这是读字符读到文件结束

string line;
while (getline(cin, line))
{
  ...
}
这是读字符串读到文件结束
追问
注意:是未知大小和结构的“”二进制“”文件

每次读入一定大小缓冲区
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
XIaOMoMo__
推荐于2016-11-26 · TA获得超过141个赞
知道小有建树答主
回答量:97
采纳率:0%
帮助的人:72.3万
展开全部
void BinaryRead(char * strFileName) //修改了参数类型,因为ifstream没有string类型参数的构 // 造函数
{
const int BUFFER_SIZE = 0x100000 ;

ifstream IFS ; IFS.open(strFileName, ios::in | ios::binary) ;
char * buffer = (char *)malloc(BUFFER_SIZE) ; // 修改了指针类型
int i = 0 ;
while ( (buffer[i] = IFS.get()) != EOF) // 一次读取文件中的内容,解析成字符
{
i++ ;
}
buffer[i] = '\0' ;

printf("buffer len is = %d, buffer is %s\n",i, buffer) ; // 有次可知,缓冲区中的有效内容大小
//为 i 字节
free(buffer) ;
buffer = NULL ;
}

// 知道了文件的大小,只要改变buffer指针的类型就能按照不同的数据类型来解析缓冲区中的
//内容, 如: int * pInt = (int *)buffer ; 那以pInt指向的地方开始内存大小为i的内存中每
// 4个字节就被解析成一个整数,当然,这里没有考虑越界的问题.
追问
第一:我是要运行速度才用缓冲区的
每次读一个字节没任何好处

第二:缓冲区一般没有文件大
追答
那我猜想,也许大概可能是你想把文件的数据一段一段地来处理。你可以每次读取BUFFER_SIZE大小的数据,然后处理,到了文件末尾是可以判断的,程序如下:

ifstream instream ;
instream.open("abcd.txt", ios::in | ios::binary) ;
char * buff = (char *)malloc(BUFFER_SIZE) ;
assert(buff != NULL) ;
if (instream.is_open())
{
while (!instream.eof()) //判断文件是否达到了结尾
{
instream.read(buff, BUFFER_SIZE) ; // 每次读取大小为BUFFER_SIZE,存进buff指向
//的缓冲区
//do something with buffer
}
int count = instream.gcount() ; //如果在到达文件结尾时还没填满缓冲区
// count为实际写进缓冲区的数据
}

参考资料:http://blog.sina.com.cn/s/blog_404dfe220100d1q7.html

少年,其实我很不想回答了。第一,你的语气让我有些不舒服,第二,你的语气确实让我有些不舒服
不过其实我也不会,就当做是补充一下我的知识了,反正我现在是会了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式