文件操作.docx
- 文档编号:5441170
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:66
- 大小:155.83KB
文件操作.docx
《文件操作.docx》由会员分享,可在线阅读,更多相关《文件操作.docx(66页珍藏版)》请在冰豆网上搜索。
文件操作
C++文件处理收藏
一、 文件和流
每个文件不是以文件结束符结束,就是以在由系统维护和管理的数据结构中特定的字节号处结束。
文件打开时,就会创建一个对象,将这个对象和某个流关联起来。
Cin,cout,cerr,clog这4个对象会自动生成。
与这些对象相关联的流提供程序与特定文件或设备之间的通信通道。
二、 文件处理包括头文件
三、 创建顺序访问文件
创建了流类ifstream(读入),ofstream(输出),fstream(读入/输出)对象后,便打开了文件。
对于ofstream对象,文件打开方式可以是ios:
:
out(将数据输出到文件)或ios:
:
app(将数据添加到文件末尾,不修改文件中现有的数据),现有的文件用ios:
:
out打开时会被截掉,即文件中的所有数据均被删除。
如果指定文件不存在,就用该文件名建立它。
例:
ofstreamoutClientFile(“clients.dat”,ios:
:
out);
打开了文件的ofstream构造函数,这样就建立了与文件的通信。
文件打开方式一览:
ios:
:
app 将所有的输出写入文件的末尾
ios:
:
ate 打开文件以便输出,并移动文件末尾(通常用语在文件中添加数据)。
数据可以写入文件的任何地方
ios:
:
in 打开文件以便输入
ios:
:
out 打开文件以便输出
ios:
:
trunc 删除文件现有内容(这也是ios:
:
out的默认操作)
ios:
:
binary 打开文件以二进制(也就是非文本)格式输入或输出exit函数终止程序时,参数为0表示程序正常终止,其他任何值表示程序因某个错误而终止。
四、 读取顺序访问文件中的数据
例如:
viewplaincopytoclipboardprint?
1.ifstream inClientFile( “Clients.dat”, ios:
:
in );
2.while( inClientFile >> account >> name >> balance );
ifstream类和ostream类都提供成员函数,使程序重新定位“文件位置指针”,这些成员是ifstream类的seekg和ostream类的seekp,每个istream对象有一个get指针,表示文件中一下个输入相同的字节数,每个ostream对象有一个put指针,表示下有一个输出相同的字节数。
例:
inClientFile.seekg(0);将文件位置指针移动到文件开头,seekg的参数通常为long类型的整数。
Seekg还有第2个参数,可以指定查找方向,ios:
:
beg(默认)相对于流的开头定位,ios:
:
cur相对于流的当前位置定位,ios:
:
end相对于流结尾定位。
文件位置指针是个整数值,指定文件中离文件开头的相对位置(偏移量)。
例如:
viewplaincopytoclipboardprint?
1.fileObject.seekg( n );//指向文件开头的第N个字节。
2.fileObject.seekg( n, ios:
:
cur );
3.fileObject.seekg( y, ios:
:
end );
4.fileObject.seekg( 0, ios:
:
cur );
5.Location = fileObject.tellg();// 获取流长度
五、 更新顺序访问文件
案例:
原记录:
300White0.00
改为 :
300Worthington0.00
因为新记录的长度大于原始记录的长度,所以从‘ton’中的‘o’之后的字符将重定
为文件中的下一条顺序记录,其原因在于:
使用流插入操作符<<和流读取操作符>>的格式化输入/输出模型中,域的宽度不定,所以记录的宽度也不定。
例如:
7.14 -117 2047 25482都是int类型的值,虽然他们的内部存储占相同的字节数,但是将他们以格式化文本打印到屏幕上或存储在磁盘上时站用的域不一样。
因此格式化输出/输入模型通常不用于更新现有的记录。
六、 随机访问文件
生成顺序文件和从顺序访问文件搜索特定信息顺序访问文件不适宜快速访问应用程序,即立即找到特定记录的信息。
快速应用程序是用随机访问文件实现,这种文件的各个记录可以直接快速的访问,而不需要进行搜索。
随机访问文件中的每条记录有相同的长度,所以能够用记录关键字的函数计算出每条记录相对于文件起始点的位置。
七、 建立随机访问文件
ostream成员函数write把从内存中指定位置开始的固定个数的字节输出到指定流中。
当流与文件关联时,数据被写到put文件位置指针所指的位置。
Istream成员函数read把固定数目的字节从指定流输入到内存中指定地址开始的区域中。
如果流与文件关联,则该字节从get文件位置指针指定的文件地址开始输入。
例:
将一个4字节的整数number,不再用outFile< 打印1位或11位(10位加一个符号位,各自需要1字节的存储空间)改用 outFile.write(reinterpret_cast write函数要求一个constchar*类型的数据作为第一个参数,因此我们用reinterpret_cast 第二个参数是size_t类型的整数,指定写入的字节数。 随机存取文件处理程序很少在文件中只写入一个域,通常会一次写如一个struct或一个 class对象。 例如: viewplaincopytoclipboardprint? 1.struct clientData 2.{ 3. int accountNumber; 4. char lastName[ 15 ]; 5. char firstName[ 10 ]; 6. double balance; 7.}; 8. 9.int main() 10.{ 11. ofstream outCredit( “credit.dat”, ios: : binary ); 12. if( ! outCredit ) 13. { 14. cerr << “File could not be opened.” << endl; 15. exit( 1 ); 16. } 17. clientData blankClient = { 0, “”, “”, 0.0 }; 18. for ( int I = 0; I<100, I++ ) 19. { 20. outCredit.wirte( 21. reinterpret_cast< const char * > 22. ( &blankClient ), sizeof( clientData )); 23. } 24. return 0; 25.} 八、 向随机访问文件随机写入数据 ostream的函数seekp和write用于将数据保存到文件的指定位置。 OutCredit.seekp((client.accountNumber–1)*sizeof(ClientData)); 将对象的“put”文件位置指针放在(client.accountNumber–1)*sizeof(ClientData)求出的字节位置处。 Ofstream的对象outCredit用文件打开方式ios: : ate打开。 “put”文件位置指针最初在文件末尾,但数据可以在文件任何位置写入。 九、 从随机访问文件中顺序读取数据 例: viewplaincopytoclipboardprint? 1.inCredit.read ( reinterpret_cast< char * > ( &client ),sizeof(clientData)) 例子: viewplaincopytoclipboardprint? 1.int main() 2.{ 3. ifstream inCredit ( “credit.dat”, iso: : in ); 4. if( ! inCreadit ) 5. { 6. cerr << “File Cannot Open” << endl; 7. exit( 1 ); 8. } 9. clientData client; 10. inCredit.read( reinterpret_cast< char * >( &client ), 11. sizeof( clientData )); 12. while( inCredit && ! inCredit.eof() )//当读取错误或文件末尾退出 13. { 14. if( client.accuntNumber ! = 0 ) outputLine( cout, 15. client ); 16. inCredit.read( reinterpret_cast< char * >( &client ), 17. sizeof( clientData )); 18. } 19. return 0; 20.} 21.void outputLine( ostream &output, const clientData &c ) 22.{ 23. output <<……………………< 24.} C++文件处理详解 关键字: c++ 转摘于: C++通过以下几个类支持文件的输入输出: *ofstream: 写操作(输出)的文件类(由ostream引申而来) *ifstream: 读操作(输入)的文件类(由istream引申而来) *fstream: 可同时读写操作的文件类(由iostream引申而来) 打开文件(Openafile) 对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。 被打开的文件在程序中由一个流对象(streamobject)来表示(这些类的一个实例),而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。 要通过一个流对象打开一个文件,我们使用它的成员函数open(): voidopen(constchar*filename,openmodemode); 这里filename是一个字符串,代表要打开的文件名,mode是以下标志符的一个组合: ios: : in为输入(读)而打开文件 ios: : out为输出(写)而打开文件 ios: : ate初始位置: 文件尾 ios: : app所有输出附加在文件末尾 ios: : trunc如果文件已存在则先删除该文件 ios: : binary二进制方式 这些标识符可以被组合使用,中间以”或”操作符(|)间隔。 例如,如果我们想要以二进制方式打开文件"example.bin"来写入一些数据,我们可以通过以下方式调用成员函数open()来实现: ofstreamfile; file.open("example.bin",ios: : out|ios: : app|ios: : binary); ofstream,ifstream和fstream所有这些类的成员函数open都包含了一个默认打开文件的方式,这三个类的默认方式各不相同: 类参数的默认方式 ofstreamios: : out|ios: : trunc ifstreamios: : in fstreamios: : in|ios: : out 只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。 如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。 由于对类ofstream,ifstream和fstream的对象所进行的第一个操作通常都是打开文件,这些类都有一个构造函数可以直接调用open函数,并拥有同样的参数。 这样,我们就可以通过以下方式进行与上面同样的定义对象和打开文件的操作: ofstreamfile("example.bin",ios: : out|ios: : app|ios: : binary); 两种打开文件的方式都是正确的。 你可以通过调用成员函数is_open()来检查一个文件是否已经被顺利的打开了: boolis_open(); 它返回一个布尔(bool)值,为真(true)代表文件已经被顺利打开,假(false)则相反。 关闭文件(Closingafile) 当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。 关闭文件需要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。 它的格式很简单: voidclose(); 这个函数一旦被调用,原先的流对象(streamobject)就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程(process)所有访问了。 为防止流对象被销毁时还联系着打开的文件,析构函数(destructor)将会自动调用关闭函数close。 文本文件(Textmodefiles) 类ofstream,ifstream和fstream是分别从ostream,istream和iostream中引申而来的。 这就是为什么fstream的对象可以使用其父类的成员来访问数据。 一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin和cout)来进行输入输出。 如下面的例题所示,我们使用重载的插入操作符<<: C++代码 1.// writing on a text file 2.#include 3. 4.int main () { 5. ofstream examplefile ("example.txt"); 6. if (examplefile.is_open()) { 7. examplefile << "This is a line.\n"; 8. examplefile << "This is another line.\n"; 9. examplefile.close(); 10. } 11. return 0; 12.} //writingonatextfile #include intmain(){ ofstreamexamplefile("example.txt"); if(examplefile.is_open()){ examplefile<<"Thisisaline.\n"; examplefile<<"Thisisanotherline.\n"; examplefile.close(); } return0; } fileexample.txt Thisisaline. Thisisanotherline. 从文件中读入数据也可以用与cin的使用同样的方法: C++代码 1.// reading a text file 2.#include 3.#include 4.#include 5. 6.int main () { 7. char buffer[256]; 8. ifstream examplefile ("example.txt"); 9. if (! examplefile.is_open()) 10. { cout << "Error opening file"; exit (1); } 11. while (! examplefile.eof() ) { 12. examplefile.getline (buffer,100); 13. cout << buffer << endl; 14. } 15. return 0; 16.} //readingatextfile #include #include #include intmain(){ charbuffer[256]; ifstreamexamplefile("example.txt"); if(! examplefile.is_open()) {cout<<"Erroropeningfile";exit (1);} while(! examplefile.eof()){ examplefile.getline(buffer,100); cout< } return0; } Thisisaline. Thisisanotherline. 上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。 注意我们使用了一个新的成员函数叫做eof,它是ifstream从类ios中继承过来的,当到达文件末尾时返回true。 状态标志符的验证(Verificationofstateflags) 除了eof()以外,还有一些验证流的状态的成员函数(所有都返回bool型返回值): *bad() 如果在读写过程中出错,返回true。 例如: 当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。 *fail() 除了与bad()同样的情况下会返回true以外,加上格式错误时也返回true,例如当想要读入一个整数,而获得了一个字母的时候。 *eof() 如果读文件到达文件末尾,返回true。 *good() 这是最通用的: 如果调用以上任何一个函数返回true的话,此函数返回false。 要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。 获得和设置流指针(getandputstreampointers) 所有输入/输出流对象(i/ostreamsobjects)都有至少一个流指针: *ifstream,类似istream,有一个被称为getpointer的指针,指向下一个将被读取的元素。 *ofstream,类似ostream,有一个指针putpointer,指向写入下一个元素的位置。 *fstream,类似iostream,同时继承了get和put 我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针: *tellg()和tellp() 这两个成员函数不用传入参数,返回pos_type类型的值(根据ANSI-C++标准),就是一个整数,代表当前get流指针的位置(用tellg)或put流指针的位置(用tellp). *seekg()和seekp() 这对函数分别用来改变流指针get和put的位置。 两个函数都被重载为两种不同的原型: seekg(pos_typeposition); seekp(pos_typeposition); 使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。 要求传入的参数类型与函数tellg和tellp的返回值类型相同。 seekg(off_typeoffset,seekdirdirection); seekp(off_typeoffset,seekdirdirection); 使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。 它可以是: ios: : beg从流开始位置计算的位移 ios: : cur从流指针当前位置开始计算的位移 ios: : end从流末尾处开始计算的位移 流指针get和put的值对文本文件(textfile)和二进制文件(binaryfile)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。 由于这个原因,建议对以文本文件模式打开的文件总是使用seekg和seekp的第一种原型,而且不要对tellg或tellp的返回值进行修改。 对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。 以下例子使用这些函数来获得一个二进制文件的大小: C++代码 1.// obtaining file size 2.#include 3.#include 4. 5.const char * filename = "example.txt"; 6. 7.int main () { 8. long l,m; 9. ifstream file (filename, io
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 操作