文件管理 · 2022年8月17日

二进制文件动态指针|C对二进制文件操作

Ⅰ C语言 结构体指针字符 二进制文件写入和读取

打开方式用二进制方式打开,如FILE*fp=fopen("a.zip","rb+");然后读用fread去读。1、对于程序来说,不管后缀名如何,文件分为两种类型:文本文件和二进制文件。2、C语言里有一系列文件操作函数。区分文本和二进制文件,需要在打开文件时设置不同的控制符mode的变量即可。fopen的函数原型:FILE*fopen(constchar*path,constchar*mode);fopen函数的第一个参数是文件路径,第二个参数是打开方式,有以下几种方式:r以只读方式打开文件,该文件必须存在。r+以可读写方式打开文件,该文件必须存在。rb+读写打开一个二进制文件,允许读数据。rw+读写打开一个文本文件,允许读和写。w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)wb只写打开或新建一个二进制文件;只允许写数据。wb+读写打开或建立一个二进制文件,允许读和写。wt+读写打开或着建立一个文本文件;允许读写。at+读写打开一个文本文件,允许读或在文本末追加数据。ab+读写打开一个二进制文件,允许读或在文件末追加数据。上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

Ⅱ c++二进制文件写入指针移动出问题

fwrite本身在写入同时就会移动指针,写入多少移动多少,也就是多个fwrite可顺序调用,中间不需要再fseek移动

Ⅲ C语言中,我建立了一个二进制文件,写入了一段数据,然后下次打开后把文件指针直接移到最开始,然后重新

不会,重新写入时会覆盖上一次的数据,重新写入多少就覆盖多少。

Ⅳ 如何快速读取二进制文件

快速读取二进制文件的方法如下: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、对文件操作完毕后别忘了关闭文件。

Ⅳ C对二进制文件操作

C对二进制文件读写操作,可以用fread函数和fwrite函数实现;1.函数功能用来读写一个数据块。2.一般调用形式fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);3.说明(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。(2)size:要读写的字节数;(3)count:要进行读写多少个size字节的数据项;(4)fp:文件型指针。注意:1 完成次写操(fwrite())作后必须关闭流(fclose());2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;3 fprintf() : 按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, …]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是返回值为此次操作写入到文件的字节数。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字节;str2: 10字节;a:2字节;b:8字节,c为33,因为写入时不同的数据间自动加入一个空格。

Ⅵ 二进制文件读写与文件指针移动 急!!!!!!!

文件指针当然是读多少移动多少, c++的还会分读和写指针我觉得你这俩循环只有第一次读正常, 后2次应该读到末尾,失败你写的时候写了3个字节, 读的时候第一次就读了3个字节, 已经全读了, 所以后2次应该没读出来, 所以都是在第一次for, 读3个字节, 写到nStr[0]了, 你用eof检查下

Ⅶ java的二进制文件有没有像C++一样有文件读指针,写指针

C++不也得一行复行搜么,制用Java流也一样,直接读流的行循环找就行,不用先放到hash里面。你要是多次搜索的话,可以在第一次搜索的时候建立索引,以后直接从索引里面查就行了。别没好法,文件大了 必然慢。

Ⅷ 为什么二进制数据文件流指针指向ios::end时,并不表示指向最后一个完整记录数据之后

//ios::end 已经在完整记录之后了,下面的例子就可以看出来//将文件指针移动到末尾后,读取了一个字节,在通过16进制查//看器,查看文件,发现读取的内容不是文件的最后一个值了#include <fstream>#include <iostream>using namespace std;int main(){ fstream f("ReadMe.txt", ios::binary | ios::in); if (!f) { cout << "打开文件失败" << endl; return 0; } //f.seekg(0, ios::end); char buf; f.read(&buf, 1); cout << ios::hex << buf << endl; if (f.end) { cout << "已经到文件末尾" << endl; } return 0;};

Ⅸ c语言中,动态链表可不可以用二进制格式保存到文件中

可以使用二进制格式存储。需要注意的是,链表的指针域,可以不存入二进制文件,或者说,存进去也没有用处。指针域的值,是指向其它单元的地址值,而地址值是动态分配的,从文件中读出时,该段内存很可能已经失效,所以再直接使用存储值就会出问题。正确的做法是:1 将链表按节点存放到二进制文件中,是否存储指针域均可。2 读取时,每次读取一个节点的数据,指针域置空;3 将每个节点的数据,按照存储的顺序(从头到尾,或从尾到头),重新分配节点资源,并形成有效链表。