C++学习笔记之输入、输出和文件
一、流的概念
- 数据从内存的一个地址移动到另一个地址称为数据流动——流操作
- 流操作是通过缓冲区(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( )打开一个文件。如:
ifstream f1; //定义文件输入流对象f1
f1.open( “d:\\vcprg\\-.cpp”); //打开D盘vcprg文件夹(目录)下的7-3.cpp文件,可进行文件读操作
- 方法二:在定义文件流对象时利用构造函数打开文件。如:
ifstream f1( “d:\\vcprg\\-.cpp”)
#include<iostream>
#include <fstream> using namespace std; void main(void)
{
ifstream f1; //定义文件输入流对象
f1.open("d:\\vcprg\\7-3.cpp"); //打开文件
char c;
while(!f1.eof()) //判断文件未结束则循环,eof()在文件结束时返回true
{
f1.get(c);
cout << c;
}
cout << endl;
f1.close(); //关闭文件
}
文件访问方式:
fstream f;
f.open(“file.cpp”,ios_base::in|ios_base::out)
例:将D盘vcprg文件夹(目录)下的7-3.cpp文件,复制为text.txt文件。
#include <iostream>
#include <fstream> using namespace std; void main(void)
{
ifstream f1; //定义文件输入流对象
ofstream f2;
f1.open("d:\\vcprg\\7-3.cpp"); //以读方式打开文件
f2.open("d:\\vcprg\\text.txt"); //以写方式打开文件
char c;
while(!f1.eof()) //判断文件未结束则循环,eof()会在文件结束时返回true
{
f1.get(c);
f2<<c;
}
cout << "文件复制成功" << endl;
f1.close(); //关闭文件
f2.close();
}
文件异常处理:
(1) 用条件语句判断文件流标志位failbit是否为true。
if(!文件流对象){<异常处理程序>}
if(文件流对象){<正常处理程序>}(上面一段示例的13行就是用这种方式)
(2)用成员fail()函数
if(文件流对象.fail()){<异常处理程序>}
if(!文件流对象.fail()){<正常处理程序>}
(3)用成员函数good()
if(!文件流对象.good()){<异常处理程序>}
if(文件流对象.good()){<正常处理程序>}
(4)较新的C++实现提供了一种更好的方式is_open()方法,推荐用此方法,但是老式C++没有实现这种方法,用上面三种均可
文件的关闭:
格式:文件流对象.close();
例如:
ofstream ofile ; // 创建输出文件流 ofile . open ( "myfile1" ) ; // ofile流与文件“myfile1”相关联 …… // 访问文件“myfile1” ofile . close ( ) ; // 关闭文件“myfile1” ofile . open ( "myfile2" ) ; // 重用ofile流
四、文件读写
文本文件的读写:
方法get(char&)和get()提供不跳过空白的单字符输入功能;
方法put(char&)和put()提供不跳过空白的单字符输出功能;
函数get(char*,int,char)和getline(char*,int,char)在默认情况下读取整行;
二进制文件的读写:
#include <fstream>
#include <iomanip> using namespace std; int main ()
{
ofstream ost ;
ost.open ( "d:\\my2.dat" ) ;
ost << "" << endl ;
int a = ;
ost << a << endl ;
ost << setw ( ) << a << endl ;
ost << resetiosflags ( ios :: right ) << setiosflags ( ios :: left )
<< setfill ( '#' ) << setw ( ) << a << endl ;
ost << resetiosflags ( ios :: left ) << setiosflags ( ios :: right )
<< setprecision ( ) << setw ( ) << 12.34567890 << endl ;
ost . close ( ) ;
return ;
}
建立一个包含学生学号、姓名、成绩的文本文件:
#include <iostream>
#include <fstream>
#include <cstdlib> using namespace std; int main()
{
char fileName[] , name[] ;
int number , score ; ofstream outstuf; //建立输出流对象 cout << "Please input the name of students file :\n" ;
cin >> fileName ; //输入文件名 outstuf.open(fileName, ios::out) ; //以输出方式打开文件 if ( !outstuf )
{
cerr << "File could not be open." << endl ;
exit();
}
outstuf << "学生成绩文件\n" ;
cout << "Input the number, name, and score : (Enter Ctrl-Z to end input)\n? " ;//windows中Ctrl-Z 结束输入和输出 while( cin >> number >> name >> score )
{
outstuf << number << ' ' << name << ' ' << score << '\n' ;
cout << "? " ;
}
outstuf.close() ;
return ;
}
二进制文件,从一个学校教程里搜罗的图,讲的很清晰:
五、总结
- istream类定义了多个版本的抽取运算符(>>),用于识别所有基本的C++类型,并将字符输入转换为这些类型。get()方法族和getline()方法为单字符输入和字符串输入提供了进一步支持;
- ostream类定义了多个版本的插入运算符(>>),用于识别所有基本的C++类型,并将字符输入转换为这些类型输出。put()方法为单字符输入和字符串输入提供了进一步支持;
- 使用ios_base类方法以及文件iostream和iomanip中定义的控制符(参考http://wonderow.cnblogs.com/archive/2005/06/21/178719.html)可以控制格式化输出;
- 对文件操作,必须将文件与流关联起来,通过ifstream对象与文件关联,可以使用所有istream方法来读取文件,使用ofstream对象与文件关联起来,可以使用ofstream方法来写文件,使用fstream对象关联文件,可以将fstream的输入和输出方法用于文件;
- 要将文件与流关联,先创建一个文件流对象,然后用open()方法将这个流与文件关联,close()方法终止流与文件的关联;
- 文本文件是以字符格式存储信息,例如数字值将会被转变为字符表示;
- seekg()和seekp()通过指针提供对文件的随机存取。tellg()和tellp()方法报告当前文件的位置.
C++学习笔记之输入、输出和文件的更多相关文章
- Python基础学习笔记---5.输入\输出 I\O文件操作目录
在很多时候,你会想要让你的程序与用户(可能是你自己)交互.你会从用户那里得到输入,然后打印一些结果.我们可以分别使用 raw_input 和 print 语句来完成这些功能.对于输出,你也可以使用多种 ...
- python学习笔记6-输入输出与文件读取写入
(1)打印到屏幕:print (2)读取键盘输入:input/raw_input #键盘输入 str = raw_input("Please enter:"); print (&q ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- A Byte of Python 笔记(10)输入/输出:文件和储存器
第12章 输入/输出 大多数情况下,我们需要程序与用户交互.从用户得到输入,然后打印一些结果. 可以分别使用 raw_input 和 print 语句来完成这些功能.对于输出,可以使用多种多样的 s ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- tensorflow学习笔记——多线程输入数据处理框架
之前我们学习使用TensorFlow对图像数据进行预处理的方法.虽然使用这些图像数据预处理的方法可以减少无关因素对图像识别模型效果的影响,但这些复杂的预处理过程也会减慢整个训练过程.为了避免图像预处理 ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- Linux学习笔记14——使用fcntl实现文件锁定
期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...
- [Golang学习笔记] 02 命令源码文件
源码文件的三种类型: 命令源文件:可以直接运行的程序,可以不编译而使用命令“go run”启动.执行. 库源码文件 测试源码文件 面试题:命令源码文件的用途是什么,怎样编写它? 典型回答: 命令源码文 ...
随机推荐
- C# GDI+学习笔记1
前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...
- Delphi 之前解析串口数据
//串口接收数据procedure TfrmClientMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Wo ...
- CMDB反思3
CMDB模型设计1 http://blog.vsharing.com/xqscool/A1274634.html 分类的问题上比较有感悟.在之前编写新版的CMDB模型的时候,曾将刀片机.x86服务器. ...
- 你可能不知道的30个Python语言的特点技巧
1 介绍 从我开始学习Python时我就决定维护一个经常使用的“窍门”列表.不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中.在StackOverflow.在开源码软件中,等等), ...
- 通知(Toast+Notification)
Toast简要说明:(前面已经用过好多次了) Toast是一种非持久的(在屏幕上面留一会儿就消失了),提供给用户简洁提示信息的视图. 它不阻断用户的操作,一般用于显示一些不重要的信息.(比方说设置音量 ...
- 新霸哥带你进入java的世界
新霸哥从近期大家的留言中注意到了大家对基础知识比较重视,很多的朋友希望多讲一些入门的知识,为了满足广大开发爱好者的需求,新霸哥决定从最基础的做起,一点一点的帮助大家一起走进云计算的世界.下面新霸哥首先 ...
- Android APP的安装路径
转载自:http://blog.csdn.net/libaineu2004/article/details/25247711 一.安装路径在哪? Android应用安装涉及到如下几个目录: syste ...
- 【Python学习笔记】字符串操作
字符串的表示 python中的字符串是一个常量,可以使用单引号'',双引号""或三引号""" """来创建一个字符串常量 ...
- [WebService]之代码优先方法与契约优先方法
什么是 web 服务? web 服务是对应用程序功能的网络访问接口,它是使用标准 Internet 技术构建的. 我们目前看到的部署在 Internet 上的 web 服务都是 HTML 网站.其中, ...
- 1、Hadoop架构
1.Hadoop 是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多小的工作单元放到任何集群节点上执行. 作业(job):一个 ...