这里主要是讨论fstream的内容:html

1 #include

2 ofstream //文件写操做 内存写入存储设备

3 ifstream //文件读操做,存储设备读区到内存中

4 fstream //读写操做,对打开的文件可进行读写操做

一、打开文件

在fstream类中,成员函数open()实现打开文件的操做,从而将数据流和文件进行关联,经过ofstream,ifstream,fstream对象进行对文件的读写操做 ios

函数:open()缓存

1 public member function

2

3 void open ( const char * filename,

4 ios_base::openmode mode = ios_base::in | ios_base::out );

5

6 void open(const wchar_t *_Filename,

7 ios_base::openmode mode= ios_base::in | ios_base::out,

8 int prot = ios_base::_Openprot);

9 /*

10 参数:filename 操做文件名

11 mode 打开文件的方式

12 prot 打开文件的属性 //基本不多用到,在查看资料时,发现有两种方式

13

14 */

打开文件的方式在IOS类(流式I/O的基类)中定义,有以下几种方式: app

ios::in

为输入(读)而打开文件,文件不存在则建立(ifstream)默认的打开方式 函数

ios::out url

为输出(写)而打开文件,文件不存在则建立,若文件已存在则清空原内容 spa

(ofstream默认的打开方式) .net

ios::ate

文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用 设计

ios::app 3d

供写使用,文件不存在则建立,若文件已存在则在原文件内容后写入新的内容,

指针位置总在最后

ios::trunc

在读写前,先将文件长度截断为0(默认)

ios::nocreate

文件不存在时产生错误,常和in或app联合使用

ios::noreplace

文件存在时产生错误,常和out联合使用

ios::binary

二进制格式文件

这些方式是可以以“或”运算(“|”)的方式进行组合使用。

文件保护方式选择项

filebuf::openprot

默认的兼容共享方式

filebuf::sh_none

独占,不共享

filebuf::sh_read

读共享

filebuf::sh_write

写共享

不少程序中,可能会碰到ofstream out("Hello.txt"), ifstream in("..."),fstream foi("...")这样的的使用,并无显式的去调用open()函数就进行文件的操做,直接调用了其默认的打开方式,由于在stream类的构造函数中调用了open()函数,并拥有一样的构造函数,因此在这里能够直接使用流对象进行文件的操做,默认方式以下:

1 ofstream out("...", ios::out);

2 ifstream in("...", ios::in);

3 fstream foi("...", ios::in|ios::out);

2.关闭文件

当文件读写操做完成以后,咱们必须将文件关闭以使文件从新变为可访问的。成员函数close(),它负责将缓存中的数据排放出来并关闭文件,这个函数一旦被调用,原先的流对象就能够被用来打开其它的文件,这个文件也就能够从新被其它的进程所访问。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。

3.文本文件的读写

类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引伸而来的。这就是为何 fstream 的对象可使用其父类的成员来访问数据。通常来讲,咱们将使用这些类与同控制台(console)交互一样的成员函数(cin 和 cout)来进行输入输出。以下面的程序所示,咱们使用重载的插入操做符<>:

1 #include "iostream"

2 #include

3 using namespace std;

4 void main()

5 {

6 fstream f("d:\\try.txt", ios::out);//供写使用,文件不存在则建立,存在则清空原内容

7 f << 1234 << ' ' << 3.14 << 'A' << "How are you"; //写入数据

8 f.close();//关闭文件以使其从新变为可访问,函数一旦调用,原先的流对象就能够被用来打开其它的文件

9 f.open("d:\\try.txt", ios::in);//打开文件,供读

10 int i;

11 double d;

12 char c;

13 char s[20];

14 f >> i >> d >> c; //读取数据

15 f.getline(s, 20);

16 cout << i << endl; //显示各数据

17 cout << d << endl;

18 cout << c << endl;

19 cout << s << endl;

20 f.close();

21 }

状态标志符的验证(Verification of state flags)

bad()

若是在读写过程当中出错,返回 true 。例如:当咱们要对一个不是打开为写状态的文件进行写入时,或者咱们要写入的设备没有剩余空间的时候。

fail()

除了与bad() 一样的状况下会返回 true 之外,加上格式错误时也返回true ,例如当想要读入一个整数,而得到了一个字母的时候。

eof()

若是读文件到达文件末尾,返回true。

good()

这是最通用的:若是调用以上任何一个函数返回true 的话,此函数返回 false 。

要想重置以上成员函数所检查的状态标志,你可使用成员函数clear(),没有参数。

得到和设置流指针(get and put stream pointers)

全部输入/输出流对象(i/o streams objects)都有至少一个流指针:

