C++二进制文件读写

  今天在做项目时联想到了这两个问题,所以实际编程测试了一下,有一些新的收获:

  <1> 我一直以为自己很熟悉如何使用C/C++中的二进制文件,可今天测试的时候突然发现程序生成的二进制文件和文本文件一样。比如:

  FILE* fp = fopen("binary","wb");

  //FILE* fp = fopen("character.txt","w");

  fprintf(fp,"count is %d",250);

  上述代码一个使用的是text file mode,一个是binary file mode,但结果生成的二进制文件中保存的仍然是ASCII码,直接用记事本就可以打开查看。要说区别,主要是换行符的区别,binary file的换行符为<LF>,而text file的换行符为<CR><LF>,仅此而已,我就想怎么回事啊,我明明是用二进制模式打开的文件呀,怎么里面直接保存的还是ASCII码?也就是说保存125这个数字还是会占用3个字节,而不是我想象中那样只占一个字节!

  后来我就换用C++,结果还是一样,代码如下:

  ofstream fs("binary",ios::binary);

  //ofstream fs("character.txt");

  int i = 32765;

  fs<<i<<endl;

  //fs.write((char*)&i,2);

  fs.close();

  无论以二进制文件模式打开还是以文本模式打开,文件中都是保存着文本!似乎C/C++中的binary模式不起作用!?!

  后来查阅资料才知道:要想在C/C++中将数据以二进制形式文件输出,与你打开文件时的模式没有关系,关键是取决于你调用哪个函数往文件里写东西!!只有使用fwrite和fs.write()函数才能以二进制形式输出到文件中,调用puts、fprintf、<<等函数输出的都是ASCII文本,尤其需要注意的是类似于上面代码段中那样,在C++中,即使你用fs<<i<<endl语句来输出一个整数,输出到二进制文件中的仍然是文本格式!<< operator在输出之前会自动给你进行转换,把一个整数值转换成一位一位的数字字符!!而且我后来试过了,即使我以文本模式打开一个文件,假如我用fwrite函数输出的话,文件中仍然是二进制格式,呵呵,说明在输出数据到文件时,的确与打开文件的模式没有关系,只与调用的输出函数有关!!

  此外,要注意,你不能用>>来读取以二进制文件格式存储的整数!(注:中午我试过了,不行!这再次证明>>只能读入文本格式的数字)

  (补注:11:47am   我后来又想,所有上面的这些东西可以归结成一句话:你以什么模式打开文件根本不重要,因为你既改变不了文件本身的内容,也改变不了C/C++中系统函数的工作方式,所以在编程的时候,你只要关心这个文件里的数据内容本身是二进制格式还是文本格式就好了!如果内容是文本格式的,你就调用文本格式那一套函数,比如puts,gets,fscanf,fprintf,<<,>>等,如果内容是二进制格式的,你就调用二进制格式那一套函数,比如fread,fwrite,ifstream.read(),ofstream.write()等。 只要保持文件内容与处理函数相对应相一致就可以了,别管它用什么模式打开文件!! 假如你用<<向一个二进制文件中输入一个整数,那么其实里面保存的是文本格式的数据,那么你就照样可以以二进制模式打开它,然后用>>来读取这个整数。相反,如果你的二进制文件里面是一个以二进制形式保存的整数,那你肯定不能用>>来读取里面的整数了!!

  <2>关于字节序的问题,我想用一张图来表示就足够了:

  今天终于弄明白怎样使用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个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++中,我们可以使用文件流来读写二进制文件。以下是一个简单的示例: 写入二进制文件: ```c++ #include <iostream> #include <fstream> int main() { std::ofstream outfile("data.bin", std::ios::binary); if (outfile.is_open()) { int number = 10; outfile.write(reinterpret_cast<const char*>(&number), sizeof(number)); outfile.close(); } else { std::cerr << "Unable to open file for writing" << std::endl; } return 0; } ``` 首先,我们使用`std::ofstream`来打开一个文件,指定文件名和打开方式`std::ios::binary`。然后,我们使用`write()`函数来写入一个整数。`reinterpret_cast`用于将整数指针强制转换为字符指针,以便在文件中将其写入为字节。最后,我们关闭文件。 读取二进制文件: ```c++ #include <iostream> #include <fstream> int main() { std::ifstream infile("data.bin", std::ios::binary); if (infile.is_open()) { int number; infile.read(reinterpret_cast<char*>(&number), sizeof(number)); std::cout << "Number: " << number << std::endl; infile.close(); } else { std::cerr << "Unable to open file for reading" << std::endl; } return 0; } ``` 我们使用`std::ifstream`打开文件,指定文件名和打开方式`std::ios::binary`。然后,我们使用`read()`函数来读取整数。`reinterpret_cast`用于将字符指针强制转换为整数指针,以便从文件中读取字节并将其转换为整数。最后,我们关闭文件并输出读取的整数。 需要注意的是,在读写二进制文件时,我们需要注意数据的字节顺序(大端序或小端序),以免在不同的平台上出现问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值