转载!
http://www.exam8.com/computer/djks/dj2/CPP/ziliao/201003/1318733.html
今天在做项目时联想到了这两个问题,所以实际编程测试了一下,有一些新的收获
<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个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。
分享到:
相关推荐
标题中的“C++二进制文件查看器”指的是一个用C++编程语言开发的应用程序,它的功能是允许用户查看和分析二进制文件的内容。在计算机科学中,二进制文件是包含机器可读数据(非文本)的文件,如图片、音频、视频或...
本文将详细阐述如何将二进制文件中的数据读取并写入到一个TXT文件中。首先,我们要理解二进制文件与文本文件的区别。二进制文件以原始字节流的形式存储数据,而文本文件则通常包含可读的字符序列。 要实现这个操作...
C/C++实现简单的二进制文件读取和写入示例 1.包含如何读取和写入数字,以及用缓存按字节读取 2.采用标准输入和输出函数创建、打开、关闭文本文件或二进制文件
C++,java读写二进制文件方法介绍.pdf java从第九页开始
二进制文件的读取和写入是编程中的重要技能,尤其在处理大量数据或者需要高效存储和传输的情况下。本文将深入探讨如何在不同的编程语言中实现二进制文件的读取和写入,并讨论相关的保密性问题。 1. **二进制文件...
### 读取二进制文件的关键知识点 ...通过以上介绍,我们可以看到如何在C++中有效地读取和写入二进制文件,并且使用结构体和向量等工具来进行数据管理和操作。这对于处理复杂的数据格式非常有帮助。
这个过程涉及到读取文件内容并将其存储为二进制数据,以及从二进制数据中恢复原始文件。在VS2010环境下,我们可以使用C++的标准库`<fstream>`来完成这一操作。以下是对这个主题的详细解释: 首先,让我们了解什么是...
本篇文章将详细探讨如何使用C++中的`read`和`write`函数来读取和写入二进制文件。 首先,`read`和`write`函数是C++标准库中`fstream`的一部分,它们位于`<fstream>`头文件中。这两个函数允许我们对文件进行低级别的...
- 在示例代码中,未指定二进制模式读取二进制文件时,程序无法正确读取所有数据,而当添加`ios_base::binary`标志后,程序能完整读取文件。 - 写入二进制文件时,使用`endl`会写入一个换行符,但二进制模式下,`...
2. 读取二进制数据:使用`read()`函数逐字节读取二进制文件中的数据。 3. 转换为十六进制:对于每个读取到的字节,可以使用`std::stringstream`和`std::hex`来将其转换为十六进制字符串。 4. 保存为文本文件:如果...
本篇文章将详细探讨如何在C/C++等编程语言中实现“将结构体写入二进制文件”以及“从二进制文件中读取结构体数据”。 一、结构体与二进制文件 结构体是由多个不同类型的成员组成的复合数据类型,它可以包含整型、...
* 使用 `FileInputStream` 可以读取文件中的二进制数据。 * 使用 `FileOutputStream` 可以写入文件中的二进制数据。 * 需要使用 `byte[]` 数组来存储二进制数据。 * 使用 `read()` 和 `write()` 方法来读取和写入...
4. **读取二进制文件**:使用`CArchive`读取二进制文件。例如,你可以创建一个`CArchive`对象,并设置其模式为`CArchive::load`,然后用它打开二进制文件。 ```cpp CArchive archive(IN, OUT, CFile::modeRead); ...
本实例主要关注如何使用ActiveX Data Objects(ADO)在VC++环境下与SQL数据库交互,特别是涉及二进制数据(例如图像)的写入、读取和显示。以下是关于这个主题的详细知识点: 1. **ADO简介**:ADO是Microsoft开发的...
5. **读取和写入二进制数据**:使用QIODevice的read()和write()函数,我们可以将图像数据从内存中的QImage对象读取出来,或者将二进制数据写入到文件中。这两个函数都接受一个uchar(无符号字符)指针和一个大小参数...
通常需要使用编程语言提供的特定函数或API来读取和写入,例如C++中的fstream库、Python的open()函数的二进制模式等。 - 读取二进制文件时,需要知道文件的结构和格式,以便正确解析数据。 - 写入二进制文件时,要...
这有助于在读取文件时验证文件的正确性并解析数据。 2. 块写操作:为了提高性能,可能采用了分块写入的方式。这意味着数据不是一次性全部写入,而是分批写入。这样可以减少内存压力,特别是处理大量数据时。 3. 块...
- 在读取二进制文件时,确保使用的读取方法与写入时相匹配,以正确解析数据。 - 注意关闭输入/输出流,避免资源泄露。 - 使用异常处理机制来捕获并处理可能出现的异常情况。 - 考虑到二进制文件的特殊性,尽量使用`...
例如,如果二进制文件包含一系列整数,我们可能会先读取文件的大小,计算出需要分配的内存,然后读取每个整数到数组中。读取过程中,可能需要使用`reinterpret_cast`将字节流转换为适当的数据类型。完成读取后,可以...