说明: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++文件流的更多相关文章

  1. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  2. C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)

    多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...

  3. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  4. (C/C++学习)2.C语言中文件流操作基本函数总结

    函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const cha ...

  5. ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作

    继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...

  6. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  7. C++ 学习笔记之——文件操作和文件流

    1. 文件的概念 对于用户来说,常用到的文件有两大类:程序文件和数据文件.而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件和二进制文件. ASCII 文件,又称字符文件或者文本文件,它的 ...

  8. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  9. 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有相关 ...

随机推荐

  1. bzoj 3993 星际战争

    题目大意: X军团和Y军团正在激烈地作战  在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai 当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机 ...

  2. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  3. 简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列

    最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码: #include<iostream> #include<cstdio& ...

  4. mysql中 groupby分组

    引用自http://www.cnblogs.com/mo-beifeng/archive/2012/02/07/2341886.html#2341105 --按某一字段分组取最大(小)值所在行的数据 ...

  5. [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. [Swift通天遁地]九、拔剑吧-(16)搭建卡片页面:Card Peek/Pop动态切换界面

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. vue-video-player视频播放插件

    安装依赖 npm install vue-video-player -S 引入配置 //main.js import 'video.js/dist/video-js.css' import 'vue- ...

  8. Golang 入门 : goroutine(协程)

    在操作系统中,执行体是个抽象的概念.与之对应的实体有进程.线程以及协程(coroutine).协程也叫轻量级的线程,与传统的进程和线程相比,协程的最大特点是 "轻"!可以轻松创建上 ...

  9. pip使用豆瓣镜像源

    pip使用豆瓣的镜像源 豆瓣镜像地址: https://pypi.douban.com/simple/ 虽然用easy_install和pip来安装第三方库很方便 他们的原理其实就是从Python的官 ...

  10. [转]linux之pr命令

    转自:http://www.bitscn.com/plus/view.php?aid=6638 本文介绍如何使用Linux的pr命令将大文件分割成多个页面进行打印,并在每个页面上加上标题. Linux ...