(C/C++学习)10.C++文件流
说明:C++中的文件流分为三种:文件输入流、文件输出流、文件输入/输出流,其对应的类分别为 ifstream、ofstream 和 fstream 。由这三个类创建类对象,完成对文件的操作。其中文件的操作包括:打开、读写以及关闭。
注意:输入输出流中的输入与输出,是针对程序(也可以说是针对当前进程)来说的,文件的输入指将文件的内容输入到程序中,即读取文件;同理,输出即指将数据从程序中往文件中输出。
一.定义流对象
ifstream ifile; //定义一个文件输入流对象
ofstream ofile; //定义一个文件输出流对象
fstream iofile; //定义一个文件输出/输入流对象
二.文件的打开
1.定义了文件流对象后,就可以利用其成员函数 open()打开需要操作的文件,该成员函数的函数原型为:
void open(const unsigned char *filename,int mode,int access=filebuf:openprot);
其中:filename 是一个字符型指针,指定了要打开的文件名;mode 指定了文件的打开方式,其值如下表所示;access 指定了文件的系统属性,取默认即可。
打开文件的方式:
在实际使用过程中,可以根据需要将以上打开文件的方式用“|”组合起来。如:
ios::in|ios::out|ios::binary
表示以二进制读/写方式打开文件
2) 如果未指明以二进制方式打开文件,则默认是以文本方式打开文件。
3) 对于 ifstream 流, mode 参数的默认值为 ios::in,对于 ofstream 流,mode 的默认值为 ios::out|ios::trunc, 对于 fstream 流, mode 的默认值为 ios::int|ios::out|ios::app。
4) 出错处理是通过对类对象进行判断的。若文件打开成功,返回 1,否则返回 0。
如下代码:往文件中写入用户输入的名字以及年纪
fstream of;
of.open("xxx.txt",ios::out|ios::trunc);
if(of == NULL)
return -1;
char buf[1024];
cout<<"pls input name : ";
cin.getline(buf,20);
of<<buf<<'\n';
cout<<"pls input age : ";
cin.getline(buf,1024);
of<<buf<<'\n';
12 return 0;
而下面代码,将刚才写入文件的内容打印出来
char buf[1024];
fstream ifp;
ifp.open("xxx.txt",ios::in);
if(ifp == NULL)
return -1;
while(ifp>>buf)
cout<<buf<<endl;
return 0;
注意:在用某个类创建其类对象的时候,需要包含其相应的头文件。
三.流文件的状态
系统为了标识当前文件操作的状态,提供了标识位和检查标识位的如下函数。
1.eof():如果读文件到达文件末尾,返回 true。
2.bad():如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
3.fail():除了与 bad() 同样的情况下会返回 true 以外,加上格式错误时也返回 true ,例如当想要读入一个整数,而获得了一个字母的时候。或是遇到 eof。
4.good():这是最通用的:如果调用以上任何一个函数返回 true 的话,此函数返回 false 。
5.clear():标识位一旦被置位,这些标志将不会被改变,要想重置以上成员函数所检查的状态标志,你可以使用成员函数 clear(),没有参数。比如:通过函数移动文件指针,并不会使 eof 标志位自动重置。
测试代码:
int main()
{
int integerVal;
cout << "Before a bad input operation:"
<< "\n cin.eof(): " <<cin.eof()
<< "\n cin.fail(): " <<cin.fail()
<< "\n cin.bad(): " <<cin.bad()
<< "\n cin.good(): " <<cin.good()<<endl;
cin>>integerVal; // control + D/Z
cout << "After a bad input operation:"
<< "\n cin.eof(): " <<cin.eof()
<< "\n cin.fail(): " <<cin.fail()
<< "\n cin.bad(): " <<cin.bad()
<< "\n cin.good(): " <<cin.good()<<endl;
cin.clear();
cout<< "\n cin.eof(): " <<cin.eof()
<< "\n cin.fail(): " <<cin.fail()
<< "\n cin.bad(): " <<cin.bad()
<< "\n cin.good(): " <<cin.good()<<endl;
}
四.文件读写
1.文本文件的读出
operator>>
int get();
istream& get(int);
istream & get(char*,int n, char deli )
istream& getline(char * ,int n);
2.文本文件的写入
operator<<
ostream put(int)
示例代码:
fstream ifs;
fstream ofs;
ifs.open("xxx.txt",ios::in);
if(ifs == NULL)
return -1;
ofs.open("yyy.txt",ios::out|ios::trunc);
if(ofs == NULL)
return -1;
char ch;
while(ifs.get(ch))
ofs.put(ch);
return 0;
3.二进制文件的读取
ostream & write(const char * buffer,int len);
istream & read(char * buff, int len);
示例代码:
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
struct student
{
int num;
char name[20];
float score;
};
int main()
{
int i;
student stud[5] = {
1001 ,"xiaoli",67,
1002,"xiaoho",76,
1003,"xiaohua",89,
1004,"xiaoh",78,
1005,"fygh",89
};
fstream fs("stu.dat",ios::in|ios::out|ios::binary|ios::trunc);
if(!fs)
cout<<"open error";
for(i = 0;i<5;i++)
fs.write((char*)&stud[i],sizeof(stud[i]));
student stud1[5];
for(i = 0;i < 5;i++)
{
fs.seekg(i*sizeof(stud[i]),ios::beg);
fs.read((char*)&stud1[i],sizeof(stud1[i]));
cout<<stud1[i].num<<'\t'<<stud1[i].name<<'\t'<<stud1[i].score<<endl;
}
cout<<"+++++++++++++++++++"<<endl;
stud[2].num = 1012;
strcpy(stud[2].name,"wulin");
stud[2].score = 60;
fs.seekp(2*sizeof(stud[0]),ios::beg);
fs.write((char *)&stud[2],sizeof(stud[2]));
fs.seekg(0,ios::beg);
for(i = 0;i<5;i++)
{
fs.read((char*)&stud1[i],sizeof(stud1[i]));
cout<<stud1[i].num<<'\t'<<stud1[i].name<<'\t'<<stud1[i].score<<endl;
}
return 0;
}
查看代码
五.与文件指针相关的函数
注:g 是 get 的意思,代表用于输入的函数。p 代表 put 的意思,用于输出函数。如果是既可输入又可输出的文件,则任意使用。
而参照位置有三个:ios::beg = 0,相对于文件头;ios::cur = 1,相对于当前位置;ios::end = 2,相对于文件尾。
示例代码:
fstream ifs;
ifs.open("xxx.txt",ios::in);
if(ifs == NULL)
return -1;
cout<<ifs.tellg()<<endl;
ifs.seekg(10);
cout<<ifs.tellg()<<endl;
ifs.seekg(5,ios::beg);
cout<<ifs.tellg()<<endl;
return 0;
输出分别为:0,10,5.
6.文件的关闭
在文件操作结束(即读、写完毕)时应及时调用成员函数 close()来关闭文件。该函数比较简单,没有参数和返回值。
(C/C++学习)10.C++文件流的更多相关文章
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
- C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)
多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- (C/C++学习)2.C语言中文件流操作基本函数总结
函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const cha ...
- ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作
继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...
- C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭
迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...
- C++ 学习笔记之——文件操作和文件流
1. 文件的概念 对于用户来说,常用到的文件有两大类:程序文件和数据文件.而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件和二进制文件. ASCII 文件,又称字符文件或者文本文件,它的 ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
随机推荐
- IOS怎么实现一个UITableView的下拉刷新
採用的EGORefreshTableHeaderView来实现: 在Controller上实现EGORefreshTableHeaderDelegate的delegate @property(nona ...
- IOS - UIView停止交互
UIView停止交互(失去焦点): 设置userInteractionEnabled=NO, 获取交互设置YES. 能够应用于UIButton, UITextField等交互型控件. [editBut ...
- NATS连线协议具体解释
NATS连线协议具体解释 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs NATS的连线协议是一个简单的.基于文本的公布 ...
- C# winform通过按钮上移下移 解决了datasource绑定问题
事件代码: private void btn_frmDicType_MoveUp_Click(object sender, EventArgs e) { int lstLength = this.ls ...
- 【CodeForces】166'E
166’E Tetrahedron You are given a tetrahedron. Let’s mark its vertices with letters A, B, C and D co ...
- IDEA Spark Streaming Kafka数据源-Producer
import java.util import org.apache.kafka.clients.producer.{KafkaProducer, ProducerConfig, ProducerRe ...
- shell脚本-高级变量
shell脚本-高级变量 字符串变量切片 ${#var}: 返回字符串变量var的长度 ${var:offset}: 返回字符串变量var中从第offset个字符后(不包括第offset 个字符)的字 ...
- activiti安装-------安装插件
对上面的放大
- window.onload的使用
window.onload:当页面加载的时候可以调用某些函数 例如: 1.最简单的调用方式 直接写到html的body标签里面,如: <html> <body onload=&quo ...
- 【转】关于Java基础你不得不会的34个问题
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的 ...