c语言读取二进制文件
㈠ c语言中rb+什么意思
在C语言中,rb+的含义如下:
rb+表示以读写模式打开一个二进制文件,且该文件必须存在。
- 读写模式:这意味着你可以对文件进行读取操作,也可以进行写入操作。与只读模式或只写模式不同,rb+模式允许你同时执行这两种操作。
- 二进制文件:这表明文件是以二进制形式打开的,而不是文本形式。二进制文件通常用于存储非文本数据,如图像、音频文件或程序的可执行代码。在处理二进制文件时,数据以字节为单位进行读写,而不是按字符处理。
- 文件必须存在:使用rb+模式打开文件时,如果指定的文件不存在,操作将失败。这与wb+模式不同,后者在文件不存在时会创建一个新文件。
简而言之,rb+模式在C语言中用于打开现有的二进制文件,以便进行读写操作。
㈡ C语言中 fp = fopen(filename, “rb”); 那个rb是什么意思啊
C语言中 fp = fopen(filename, “rb”),里的rb是指:打开一个二进制文件,文件必须存在,只允许读。
fphzk=fopen("c:\hzk16","rb")是打开C驱动器磁盘的根目录下的文件hzk16,按二进制方式进行读操作。两个反斜线“\ ”中的第一个表示转义字符,第二个表示根目录。
(2)c语言读取二进制文件扩展阅读
fp = fopen(filename, “rb”延伸
1、resourcefopen ( string filename, string mode, [ bool use_include_path, [resource zcontext]] ),fopen() 函数打开一个文件或 URL。如果 fopen() 失败,它将返回 FALSE 并附带错误信息。您可以通过在函数名前面添加一个 '@' 来隐藏错误输出。
2、fopen() 将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。
3、如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。
㈢ 如何用Java或C语言解析二进制文件为文本文件
在学习C语言的fopen()函数时,我们了解到它的第二个参数是一个标志字符串。如果字符串中包含'b',则表示是以二进制(binary)文件模式打开,否则是以文本文件模式打开。那么,什么是文本文件,什么是二进制文件呢?从文件编码的角度来看,文件可以分为ASCII码文件和二进制码文件两种。
ASCII文件通常被称为文本文件,这种文件在磁盘中每个字符对应一个字节,用于存放对应的ASCII码。例如,数字5678的存储形式为:ASCII码:00110101 00110110 00110111 00111000,每个字节分别代表一个数字。ASCII码文件可以在屏幕上按字符显示,例如源程序文件就是ASCII文件,使用DOS命令TYPE可显示文件内容,因此能读懂文件内容。
二进制文件则是按照二进制的编码方式来存储文件的,例如数字5678的存储形式为00010110 00101110,只占两个字节。二进制文件虽然也可以在屏幕上显示,但其内容无法直接阅读。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。
文本文件与二进制文件在系统存储上实际上并没有什么区别,都是以二进制的方式存储于硬盘上。之所以分二进制文件和文本文件,主要是逻辑上的区分,文本文件更易于人工阅读。站在编程的角度看,文本文件是基于字符编码过的,常见的有ascii编码、gbk编码、unicode编码等,文本工具直接打开即可阅读。而二进制文件是基于值的编码,这个值到底是什么,完全可自定义。
如果用Java编程,可能就不会遇到以二进制打开和文本文件打开这两种方式了。Java中有字符流和字节流,字符流是对字节流的封装,有编码解码,而字节流操作的则是byte数组。Python的文件读写方式则更贴近C。因为Python和Java底层都是C,所以有必要弄清C的读写文件方式。
在Windows和DOS系统中,狭义的文本文件是指扩展名为.txt的文件。实际上,那些没有规定格式的,由可理解的ASCII及其他编码文字组成的文件都是文本文件,如C源程序文件、HTML超文本、XML。除此之外的其他文件都是二进制文件,如Word文件DOC、图像格式文件JPG。
实际上,fopen()的b标志不但可以打开二进制文件,还可以打开文本文件,同样,不带b标志也可以打开文本文件。既然如此,为什么还要区分两种打开方式呢?因为这两种方式在读写文件时的操作是不一样的。
二进制方式很简单,读文件时,会原封不动地读出文件的全部内容,写的时候,也是把内存缓冲区的内容原封不动地写到文件中。而文本方式就不一样了,在写文件时,会将换行符CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。
所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或内容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。
特别注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,没有文本方式和二进制方式的区分,使不使用'b'标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。
在DOS和Windows系统中,使用CRLF(0x0D 0x0A)即\r\n双字节作为文本文件换行符,而Unix文本文件的换行符只有一个字节LF(0x0A)。在C语言中,也是以LF即'\n'为换行符。由于DOS/Windows定义的换行符和C语言的不一致,C语言的标准输入输出函数适行读写文本文件时,就适行了CRLF->LF的转换。而Unix的定义和C语言的一样,就不必转换。
那么,为什么会有定义不一致的情况呢,这纯属历史原因。当初C是在Unix上发展的,对换行的定义自然就一样了。其后C被引入到DOS系统,为了使原有的C程序能不加修改的读写DOS的文本文件,所以就在文件读写上做了修改。随着DOS/Windows成为主流平台,这个当初为了兼容而做的修改给众多的C语言开发者添了这样一个小小的麻烦。
因此,二进制和文本模式的区别就在于对换行符和一些非可见字符的转化。所以,从安全的角度来看,使用二进制读取会比较安全一些。
㈣ C语言怎么读取二进制文件中的数据放到一个300×300的二维数组里面
用 fopen 打开文件时 设 "rb" --用二进制方法打开,用于读
用 fread 读取数据,函数原型是:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
各参数意义,请查编译器帮助文件,这里就不开课了。
300×300 的数组需要的内存量较大,可动态分配,或用 全局量。
下面是程序例子。先建了一个2进制文件,里面存了300*300个float型数据。然后读这个文件里的内容。
#include<stdio.h>
float a[300][300];
int main()
{
FILE *fin, *fout;
int i,j;
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=j*100+i;
fout=fopen("a.txt","wb");
for (j=0;j<300;j++)
fwrite(&a[j][0],sizeof(float),300,fout);
fclose(fout);
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=0; //数组清零
fin=fopen("a.txt","rb"); //打开输入文件
for (j=0;j<300;j++)
fread(&a[j][0],sizeof(float),300,fin); //读文件
fclose(fin); //关闭文件
// 下面输出文件的左上角100个数据,和右下角100个数据供检查参考。
for (j=0;j<10;j++) {
for (i=0;i<10;i++)printf("%3.0f ",a[j][i]); printf("\n");}
printf("\n");
for (j=290;j<300;j++){
for (i=290;i<300;i++)printf("%g ",a[j][i]); printf("\n");}
return 0;
}
㈤ 编写C语言,实现读取一个二进制文件,以16进制格式显示在屏幕上
#include <stdio.h>
int main()
{
FILE *fp1 = NULL;
char buf1[100] = {0};
int i;
fp1 = fopen("1.txt", "r");
for(i=0;i<5;i++)
{
fread(&buf1[i], sizeof(char), 1, fp1);
printf("0x%x, ", buf1[i]);
}
fclose(fp1);
return 0;
}
1.txt为
C:\Documents and Settings\Administrator\桌面>t
0x62, 0x61, 0x69, 0x64, 0x75,
C:\Documents and Settings\Administrator\桌面>