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”启动.执行. 库源码文件 测试源码文件 面试题:命令源码文件的用途是什么,怎样编写它? 典型回答: 命令源码文 ...
随机推荐
- markdown插件学习
1.Markdown的定义 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.它用简洁的语法代替排版,而不像一般我们用的字处理软件Wo ...
- Java并发编程-可重入锁
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍可以获取该锁而不受影响.在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁. publ ...
- 安装Sikulix
1.sikulix可以在xp,win7,8,10 Mac 10.10.x 以及Linux/Unix 系统上安装 2.安装Java支持 3.下载sikulisetup1.1.0.jar(那里下前篇有介绍 ...
- php codeigniter (CI) oracle 数据库配置-宋正河整理
database.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $active_group = 'default'; $active_record ...
- python中的文件
Python文件 1. 概述 文件对象不仅可以用来访问普通的磁盘文件,也可以访问任何其他类型抽象层面上的文件. 内建函数open()以及file()提供了初始化输入输出(I/O)操作的通用接口. ...
- “内部类” 大总结(Java)
(本文整理自很久以前收集的资料(我只是做了排版修改),作者小明,链接地址没有找到,总之感谢,小明) (后面也对"静态内部类"专门做了补充) 内部类的位置: 内部类可以作用在方法里以 ...
- 实例化spring容器
方法一:在类路径下寻找配置来实例化容器 ApplicationContext ctx = new String[]{"beans.xml"}); 方法二:在文件系统路径下寻找配置文 ...
- html5的一些表单属性
IE8及以下不能很好支持这些属性 <pre>input属性: placeholder:输入框的默认值,向用户显示描述性说明文字或者提示信息 autocomplete:值为on和off..o ...
- Office2016 转换零售版为VOL版
@echo off :ADMIN openfiles >nul >nul ||( echo Set UAC = CreateObject^("Shell.Application& ...
- URAL-1987 Nested Segments 线段树简单区间覆盖
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1987 题意:给定n条线段,每两条线段要么满足没有公共部分,要么包含.给出m个询问,求当前 ...