ifstream, 相似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。

ofstream, 相似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。

fstream, 相似 iostream, 同时继承了get 和 put

tellg() 和 tellp()

这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,表明当前读出流get指针的位置 (用tellg) 或写入流put指针的位置(用tellp)。

seekg() 和seekp()

这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不一样的原型:

(一)

1 seekg ( pos_type position );

2 seekp ( pos_type position );

3 /*

4 使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。

5 */

(二)

1 seekg ( off_type offset, seekdir direction );

2 seekp ( off_type offset, seekdir direction );

3 /*

4 该原型有两个参数:第一个参数是偏移量,

5 第二个参数是基地址。它能够是:

6 ios::beg 从流开始位置计算的位移

7 ios::cur 从流指针当前位置开始计算的位移

8 ios::end 从流末尾处开始计算的位移

9 */

流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不一样的,由于文本模式的文件中某些特殊字符可能被修改。因为这个缘由,建议对以文本文件模式打开的文件老是使用seekg 和 seekp的第一种原型,并且不要对tellg 或 tellp 的返回值进行修改。对二进制文件,你能够任意使用这些函数,应该不会有任何意外的行为产生。

如下程序使用这些函数来得到一个二进制文件的大小:

// obtaining file size

#include

#include

using namespace std;

const char * filename = "test.txt";

int main () {

long l,m;

ifstream in(filename, ios::in|ios::binary);

l = in.tellg(); //当前get流指针的位置

in.seekg (0, ios::end); //基地址为文件结束处,偏移地址为0,因而指针定位在文件结束处

m = in.tellg(); //再次获取当前get流指针的位置

in.close();

cout << "size of " << filename;

cout << " is " << (m-l) << " bytes.\n";

return 0;

}

//结果:

size of example.txt is 2422 bytes.

4.二进制文件

在二进制文件中,使用<< 和>>,以及函数(如getline)来操做符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。

文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:

1 write ( char * buffer, streamsize size ); 2 read ( char * buffer, streamsize size );

这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。

1 // reading binary file

2 #include

3 #include

4 using namespace std;

5

6 const char * filename = "test.txt";

7

8 int main() {

9 char * buffer;

10 long size;

11 ifstream in(filename, ios::in | ios::binary | ios::ate);

12 size = in.tellg();

13 in.seekg(0, ios::beg);

14 buffer = new char[size];

15 in.read(buffer, size);

16 in.close();

17 for (int i = 0; i < size; i++)

18 {

19 if (buffer[i] != '\0')

20 cout << buffer[i];

21 }

22 cout << endl;

23 delete[] buffer;

24 return 0;

25 }

26 /*

27 运行结果:

28 This is test!

29 My name is Mengmeng

30 */

5.逐行读取写入txt文件

写入:

1 #include

2 #include

3 using namespace std;

4 void main()

5 {

6 ofstream in;

7 in.open("com.txt",ios::trunc); //ios::trunc表示在打开文件前将文件清空,因为是写入,文件不存在则建立

8 int i;

9 char a='a';

10 for(i=1;i<=26;i++)//将26个数字及英文字母写入文件

11 {

12 if(i<10)

13 {

14 in<

15 a++;

16 }

17 else

18 {

19 in<

20 a++;

21 }

22 }

23 in.close();//关闭文件

24 }

25

26 /*

27 运行结果:

28 01 a

29 02 b

30 03 c

31 04 d

32 05 e

33 06 f

34 07 g

35 08 h

36 09 i

37 10 j

38 11 k

39 12 l

40 13 m

41 14 n

42 15 o

43 16 p

44 17 q

45 18 r

46 19 s

47 20 t

48 21 u

49 22 v

50 23 w

51 24 x

52 25 y

53 26 z

54 */

读出:

//第一种方法:

#include

#include

#include

using namespace std;

void main()

{

ifstream in("com.txt");

string s;

while (getline(in, s))//逐行读取数据并存于s中,直至数据所有读取

cout << s.c_str() << endl;

}

/*

getline函数是头文件string中定义的函数,包含两个参数:一是文件流的对象,二是获取后存放的变量

*/

//第二种方法:

#include

#include

using namespace std;

void main()

{

char buffer[256];

fstream out;

out.open("com.txt", ios::in| ios::binary);

cout << "com.txt" << " 的内容以下:" << endl;

while (!out.eof())

{

out.getline(buffer, 256, '\n');//getline(char *,int,char) 表示该行字符达到256个或遇到换行就结束

cout << buffer << endl;

}

out.close();

}

