c++ ofstream 文件不存在_C++文件读写详解(ofstream,ifstream,fstream)
这里主要是讨论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)相关推荐
- [转载] C++文件读写详解(ofstream,ifstream,fstream)
[转载] C++文件读写详解(ofstream,ifstream,fstream) 注:转载文章,侵删 来源:C++文件读写详解(ofstream,ifstream,fstream) 作者:CSDN博 ...
- C++文件操作详解(ifstream、ofstream、fstream)【笔记本】
C++文件操作详解(ifstream.ofstream.fstream) C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifst ...
- python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...
文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- java中属性文件读取案例_java相关:Spring中属性文件properties的读取与使用详解
java相关:Spring中属性文件properties的读取与使用详解 发布于 2020-6-3| 复制链接 摘记: Spring中属性文件properties的读取与使用详解实际项目中,通常将一些 ...
- c++中.dll与.lib文件的生成与使用的详解
c++中.dll与.lib文件的生成与使用的详解 --------------------------------------------------------------------------- ...
- python中with open写csv文件_Python中的CSV文件使用with语句的方式详解
是否可以直接使用with语句与CSV文件?能够做这样的事情似乎很自然: import csv with csv.reader(open("myfile.csv")) as read ...
- java 输入流可以合并吗_Java 使用IO流实现大文件的分割与合并实例详解
java 使用IO流实现大文件的分割与合并 文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时 ...
- python读取大文件csv_对python中大文件的导入与导出方法详解
1.csv文件的导入和导出 通过一个矩阵导出为csv文件,将csv文件导入为矩阵 将csv文件导入到一个矩阵中 import numpy my_matrix = numpy.loadtxt(open( ...
- android 7 apk 安装程序,Android安装apk文件并适配Android 7.0详解
Android安装apk文件并适配Android 7.0详解 首先在AndroidManifest.xml文件,activity同级节点注册provider: android:name="a ...
最新文章
- static用法总结
- 关于win7_iis报500.19和500.21错误的解决方法
- 将CSDN600W用户及密码帐号存入本地MySql数据库
- sql distinct多个字段_数据分析|记一“道”难忘的SQL面试题...
- linux_base-f10-10_7 linuxulator is not (kld)loaded
- Android中的动画有哪几类?各自的特点和区别是什么?
- TTTTTTTTTTDDDDDDDD原来是这样。。。。。。。。。。的
- fop生成pdf的中文乱码问题
- 从零到一学Mycat:入门及配置文件详解
- focus和onfocus区别
- python计算学习,《统计学习方法》的Python实现:(1)感知机
- vue2+element ui 导入和导出后端传过来的文件
- python + 余 +=加号与 加等的区别
- 不讲周期长短不足以谈牛熊
- android 手机强制关机代码,安卓手机如何强制关机?安卓手机强制关机方法[多图]...
- 1602液晶显示简易计算器
- Qt容器:QList
- select下拉选项禁用
- 未授予用户在此计算机上的请求登录类型 登录失败的解决方案
- 2012 Android手机市场趋势大胆猜想
热门文章
- “多规合一”下的改革红利,详解国内10大城市的城市更新实践与创新
- C# Ping 简单使用
- 编译原理SNL语言编译器实验报告
- [Tensorflow]服装图像数据集分类:使用DNN、CNN模型
- Delphi 2021年计划拓展开源社区合作、重返Delphi教学领域并为Delphi支持Python低代码开发平台(LCDP)发展Delphi生态系统
- flask实战之问答平台(参考b站视频)
- 西班牙专线物流有哪些运输方式 西班牙专线物流有哪些优点和缺点
- 【全文】狼叔:如何正确的学习Node.js 1
- MySQL中tinytext、text、mediumtext和longtext详解
- 本周AI热点回顾:30行代码,让27吨发电机原地爆炸;Photoshop把AI论文demo打包实现了;2块钱就能买上千张人脸照片