用C语言打开文本文件,然后以二进制保存

用C语言打开文本文件,然后以二进制保存,第1张

这些都是c语言打开文件函数fopen的一个参数打开文件方式的值:

定义函数

file

*

fopen(const

char

*

path,const

char

*

mode)

函数说明

参数path字符包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r

打开只读文件,该文件必须存在。

r+

打开可读写的文件,该文件必须存在。

rb+

读写打开一个二进制文件,只允许读写数据。

rt+

读写打开一个文本文件,允许读和写。

w

打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+

打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a

以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+

以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

wb

只写打开或新建一个二进制文件;只允许写数据。

wb+

读写打开或建立一个二进制文件,允许读和写。

wt+

读写打开或着建立一个文本文件;允许读写。

at+

读写打开一个文本文件,允许读或在文本末追加数据。

ab+

读写打开一个二进制文件,允许读或在文件末追加数据。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b

字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在posix系统,包含linux都会忽略该字符。由fopen()所建立的新文件会具有s_irusr|s_iwusr|s_irgrp|s_iwgrp|s_iroth|s_iwoth(0666)权限,此文件权限也会参考umask

值。

自己看吧

c语言文件把数据看作是一连串的字符(字节)。C语言文件是一个字符(字节)的序列,是一字符流或字节流,是一种流式文件。根据数据的组织形式,可分为文本文件和二进制文件。

文本文件又称为ASCII文件,每一个字节中存放一个ASCII代码,代表一个字符。例如,一个整数123,若用.ASCII文件存放,占3个字节的

存储

单元,1、2、3各用一个字节

存储

。而1、2、3的ASCII码分别为49、50、51,故123用ASCII文件存放时,存放形式为001100010011001000110011。

二进制文件是直接用数据的二进制形式存放。例如,对整数123,二进制为0000000001111011,用二进制文件存放,需2个字节,存放形式为0000000001111011。

使用ASCII码文件,一个字节代表一个字符,便于对字符一一处理和输出,但占用较多的存储空间,并且要花费转换时间(ASCII码与二进制之间的转换)。使用二进制文件,

在内存中的数据形式与输出到外部文件中的数据形式完全一致,可以克服ASCII文件的缺点,但不直观,一个字节并不对应一个字符或一个数,不能直接输出字符形式。一般中间数据用二进制文件保存,输入输出使用ASCII文件。

应该这样保存:

int main()

{

string str1

string str2

cin >>str1

cin >>str2

ofstream outfile("temp.dat",ios::binary)

if(! outfile)

{

cerr <<"Error ! " <<endl

return 0

}

outfile.write(str1.c_str(),str1.size()+1)

/*你原来写成(char * )&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。

改成这样以后,写入文件里的就是实际的字符串了。

写入的长度应该是字符串的长度(包括结束符'\0')*/

outfile.write(str2.c_str(),str2.size()+1)

outfile.close()

return 1

}

读取的时候这样读取:

int main()

{

string str1

str1.reserve(100)/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/

ifstream infile("temp.dat",ios::binary)

if (! infile)

{

cerr <<"Error ! " <<endl

return 0

}

infile.read((char * )str1.c_str(),100)/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/

cout <<str1 <<endl//输出第一个字符串

cout <<(char*)(str1.c_str() + strlen(str1.c_str())+1) <<endl//输出第二个字符串

return 1

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12079339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存