c++读写文件的几种方法,C++文件读写操作
看C编程思路,每个练习基本都用到了OfStream,IfStream,fStream。我以前大概知道它们的用法和意思。看了大牛的几篇博文,我整理了一下,总结如下:
这主要是讨论fstream的内容:
【java】查看plaincopyprint?
#include fstream ofstream//文件写操作内存写存储设备ifstream//文件读操作,存储设备读入内存区域
Fstream//读写操作,可以读写打开的文件。
#包括fstream
Ofstream //文件写操作内存写存储设备
如果stream //文件读操作,存储设备将该区域读入内存。
Fstream //读写操作,可以读写打开的文件。
1.打开文件
在fstream类中,成员函数open()实现打开文件的操作,从而将数据流与文件关联起来,通过ofstream、ifstream、fstream对象读写文件。
功能:打开()
【cpp】查看plaincopyprint?
SPAN publicmemberfunctionvoidopen(const char * filename,IOs _ base:open mode=IOs _ base:in IOs _ base:out);void open(constwchar _ t * _ Filename,IOs _ base:open mode mode=IOs _ base:in IOs _ base:out,int prot=IOs _ base:_ open prot);/SPAN
公共成员函数
void open(常量char *文件名,
IOs _ base:openmode mode=IOs _ base:in IOs _ base:out);
void open(const wchar _ t * _ Filename,
IOs _ base:openmode mode=IOs _ base:in IOs _ base:out,
int prot=IOs _ base:_ open prot);
参数:filename操作文件名
打开模式文件的方式
prot打开文件的属性//很少使用。在查看数据时,我们发现有两种方式。
打开文件的方式是在ios类中定义的(所以是流I/O的基类)。有如下几种方式:
ios:in
打开文件进行输入(读取)
ios:out
打开文件进行输出(写入)
ios:ate
初始位置:文件结尾
ios:app
所有输出都被附加到文件的末尾。
ios:trunc
如果文件已经存在,请先删除它
ios:binary
二进制
这些方法可以以OR运算(" ")的形式组合使用:例如
【cpp】查看plaincopyprint?
ofstreamoutOut.open (hello.txt ,iOS:in iOS:out iOS:binary)//根据自己的需求做出合适的选择
ofstream out
Out.open (hello.txt ,iOS:in iOS:out iOS:binary)//iOS类中也定义了根据自己的需要打开文件的属性:
0
普通文件,打开操作
对于文件的属性,也可以用or运算和" "组合使用,这里不做说明。
在许多程序中,您可能会遇到ofstream out (hello.txt )、ifstreamin( . 的使用),以及fstream foi( . ).可以不显式调用open()函数来操作文件,直接调用其默认的打开方式,因为open()函数是在stream类的构造函数中调用的,而
【cpp】查看plaincopyprint?
streamout的跨度(“.”,IOs:out);ifstreamin( . ),IOs:in);fstreamfoi(“.”,IOs:in IOs:out);/SPAN
ofstream out(“.”),IOs:out);
ifstream in(“.”),IOs:in);
fstream foi( . ,IOs:in IOs:out);
当使用默认方法对文件进行操作时,可以使用成员函数is_open()来验证文件是否打开。
2.关闭文件
当文件读写操作完成后,我们必须关闭文件以使其再次可访问。成员close(),负责释放缓存中的数据并关闭文件。这个函数一旦被调用,原来的stream对象就可以用来打开其他文件,这个文件就可以再次被其他进程访问。为了防止流对象在被销毁时接触到打开的文件,析构函数会自动调用close函数。
3.读取和写入文本文件
stream、ifstream和fstream类分别从ostream、istream和iostream派生。这就是为什么fstream的对象可以使用其父类的成员来访问数据。
一般来说,我们将使用这些类和相同的成员函数(cin和cout ),它们与控制台交互以进行输入和输出。如下例所示,我们使用重载的插入运算符:
【cpp】查看plaincopyprint?
//writingnoatextfile # include fiostream . h int main(){ of stream out( out . txt );if(out . is _ open()){ out this isaline。\ n ;“出去”是另一条线。\ n ;out . close();} return0}//结果:写:Thisisaline。这是out.txt中的另一行
//在文本文件上书写
#包含fiostream.h
int main () {
of stream out( out . txt );
if (out.is_open())
这是一条线。\ n ;
“出去”这是另一行。\ n ;
out . close();
返回0;
//结果:写入out.txt:
这是一条线。
这是另一条线
从文件中读取数据的方式也可以与使用cin相同:
【cpp】查看plaincopyprint?
//reading textfile # include iostream . h # include fstream . h # include stdlib . h int main(){ char buffer[256];ifstreamin( test . txt );如果(!in . is _ open()){ cout Erroropeningfile ;出口(1);}while(!in.eof()){in.getline(buffer,100);cout缓冲区endl} return0}//结果是output Thisisaline。这是屏幕上的另一行。
//读取文本文件
#包含iostream.h
#包含fstream.h
#包含stdlib.h
int main () {
char缓冲器[256];
if stream in( test . txt );
如果(!in.is_open())
{ cout 打开文件时出错;出口(1);}
而(!in.eof())
in.getline(缓冲区,100);
cout缓冲区endl
返回0;
//结果在屏幕上输出
这是一条线。
这是另一条线
上面的例子读入一个文本文件的内容,然后把它打印到屏幕上。注意,我们使用了一个名为eof的新成员函数,它由ifstream从类ios继承而来,当它到达文件末尾时返回true。
状态标志的验证
除了eof(),还有一些验证流状态的成员函数(它们都返回bool类型的返回值):
坏()
如果在读写过程中发生错误,则返回true。例如,当我们想要写入一个未打开的文件时,或者当我们想要写入的设备没有剩余空间时。
失败()
除了在与bad()相同的情况下返回true,它还在添加格式错误时返回true,例如当您想要读取一个整数并获得一个字母时。
eof()
如果读取的文件到达文件末尾,则返回true。
好()
这是最常见的:如果调用上面的任何一个函数都返回true,那么这个函数返回false。
要重置由上述成员函数检查的状态标志,可以使用不带参数的成员函数clear()。
获取和放置流指针。
所有i/o流对象都至少有一个流指针:
Ifstream与istream类似,有一个名为get pointer的指针,指向下一个要读取的元素。Ofstream类似于ostream,有一个指针put指针,指向写入下一个元素的位置。Fstream与iostream类似,继承get和put。我们可以通过使用以下成员函数来读取或配置这些流指针,以读取和写入流中的位置:
Tellg()和tellp()
这两个成员函数不需要传入参数,返回pos_type的值(根据ANSI-C标准),该值为整数,代表当前get流指针(使用tellg)或put流指针(使用tellp)的位置。
Seekg()和seekp()
这对函数分别用于改变流指针get和put的位置。两个函数都作为两个不同的原型重载:
seekg ( pos_type位置);
seekp(pos _ type position);
使用这个原型,流指针被更改为指向从文件计算的绝对位置。传入的参数类型要求与函数tellg和tellp的返回值类型相同。
seekg ( off_type offset,seek dir direction);
seekp ( off_type offset,seek dir direction);
使用这个原型,您可以指定一个特定指针开始计算的偏移量,这个偏移量由参数direction决定。它可以是:
ios:beg
从流的开始处计算的位移
ios:cur
从流指针的当前位置计算的位移
ios:end
从流的末端计算的位移。
对于文本文件和二进制文件,流指针get和put的值计算方式不同,因为文本模式文件中的一些特殊字符可能会被修改。为此,对于以文本文件模式打开的文件,建议始终使用seekg和seekp的第一个原型,不要修改tellg或tellp的返回值。对于二进制文件,可以任意使用这些函数,应该不会出现意外的行为。
以下示例使用这些函数来获取二进制文件的大小:
【cpp】查看plaincopyprint?
//获取filesize # include iostream . h # include fstream . h const char * filename= test . txt ;intmain(){longl,m;ifstreamin(文件名,IOs:in IOs:binary);l=in . tellg();in.seekg(0,IOs:end);m=in . tellg();in . close();cout sizeof 文件名;“cout”是“(m-l)”字节。\ n ;return0}//Result:sizeof example . txt is 40 bytes
//获取文件大小
#包含iostream.h
#包含fstream.h
const char * filename= test.txt
int main () {
long l,m;
ifstream in(文件名,IOs:in IOs:binary);
l=in . tellg();
in.seekg (0,IOs:end);
m=in . tellg();
in . close();
文件名的“大小”;
“cout”是“(m-l)”字节。\ n ;
返回0;
//结果:
example.txt的大小为40字节。
4.二进制文件
在二进制文件中,使用and,以及函数(如getline)来操作输入输出数据,没有实际意义,虽然它们是语法上的。
该流包含两个专门为顺序读写数据而设计的成员函数:write和read。第一个函数(write)是ostream的成员函数,由ofstream继承。而read是istream的成员函数,由ifstream继承。fstream类的对象具有这两种功能。他们的原型是:
write ( char * buffer,streamsize size);
read ( char * buffer,streamsize size);
这里,buffer是内存块的地址,用来存储或读取数据。size参数是一个整数值,指示从缓冲区读取或写入的字符数。
【cpp】查看plaincopyprint?
//reading binary file # include iostream # include fstream . h const char * filename= test . txt ;int main(){ char * buffer;longsizeifstreamin(文件名,IOs:in IOs:binary IOs:ate);size=in . tellg();in.seekg(0,IOs:beg);buffer=new char[size];in.read(缓冲区,大小);in . close();cout“thecompletefilesinabuffer”;删除[]缓冲区;return0}//运行结果:Thecompletefileisinabuffer
//读取二进制文件
#包括iostream
#包含fstream.h
const char * filename= test.txt
int main () {
char *缓冲区;
长尺寸;
ifstream in(文件名,IOs:in IOs:binary IOs:ate);
size=in . tellg();
in.seekg (0,IOs:beg);
buffer=new char[size];
in.read(缓冲区,大小);
in . close();
cout“整个文件在缓冲区中”;
删除[]缓冲区;
返回0;
//运行结果:
完整的文件在缓冲区中
5.缓冲和同步
当我们操作文件流时,它们与一个streambuf类型的缓冲区相关联。这个缓冲区实际上是一个内存空间,作为流和物理文件的媒介。比如一个输出流,每次调用成员函数put(写单个字符)时,这个字符不是直接写入输出流对应的物理文件,而是先插入到流的缓冲区。
当缓存被刷新时,其中的所有数据要么被写入物理介质(如果是输出流),要么被简单地擦除(如果是输入流)。这个过程称为同步,它可能发生在以下任何情况下:
当文件关闭时:在文件关闭之前,所有未完全写入或读取的缓存将被同步。当高速缓存缓冲区已满时:高速缓存缓冲区有一定的空间限制。当缓存已满时,它会自动同步。控制字符清楚地表明,当遇到流中的某些特定控制字符时,将发生同步。这些控件包括:flush和endl。显式函数sync():调用成员函数sync()(无参数)可以导致立即同步。此函数返回一个int值,该值等于-1,表示流没有关联的缓存或者操作失败。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。