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);
} 展开
关键在于我不知道如何停止(读到文件尾)
读到文件尾时我要知道缓冲区中有效区有多大;
请附上源代码
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);
} 展开
推荐于2018-04-13 · 知道合伙人互联网行家
关注
展开全部
#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();
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();
展开全部
int n;
while (cin >> n)
{
...
}
这是读整数读到文件结束
char c;
while (cin.get(c))
{
...
}
这是读字符读到文件结束
string line;
while (getline(cin, line))
{
...
}
这是读字符串读到文件结束
while (cin >> n)
{
...
}
这是读整数读到文件结束
char c;
while (cin.get(c))
{
...
}
这是读字符读到文件结束
string line;
while (getline(cin, line))
{
...
}
这是读字符串读到文件结束
追问
注意:是未知大小和结构的“”二进制“”文件
每次读入一定大小缓冲区
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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个字节就被解析成一个整数,当然,这里没有考虑越界的问题.
{
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
少年,其实我很不想回答了。第一,你的语气让我有些不舒服,第二,你的语气确实让我有些不舒服
不过其实我也不会,就当做是补充一下我的知识了,反正我现在是会了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询