c++c 文件读写取

134202人阅读
C++基础知识(5)
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结:
这里主要是讨论fstream的内容:
#include &fstream&
//文件写操作 内存写入存储设备
//文件读操作,存储设备读区到内存中
//读写操作,对打开的文件可进行读写操作
1.打开文件
在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作
函数:open()
参数: filename&& 操作文件名
&&&&&&&&&& mode&&&&&&& 打开文件的方式
&&&&&&&&&& prot&&&&&&&& 打开文件的属性&&&&&&&&&&&&&&&&&&&&&&&&&&& //基本很少用到,在查看资料时,发现有两种方式
打开文件的方式在ios类(所以流式I/O的基类)中定义,有如下几种方式:
为输入(读)而打开文件
为输出(写)而打开文件
初始位置:文件尾
所有输出附加在文件末尾
ios::trunc
如果文件已存在则先删除该文件
ios::binary
二进制方式
这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如
out.open(&Hello.txt&, ios::in|ios::out|ios::binary)
//根据自己需要进行适当的选取打开文件的属性同样在ios类中也有定义:
普通文件,打开操作
对于文件的属性也可以使用“或”运算和“+”进行组合使用,这里就不做说明了。
很多程序中,可能会碰到ofstream out(&Hello.txt&), ifstream in(&...&),fstream foi(&...&)这样的的使用,并没有显式的去调用open()函数就进行文件的操作,直接调用了其默认的打开方式,因为在stream类的构造函数中调用了open()函数,并拥有同样的构造函数,所以在这里可以直接使用流对象进行文件的操作,默认方式如下:
当使用默认方式进行对文件的操作时,你可以使用成员函数is_open()对文件是否打开进行验证
2.关闭文件
当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。成员函数close(),它负责将缓存中的数据排放出来并关闭文件。这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。
3.文本文件的读写
类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。
一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符&&:
// writing on a text file
#include &fiostream.h&
int main () {
ofstream out(&out.txt&);
if (out.is_open())
out && &This is a line.\n&;
out && &This is another line.\n&;
out.close();
//结果: 在out.txt中写入:
This is a line.
This is another line
从文件中读入数据也可以用与 cin&&的使用同样的方法:
// reading a text file
#include &iostream.h&
#include &fstream.h&
#include &stdlib.h&
int main () {
char buffer[256];
ifstream in(&test.txt&);
if (! in.is_open())
{ cout && &Error opening file&; exit (1); }
while (!in.eof() )
in.getline (buffer,100);
cout && buffer &&
//结果 在屏幕上输出
This is a line.
This is another line
上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。注意我们使用了一个新的成员函数叫做eof ,它是ifstream 从类 ios 中继承过来的,当到达文件末尾时返回true 。
状态标志符的验证(Verification of state flags)
除了eof()以外,还有一些验证流的状态的成员函数(所有都返回bool型返回值):
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
如果读文件到达文件末尾,返回true。
这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。
获得和设置流指针(get and put stream pointers)
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。fstream, 类似 iostream, 同时继承了get 和 put
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:
从流开始位置计算的位移
从流指针当前位置开始计算的位移
从流末尾处开始计算的位移
流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。
以下例子使用这些函数来获得一个二进制文件的大小:
// obtaining file size
#include &iostream.h&
#include &fstream.h&
const char * filename = &test.txt&;
int main () {
ifstream in(filename, ios::in|ios::binary);
l = in.tellg();
in.seekg (0, ios::end);
m = in.tellg();
in.close();
cout && &size of & &&
cout && & is & && (m-l) && & bytes.\n&;
size of example.txt is 40 bytes.
4.二进制文件
在二进制文件中,使用&& 和&&,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。
文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:
write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
// reading binary file
#include &iostream&
#include &fstream.h&
const char * filename = &test.txt&;
int main () {
ifstream in (filename, ios::in|ios::binary|ios::ate);
size = in.tellg();
in.seekg (0, ios::beg);
buffer = new char [size];
in.read (buffer, size);
in.close();
cout && &the complete file is in a buffer&;
//运行结果:
The complete file is in a buffer
5.缓存和同步(Buffers and Synchronization)
当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。
当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:
当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。明确调用函数sync(): 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:191547次
积分:1069
积分:1069
排名:千里之外
原创:18篇
转载:14篇
评论:36条
(3)(4)(2)(1)(1)(2)(3)(4)(1)(2)(2)(3)(1)(1)(2)(1)(1)(4) (1) (1) (1) (1) (1) (1) (12) (8) (203) (42) (28) (2) (12) (1) (13) (6) (1) (208) (3) (1) (2) (8) (16) (6) (4) (8) (3) (3)
(4737) (1858) (1502) (1335) (954) (820) (678) (662) (647) (627)
(5) (11) (2) (5) (47) (26) (22) (62) (68) (23) (2) (6) (13) (7) (9) (6) (14) (14) (1) (2) (3) (5) (9)
预备知识:fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。ifstream -- 从已有的文件读&ofstream -- 向文件写内容&fstream -- 打开文件供读写&文件打开模式:&ios::in 读ios::out 写ios::app 从文件末尾开始写ios::binary 二进制模式ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。ios::noreplace 打开一个文件时,如果文件不存在,创建该文件ios::trunc 打开一个文件,然后清空内容ios::ate 打开一个文件时,将位置移动到文件尾&文件指针位置在c++中的用法:&ios::beg 文件头ios::end 文件尾ios::cur 当前位置例子:file.seekg(0,ios::beg); //让文件指针定位到文件开头&file.seekg(0,ios::end); //让文件指针定位到文件末尾&file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节&file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节&file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置&常用的错误判断方法:&good() 如果文件打开成功bad() 打开文件时发生错误eof() 到达文件尾&以上摘自: 应注意的地方:1、在文件读取时,&&操作符会自动忽略空格以及换行。例如,输入文件内容如下:8
15&59&60&63&132&169&176&192
17&4&13&30&49&56&60&92&114&132&162&165&169&176&182
21&2&30&50&57&63&92&94&100&114&126&162&165&176&182&192
1&11&31&35&69&114&162&165&182
6&18&67&107&110&158&162&183
.注意每一行后面都没有空格,最后一行是空行。有如下三个代码:代码1:fstream&inF
inFile.open(fileName,&ios::in);
inFile&&iN
cout&&(char)inFile.peek()&&猜猜输出的是什么?A.换行符&B. #代码2:fstream&inF
inFile.open(fileName,&ios::in);
inFile&&iN
inFile&&c;
cout&&c&&猜猜输出的是什么?A.换行符&B. #代码3:fstream&inF
inFile.open(fileName,&ios::in);
inFile&&iN
inFile.get(c);
cout&&c&&猜猜输出的是什么?A.换行符&B. #相信大多数人可能会犯和我同样的错误,认为都是输出#,或者弄混淆。其实代码1和代码3输出的是换行符,代码2输出的为#。据此,我们可以得出以下结论:(1)&&操作符会忽略前面的空白符和换行符,但不会越过后面的换行符和空白符(2)get()方法不会略过任何符号(3)peek()方法预读取下一个字符(不管是何符号)2、利用peek()判断读取完毕同样是1中的输入文件,若读取的代码如下:fstream&inF
inFile.open(fileName,&ios::in);
while(!inFile.eof()){
&&&&//相关的读取操作
}最后一行空行也会进入循环,导致读取错误。因此可以利用peek()方法来避免这个问题:fstream&inF
inFile.open(fileName,&ios::in);
while(!inFile.eof()&&inFile.peek()!=EOF){
&&&&//相关的读取操作
转载请注明: >>C++文件读写操作_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C++文件读写操作
上传于||文档简介
&&收​集​的​C​语​言​对​文​件​的​操​作​函​数​的​介​绍​,​整​理​了​一​下​,​放​上​来​,​供​大​家​参​考
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩23页未读,继续阅读
你可能喜欢当前访客身份:游客 [
当前位置:
发布于 日 10时,
一个简单的C++文件读写练习
代码片段(1)
1.&[代码]一个简单的文件读写练习&&&&
编写一个程序,统计data.txt文件的行数,并将所有行前加上行号后写到data1.txt文件中。
算法提示:
行与行之间以回车符分隔,而getline()函数以回车符作为终止符。因此,可以采用getline()函数读取每一行,再用一个变量i计算行数。
(1)实现源代码
#include &iostream&
#include &fstream&
#include &string&
#include &sstream&
int coutFile(char * filename,char * outfilename)
filein.open(filename,ios_base::in);
fileout.open(outfilename,ios_base::out);
int count=0;
while(getline(filein,strtemp))
cout&&strtemp&&
fileout&&count&&" "&&strtemp&&
filein.close();
fileout.close();
void main()
cout&&coutFile("c:\\data.txt","c:\\data1.txt")&&
开源中国-程序员在线工具:
相关的代码(2649)
cout&&strtemp&&
fileout&&++count&&" "&&strtemp&&'\n';
频繁endl性能会非常非常差。
main的形式不标准。
int main(void)
& & return 0;
2楼:李文轩 发表于
ifstream、ofstream使用构造和析构就好,不用明确写open和close
3楼:flypie 发表于
开源从代码分享开始
flypie的其它代码c++读写文件流实例程序讲解
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了c++读写文件流实例,大家参考使用吧
掌握文本文件读写的方法了解二进制文件的读写方法
C++文件流: 代码如下:fstream  // 文件流ifstream  // 输入文件流ofstream  // 输出文件流//创建一个文本文件并写入信息//同向屏幕上输出信息一样将信息输出至文件#include&iomanip.h&#include&fstream.h&void main(){  ofstream f1("d:\\me.txt");           //打开文件用于写,若文件不存在就创建它  if(!f1)                 //打开文件失败则结束运行  f1&&setw(20)&&"姓名:"&&"廉东方"&&     //使用插入运算符写文件内容  f1&&setw(20)&&"家庭地址:"&&"河南郑州"&&  f1.close();                   //关闭文件}
运行后打开文件d:\me.txt,其内容如:姓名:廉东方家庭地址:河南郑州文件操作:打开文件文件名注意路径名中的斜杠要双写,如:"D:\\MyFiles\\ReadMe.txt"文件打开方式选项:ios::in= 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)ios::out  = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)ios::ate  = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用ios::app  = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后ios::trunc = 0x10, //在读写前先将文件长度截断为0(默认)ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用ios::binary= 0x80  //二进制格式文件文件保护方式选择项:filebuf:: //默认的兼容共享方式filebuf::sh_  //独占,不共享filebuf::sh_  //读共享filebuf::sh_ //写共享打开文件的方法调用构造函数时指定文件名和打开模式ifstream f("d:\\12.txt",ios::nocreate); //默认以 ios::in 的方式打开文件,文件不存在时操作失败ofstream f("d:\\12.txt");  //默认以 ios::out的方式打开文件fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以读写方式打开二进制文件使用Open成员函数f.open("d:\\12.txt",ios::out); //利用同一对象对多个文件进行操作时要用到open函数检查是否成功打开成功:if(f){...} //对ifstream、ofstream对象可用,fstream对象不可用。if(f.good()){...}失败:if(!f){...} // !运算符已经重载if(f.fail()){...}读写操作使用&&,&&运算符只能进行文本文件的读写操作,用于二进制文件可能会产生错误。使用函数成员 get、put、read、write等经常和read配合使用的函数是gcount(),用来获得实际读取的字节数。读写二进制文件注意事项打开方式中必须指定ios::binary,否则读写会出错用read\write进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。使用eof()函数检测文件是否读结束,使用gcount()获得实际读取的字节数关闭文件使用成员函数close,如:f.close(); 利用析构函数对象生命期结束时会检查文件是否关闭,对没有关闭的文件进行关闭操作。随机读写文件通过移动文件读写指针,可在文件指定位置进行读写。seekg(绝对位置);//绝对移动,//输入流操作seekg(相对位置,参照位置);  //相对操作tellg();//返回当前指针位置seekp(绝对位置);//绝对移动,//输出流操作seekp(相对位置,参照位置);  //相对操作 tellp();//返回当前指针位置参照位置:ios::beg= 0 //相对于文件头ios::cur= 1 //相对于当前位置ios::end= 2 //相对于文件尾读写文本文件的示例/为能够正确读出写入文件的各数据,各数据间最好要有分隔
代码如下:#include&fstream.h&void main(){fstream f("d:\\try.txt",ios::out);f&&1234&&' '&&3.14&&'A'&&"How are you"; //写入数据f.close();f.open("d:\\try.txt",ios::in);char s[20];f&&i&&d&&c; //读取数据f.getline(s,20);cout&&i&& //显示各数据cout&&d&&cout&&c&&cout&&s&&f.close();}
运行结果:
12343.14AHow are youPress any key to continue
显示文本文件的内容
使用get()一次读一个字符--------------------------------方案一
代码如下:#include&fstream.h&void main(){ifstream fin("d:\\简介.txt",ios::nocreate);if(!fin){cout&&"File open error!\n";}while((c=fin.get())!=EOF)cout&&c;  //注意结束条件的判断fin.close();}
//使用get(char *,int n,char delim='\n')一次读多个字符----方案二//巧妙利用文本文件中不会有字符'\0'的特点进行读取#include&fstream.h&void main(){ifstream fin("d:\\简介.txt",ios::nocreate);if(!fin){cout&&"File open error!\n";}char c[80];while(fin.get(c,80,'\0')!=NULL)cout&&c; //注意结束条件的判断fin.close();}//使用read(char *,int n)读文件---------------------------方案三#include&fstream.h&void main(){ifstream fin("d:\\简介.txt",ios::nocreate);if(!fin){cout&&"File open error!\n";}char c[80];while(!fin.eof())  //判断文件是否读结束{fin.read(c,80);cout.write(c,fin.gcount()); }fin.close();}
拷贝文件二进制文件操作示例 代码如下:#include&fstream.h&void main(){ifstream fin("C:\\1.exe",ios::nocreate|ios::binary);if(!fin){cout&&"File open error!\n";}ofstream fout("C:\\2.exe",ios::binary);char c[1024];while(!fin.eof()){fin.read(c,1024);fout.write(c,fin.gcount());}fin.close();fout.close();cout&&"Copy over!\n";}
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 c 读取excel文件 的文章

 

随机推荐