二进制文件操作,自己参考的

http://wenku.baidu.com/view/0d2c78105f0e7cd184253641.html

如何将一串字符存储成二进制文件,而且如何读写?

问题补充:

我是菜鸟,请问你用的是不是VC啊?而且那读二进制文件呢?

我来帮他解答
图片
符号
编号
排版
地图
 您还可以输入9999 个字
您提交的参考资料超过50字,请删除

2006-8-17 09:24
满意回答
#include<fstream.h>
void main()
{
char str[80];
char temp[80];
fstream f("text.txt",ios::out|ios::binary);
if(f.fail()){cout<<"error";return;}
f.write((char *) &str,sizeof(str);
f.close();
f.open("text.txt",ios::in|ios::binary);
if(f.fail()){cout<<"error";return;}
f.read((char *)& temp,80);
cout<<temp;
f.close();
}

 

vc++二进制文件读取

  (2012-01-31 14:02:44)
标签: 

杂谈

分类: vc

string SPath;//文件的全路径

FILE* fp=fopen(SPath.c_str(),"rb");
 if(fp==NULL)
 {
  return false;
 }
 char a[1000];//缓冲区 以1000为单位读取
 int Count=0;//记录二进制文件的大小
 int Cur=0;//记录当前位置
 int Itmp;
 while((Itmp=fread((void*)a,1,1000,fp))!=0)
 {
  Count+=Itmp;
 }//这个只是为了确定文件到底多大 后面才好分配空间 

//分配空间存储整个二进制文件
 unsigned char* aa=(unsigned char*)malloc(sizeof(unsigned char)*Count);
 fseek(fp,0,0); //文件指针回到开始 
 while((Itmp=fread((void*)a,1,1000,fp))!=0)
 {
  for(int i=0;i<Itmp;i++)
  {
   aa[Cur+i]=a[i];
  }
  Cur+=Itmp;
 }

//此时aa存放的就是整个二进制文件的字节流了

 fclose(fp);
 free((void*)aa);
//应该还有更好的方法 先凑乎用吧。

、先介绍三个函数,fopenfreadfwrite二进制读写的顺序是用fopen以二进制方式打开读写文件,然后使用freadfwrite两个函数将数据写入二进制文件中。下面我们看看一个拷贝程序的源码:

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 1024
int main(int argc, char *argv[])
{
    if( argc < 3 )
    {
        printf("usage: %s %s\n", argv[0], "infile outfile");
        exit(1);
    }
    FILE * outfile, *infile;
    outfile = fopen(argv[2], "wb" );
    infile = fopen(argv[1], "rb");
    unsigned char buf[MAXLEN];
    if( outfile == NULL || infile == NULL )
    {
        printf("%s, %s",argv[1],"not exit\n");
        exit(1);
    }    
    int rc;
    while( (rc = fread(buf,sizeof(unsigned char),MAXLEN,infile)) != 0 )
    {
        fwrite( buf, sizeof( unsigned char ), rc, outfile );
    }
    fclose(infile);
    fclose(outfile);    
    system("PAUSE"); 
     return 0;
}

   这个程序的作用就是将文件1的内容直接拷贝到文件2中,注意fread的返回值,这个值需要在fwrite的时候将会用到。

下面是关于fopen,fread,fwrite三个函数的详细说明。

 

 

使用C++读写二进制文件

    今天终于弄明白怎样使用C++读写二进制文件了。

    要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法。

    可以使用fstream类,这个类可以对文件进行读写操作。

    1、打开文件。

    打开文件可以有两种方式,第一种可以使用fstream类的构造函数。

    fstream file("test.dat",ios_base::in|ios_base::out|ios_base::app);另外一种方法就是使用open函数。

    fstream file;file.open("test.dat",ios_base::in|ios_base::out|ios_base::app);这样就可以打开一个可读写的文件了。如果文件不存在的话,就会创建一个新文件并且以读写方式打开。

    这里需要说明一点,如果文件不存在的话,open函数中第二个参数必须包含ios_base::out|ios_base::app,否则就不能正确创建文件。

    2、写文件。

    先进性写文件的操作否则读一个空文件是没有意义的。

    既然是写二进制文件可以向文件中写入一个整形值。写二进制字符只能使用write函数。

    但是write函数的原形是write(const char * ch, int size)。第一个参数是char *类型,所以需要把将要写入文件的int类型转换成char *类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。

    int temp;file.write((char *)(&temp),sizeof(temp));3、读文件。

    可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write大致相同,read(const char * ch, int size)。

    要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。

    int readInt;file.read((char *)(&readInt),sizeof(readInt));这样文件中的int值就读入到int型变量readInt中了。

    4、文件指针。

    在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。

    在fstream类中有两个文件指针,一个是读取文件的指针,一个是写文件的指针分别用tellg和tellp文件来取得指针的位置。

    同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。

    先对几个枚举类型进行一下说明:ios_base::beg ——文件开始位置ios_base::cur ——文件当前位置ios_base::end ——文件末尾位置

    下面以seekg为例说明一下指针移动的方法:file.seekg(3) ——指针移动到第三个字符的位置file.seekg(ios_base::beg) ——指针移动到文件开头file.seekg(ios_base::end) ——指针移动到文件末尾file.seekg(-3,ios_base::cur) ——指针当前位置向前移动三个字符file.seekg(3,ios_base::cur) ——指针当前位置向后移动三个字符file.seekg(3,file.tellg()) ——指针当前位置向后移动三个字符file.seekg(file.tellg()+3) ——指针当前位置向后移动三个字符5、对文件操作完毕后别忘了关闭文件。

    file.close();

    以上5个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。

 

 

 

C++中文件的读写(转)

来源: 仕玉冰的日志

 

C++中,有一个stream这个类,所有的I/O都以这个类为基础的,包括我们要认识的文件I/Ostream这个类有两个重要的运算符:

 

1、插入器(<<)

向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'n';就表示把字符串"Write Stdout"和换行字符('n')输出到标准输出流。

 

2、析取器(>>)

从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。

 

C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。

 

一、打开文件

fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

 

void open(const char* filename,int mode,int access);

 

参数:

 

filename 要打开的文件名

mode 要打开文件的方式

access 打开文件的属性

打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

 

ios::app 以追加的方式打开文件

ios::ate 文件打开后定位到文件尾,ios:app就包含有此属性

ios::binary 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文

ios::in 文件以输入方式打开

ios::out 文件以输出方式打开

ios::nocreate 不建立文件,所以文件不存在时打开失败

ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败

ios::trunc 如果文件存在,把文件长度设为0

可以用把以上属性连接起来,如ios::out|ios::binary

 

打开文件的属性取值是:

 

0:普通文件,打开访问

1:只读文件

2:隐含文件

4:系统文件

可以用或者“+”把以上属性连接起来 ,如31|2就是以只读和隐含属性打开文件。

 

例如:以二进制输入方式打开文件c:config.sys

 

fstream file1;

file1.open("c:config.sys",ios::binary|ios::in,0);

 

如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:

 

file1.open("c:config.sys");<=>file1.open("c:config.sys",ios::in|ios::out,0);

 

另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:

 

fstream file1("c:config.sys");

 

特别提出的是,fstream有两个子类:ifstream(input file stream)ofstream(outpu file stream)ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。

 

ifstream file2("c:pdos.def");//以输入方式打开文件

ofstream file3("c:x.123");//以输出方式打开文件

 

所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。

 

二、关闭文件

打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。

 

三、读写文件

读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式

 

1、文本文件的读写

文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:

 

file2<<"I Love You";//向文件写入字符串"I Love You"

int i;

file1>>i;//从文件输入一个整数值。

 

这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些

 

操纵符 功能 输入/输出

dec 格式化为十进制数值数据 输入和输出

endl 输出一个换行符并刷新此流 输出

ends 输出一个空字符 输出

hex 格式化为十六进制数值数据 输入和输出

oct 格式化为八进制数值数据 输入和输出

setpxecision(int p) 设置浮点数的精度位数 输出

 

比如要把123当作十六进制输出:file1<<hex<<123;要把3.14159265位精度输出:file1<<setpxecision(5)<<3.1415926

 

2、二进制文件的读写

put()

put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'

 

get()

get()函数比较灵活,有3种常用的重载形式:

 

一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。

 

另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。

 

还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'n'。例如:

 

file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。

 

读写数据块

要读写二进制数据块,使用成员函数read()write()成员函数,它们原型如下:

 

read(unsigned char *buf,int num);

write(const unsigned char *buf,int num);

 

read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。

 

例:

 

unsigned char str1[]="I Love You";

int n[5];

ifstream in("xxx.xxx");

ofstream out("yyy.yyy");

out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy

in.read((unsigned char*)n,sizeof(n));//xxx.xxx中读取指定个整数,注意类型转换

in.close();out.close();

 

四、检测EOF

成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();

 

例: if(in.eof())ShowMessage("已经到达文件尾!");

 

五、文件定位

C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg() seekp()seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:

 

istream &seekg(streamoff offset,seek_dir origin);

ostream &seekp(streamoff offset,seek_dir origin);

 

streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:

 

ios::beg 文件开头

ios::cur 文件当前位置

ios::end 文件结尾

这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

 

例:

 

file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节

file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节

 

 

 

如果vc编程的话最好使用CFile类等更加方便于文件操作

 

void AA(int poss,int pose,LPSTR fa,LPSTR fb,int selw)//13
{

CString strfa;
char wBuffer[64000];
strfa=fa;

CFile cfa;
cfa.Open((LPCTSTR)strfa,CFile::modeRead|CFile::typeBinary);
cfa.Seek(poss,CFile::begin);
cfa.Read((void*)wBuffer,pose-poss);
wBuffer[pose-poss]='\0';


CString str;
str=wBuffer;
str.Remove('\r');//[11/15/2007]
AfxMessageBox("kaishi!");

AfxMessageBox(wBuffer);
AfxMessageBox(str.GetBuffer(0));

if(selw==1)
BB(fb,str.GetBuffer(0));
else
CC(fb,str.GetBuffer(0));

cfa.Close();

}  
以上是我的程序,你将就着看一下,,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值