/*

getline函数是istream头文件中定义的函数,它包含三个参数:一是存放的指针名称;

二是size,代表每行的最大长度,代表当该行字符达到最大长度时结束

三是结束的标志,即读取每一行时,遇到哪一个标志结束,而该标志后面的内容看成下一行来读取。

*/

/*

运行结果:

com.txt的内容以下:

01 a

02 b

03 c

04 d

05 e

06 f

07 g

08 h

09 i

10 j

11 k

12 l

13 m

14 n

15 o

16 p

17 q

18 r

19 s

20 t

21 u

22 v

23 w

24 x

25 y

26 z

*/

c++ ofstream 文件不存在_C++文件读写详解(ofstream,ifstream,fstream)相关推荐

  1. [转载] C++文件读写详解(ofstream,ifstream,fstream)

    [转载] C++文件读写详解(ofstream,ifstream,fstream) 注:转载文章,侵删 来源:C++文件读写详解(ofstream,ifstream,fstream) 作者:CSDN博 ...

  2. C++文件操作详解(ifstream、ofstream、fstream)【笔记本】

    C++文件操作详解(ifstream.ofstream.fstream) C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifst ...

  3. python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...

    文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...

  4. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  5. java中属性文件读取案例_java相关:Spring中属性文件properties的读取与使用详解

    java相关:Spring中属性文件properties的读取与使用详解 发布于 2020-6-3| 复制链接 摘记: Spring中属性文件properties的读取与使用详解实际项目中,通常将一些 ...

  6. c++中.dll与.lib文件的生成与使用的详解

    c++中.dll与.lib文件的生成与使用的详解 --------------------------------------------------------------------------- ...

  7. python中with open写csv文件_Python中的CSV文件使用with语句的方式详解

    是否可以直接使用with语句与CSV文件?能够做这样的事情似乎很自然: import csv with csv.reader(open("myfile.csv")) as read ...

  8. java 输入流可以合并吗_Java 使用IO流实现大文件的分割与合并实例详解

    java 使用IO流实现大文件的分割与合并 文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时 ...

  9. python读取大文件csv_对python中大文件的导入与导出方法详解

    1.csv文件的导入和导出 通过一个矩阵导出为csv文件,将csv文件导入为矩阵 将csv文件导入到一个矩阵中 import numpy my_matrix = numpy.loadtxt(open( ...

  10. android 7 apk 安装程序,Android安装apk文件并适配Android 7.0详解

    Android安装apk文件并适配Android 7.0详解 首先在AndroidManifest.xml文件,activity同级节点注册provider: android:name="a ...

最新文章

  1. static用法总结
  2. 关于win7_iis报500.19和500.21错误的解决方法
  3. 将CSDN600W用户及密码帐号存入本地MySql数据库
  4. sql distinct多个字段_数据分析|记一“道”难忘的SQL面试题...
  5. linux_base-f10-10_7 linuxulator is not (kld)loaded
  6. Android中的动画有哪几类?各自的特点和区别是什么?
  7. TTTTTTTTTTDDDDDDDD原来是这样。。。。。。。。。。的
  8. fop生成pdf的中文乱码问题
  9. 从零到一学Mycat:入门及配置文件详解
  10. focus和onfocus区别
  11. python计算学习,《统计学习方法》的Python实现:(1)感知机
  12. vue2+element ui 导入和导出后端传过来的文件
  13. python + 余 +=加号与 加等的区别
  14. 不讲周期长短不足以谈牛熊
  15. android 手机强制关机代码,安卓手机如何强制关机?安卓手机强制关机方法[多图]...
  16. 1602液晶显示简易计算器
  17. Qt容器:QList
  18. select下拉选项禁用
  19. 未授予用户在此计算机上的请求登录类型 登录失败的解决方案
  20. 2012 Android手机市场趋势大胆猜想

热门文章

  1. “多规合一”下的改革红利,详解国内10大城市的城市更新实践与创新
  2. C# Ping 简单使用
  3. 编译原理SNL语言编译器实验报告
  4. [Tensorflow]服装图像数据集分类:使用DNN、CNN模型
  5. Delphi 2021年计划拓展开源社区合作、重返Delphi教学领域并为Delphi支持Python低代码开发平台(LCDP)发展Delphi生态系统
  6. flask实战之问答平台(参考b站视频)
  7. 西班牙专线物流有哪些运输方式 西班牙专线物流有哪些优点和缺点
  8. 【全文】狼叔:如何正确的学习Node.js 1
  9. MySQL中tinytext、text、mediumtext和longtext详解
  10. 本周AI热点回顾:30行代码,让27吨发电机原地爆炸;Photoshop把AI论文demo打包实现了;2块钱就能买上千张人脸照片