设为首页 加入收藏

TOP

C++学习笔记之输入、输出和文件(一)
2015-07-20 17:56:37 来源: 作者: 【 】 浏览:4
Tags:学习 笔记 输入 输出 文件
一、流的概念
?
数据从内存的一个地址移动到另一个地址称为数据流动——流操作
流操作是通过缓冲区(buffer)机制实现的。
缓冲区:内存的一块区域——用作文件与内存交换数据。
数据从文件中读出:文件 → 缓冲区 → 内存
将数据写入文件:内存 → 缓冲区 → 文件
为什么要使用缓冲区而不直接从文件中读取数据到内存或者直接有内存写入文件呢?我们的文件通常都存在磁盘中,程序从磁盘读取一个字符需要大量的硬件活动,速度非常慢。缓冲方法则从磁盘上读取大量信息,将这些信息存储在缓冲区,然后每次从缓冲区里读取一个字节,因为从内存中读取单个字节的速度比从硬盘上读取快很多,所以这种方法更快,也更方便。说了这么多,只需知道缓冲方法更高效就可以了。
?
?
二、流库(stream library)介绍
?
使用继承的方法建立的输入输出类库,包含两个平行的基本类:streambuf和ios类,所有流类均以两者之一作为基类。
?
streambuf类提供对缓冲区的低级操作:设置缓冲区,对缓冲区指针操作,向缓冲区存取字符等
ios类及其派生类提供用户使用流类的接口
本文主要介绍ios,因为ios是 编程中几乎必用的类,而streambuf类很少直接使用。下面图片来自网络:
?
?
?
?三、文件打开与关闭
?
当程序中进行文件操作时,应加上头文件“fstream”
若要打开文件进行相应的操作,必须定义相应的流对象。如:ifstream in; // 文件输入流对象,ofstream out; // 文件输出流对象, fstream both; // 文件输入/输出流对象
文件打开用成员函数open();
?
? 原型 void(const char * s, ios_base::openmode, mode = ios_base::out|ios_base::trunc)
第一个参数表示打开文件的路径,第二个参数表示文件打开方式,第三个参数表示访问方式,
标志 含义
ios::ate 打开文件并移动到文件尾
ios::app 追加到文件尾
ios:in 作为输入文件(ifstream默认)
ios::out 作为输出文件(ofstream默认)
ios::trunc     若文件存在,清除文件内容(默认)
ios::nocreate 若文件不存在,返回错误
ios::noreplace 若文件存在,返回错误
ios::binary 以二进制方式打开 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
?
文件打开的方法:
?
方法一:先定义一个文件流对象,再用文件流对象调用成员函数open( )打开一个文件。如:
1 ? ifstream ?f1; ?//定义文件输入流对象f1
2 ? f1.open( “d:\\ vcprg\\7-3.cpp”); //打开D盘vcprg文件夹(目录)下的7-3.cpp文件,可进行文件读操作
方法二:在定义文件流对象时利用构造函数打开文件。如:
? ifstream f1( “d:\\vcprg\\7-3.cpp”)
?
?
用文件流对象打开文件后,该对象就代表了被打开的文件。
复制代码
?1 #include
?2 #include
?3?
?4 using namespace std;?
?5?
?6 void main(void)
?7 { ?
?8 ? ? ifstream f1; ? ? ? ?//定义文件输入流对象
?9 ? ? f1.open("d:\\vcprg\\7-3.cpp"); ?//打开文件
10 ? ? char c;
11 ? ? while(!f1.eof()) ? ? ? ? //判断文件未结束则循环,eof()在文件结束时返回true
12 ? ? {
13 ? ? ? ? ?f1.get(c);
14 ? ? ? ? ?cout << c;
15 ? }
16 ? ? cout << endl;
17 ? ? f1.close(); ? ? ?//关闭文件
18 }
复制代码
文件访问方式:
?
当用ifstream定义流对象并打开一个文件时,默认为ios_base::in方式;
当用ofstream定义流对象并打开一个文件时,默认为ios_base::out方式;
当用fstream定义流对象并打开一个文件时,应给出打开方式(可用“位或”运算以多种方式打开文件)如:
1 fstream f;
2 f.open(“file.cpp”,ios_base::in|ios_base::out)
?例:将D盘vcprg文件夹(目录)下的7-3.cpp文件,复制为text.txt文件。
?
复制代码
?1 #include
?2 #include
?3?
?4 using namespace std;
?5?
?6 void main(void)
?7 {?
?8 ? ? ifstream f1; ? ? ? ?//定义文件输入流对象
?9 ? ? ofstream f2;
10 ? ? f1.open("d:\\vcprg\\7-3.cpp"); ?//以读方式打开文件
11 ? ? f2.open("d:\\vcprg\\text.txt"); ?//以写方式打开文件
12 ? ? char c;
13 ? ? while(!f1.eof()) ? ? ? ? //判断文件未结束则循环,eof()会在文件结束时返回true
14 ? ? {
15 ? ? ? ? f1.get(c);
16 ? ? ? ? f2<
17 ? }
18 ? ? cout << "文件复制成功" << endl;
19 ? ? f1.close(); //关闭文件
20 ? ? f2.close();
21 }
复制代码
文件异常处理:
?
当打开一个文件可能失败,在程序中通常应加上异常处理程序。
(1) 用条件语句判断文件流标志位failbit是否为true。
?
if(!文件流对象){<异常处理程序>}
?
if(文件流对象){<正常处理程序>}(上面一段示例的13行就是用这种方式)
?
(2)用成员fail()函数
?
if(文件流对象.fail()){<异常处理程序>}
?
if(!文件流对象.fail()){<正常处理程序>}
?
(3)用成员函数good()
?
if(!文件流对象.good()){<异常处理程序>}
?
if(文件流对象.good()){<正常处理程序>}
?
(4)较新的C++实现提供了一种更好的方式is_open()方法,推荐用此方法,但是老式C++没有实现这种方法,用上面三种均可
?
?
?
文件的关闭:
?
格式:文件流对象.close();
?
关闭文件操作包括把缓冲区数据完整地写入文件,添加文件结束标志,切断流对象和外部文件的连接
若流对象的生存期没有结束,可以重用
当一个流对象的生存期结束,系统也会自动关闭文件
例如:
?
复制代码
1 ofstream ?ofile ; ?// 创建输出文件流
2?
3 ofile . open ( "myfile1" ) ; // ofile流与文件“myfile1”相关联
4?
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 3221 Brute-force Algorithm(.. 下一篇POJ1456Supermarket(贪心+优先队..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: