C++文件fstream的操作
用到的关于输入输出fstream流相关的知识
1.两个主要函数:read( )函数
从流中读取字符串的成员函数read
该成员函数一般形式是:read(char* pch, int nCount)
从输入流中读取nCount个字符。当输入流中的字符数小于nCount时,结束读取。经常使用read函数读取二进制数据。
write( )函数
成员函数write()输出一串字符。
该成员函数一般形式是:write(char* pch, int nCount)
其中,pch是指向字符数组的指针; nCount指明从第一个参数中复制输出字符的个数。
2. 文件的随机读写
(1)输出流随机访问函数
输出流(output)随机访问函数有seekp和tellp。
(2)输入流随机访问函数
输入流随机访问函数有seekg和tellg。
3. 获得和设置流指针(get and put stream pointers)
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。
fstream, 类似 iostream, 同时继承了get 和 put
4. 设置流指针位置
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:
ios::beg 从流开始位置计算的位移
ios::cur 从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移
流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。
由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。
对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。
- #include <fstream>
- #include <iostream>
- #include <cstring>
- using namespace std;
- int main ()
- {
- long pos;//存储写指针位置(字节)
- char array[]; //字符数组用来存放从文件中读取的字符串
- ofstream outfile; //建立输出文件流对象
- ifstream infile; //建立输入文件流对象
- outfile.open ("test.txt"); //将输出流对象与test.txt文件关联
- infile.open ("test.txt"); //将输入流对象与test.txt文件关联
- if(!outfile&&!infile)
- {
- cout<<"file error!";
- exit();
- }
- cout<<"开始写入时,写指针位置为:"<<outfile.tellp()<<endl;
- //outfile.write ("This is an apple.",sizeof("This is an apple.")-1); //参见输出流的write方法,向文件test.txt中输出字符串
- outfile.write ("This is an apple.",strlen("This is an apple.")); //参见输出流的write方法,向文件test.txt中输出字符串
- pos=outfile.tellp();//获取写入字符串后,写指针位置(与文件开始之间的字节数)
- cout<<"写入后,写指针位置为:"<<pos<<endl;
- cout<<"开始读入时,读指针位置为:"<<infile.tellg()<<endl;
- infile.getline(array,pos+); //将test.txt读取的内容存入数组array中
- cout<<"读入后,读指针位置为:"<<infile.tellg()<<endl;
- cout<<array<<endl;
- outfile.seekp (pos-);//将写指针从当前位置向后移动(文件开头位置)8个字节
- pos=outfile.tellp();//获取写指针移动后,写指针位置(与文件开始之间的字节数)
- cout<<"将当前指针向前移动8个字节后,写指针位置为:"<<outfile.tellp()<<endl;
- outfile.write (" sam",sizeof(" sam")-); //在从当前写指针位置开始写入字符串
- pos=outfile.tellp();//获取再次写入后,写指针位置(与文件开始之间的字节数)
- cout<<"再此写入后,写指针位置为:"<<pos<<endl;
- infile.seekg(,ios::beg); //读指针定位到文件开头
- cout<<"重新从文件开头读入时,读指针位置为:"<<infile.tellg()<<endl;
- outfile.seekp(,ios::end); //文件的写指针定位到文件最后
- pos=outfile.tellp();//获取写指针位置(与文件开始之间的字节数)
- cout<<"将写指针定位到文件最后位置为:"<<pos<<endl;
- infile.sync();//清除缓冲区
- infile.clear();//清除错误状态,在这个程序里,两个必须一起用,否则 达不到效果
- //以上两条语句非常重要,如果去掉,就读不进来了
- infile.getline(array,pos+); //将test.txt读取的内容存入数组array中
- cout<<"读入后,读指针位置为:"<<infile.tellg()<<endl;
- cout<<array<<endl;
- outfile.close(); //关闭文件
- infile.close(); //关闭文件
- return ;
- }
注意:由于ifstream的读入文件不正常,导致读文件指针一直不正确。
每次写入后,都自动更新当前写指针的位置。
C++文件fstream的操作的更多相关文章
- C++学习48 对ASCII文件的读写操作
如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...
- 用C++进行简单的文件I/O操作-转自VC知识库
原文请见 http://www.vckbase.com/index.php/wv/1158 序论 我曾发表过文件输入输出的文章,现在觉得有必要再写一点.文件 I/O 在C++中比烤蛋糕简单多了. 在这 ...
- 文件输入输出C++操作
基于C++的文件操作 在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 1.插入器(& ...
- c++ 文件的简单操作
文件的读取操作 在程序设计中,文件常用的操作不外乎--打开.读.写.流指针操作.关闭.我日常中使用的比较多,但从来 没有细细总结今天就总结下具体的用法. 相关概念 计算机上的文件其实是数据的集合,对文 ...
- 用 JSP 实现对文件的相关操作
前段时间一直忙着作业,实验,动手的时间真是少之又少,今天终于可以继续和大家分享关于 JSP 的学习心得. 简单总结一下吧: JSP 理论性很强,感觉就是纯语法. 我更偏向于实际编写代码,这样更容易理解 ...
- PHP文件相关的操作函数——目录操作
1.有关文件类型的函数 PHP是以UNIX的文件系统为模型的,因此在Windows系统中我们只能获得“file”.“dir”或者“unknown”三种文件类型.而在UNIX系统中,我们可以获得“blo ...
- C#对文件/目录的操作:Path、File、Directory、FileStream、StreamReader、StreamWriter等类的浅析
以下类的命名空间都是:System.I/0; 一.Path:主要对文件路径的操作! 常用方法: String path=@"C:\a\b\c\123.txt"; 1-1.Path. ...
- 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法 问题描述: 在附加数据库到sql server时,附 ...
- java io流 对文件夹的操作
java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...
随机推荐
- Beta冲刺(5/7)——2019.5.26
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(5/7)--2019.5.26 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
- Statefulset:部署有状态的多副本应用
10.1.什么是Statefulset StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API. 特点: 1.具有固定的网络标记(主机名) 2.具有持久化 ...
- commix 命令注入工具
关于系统命令注入,可以参考这篇文章:命令攻击介绍 系统命令注入场景 在对企业进行安全测试时候,很少会发现系统注入漏洞.这是因为大部分情况下代码业务主要是数据操作.文件操作.逻辑处理和api接口调用等, ...
- jmeter使用正则表达式从上一个http响应数据里提取关键字传递给下一个http请求(二)
通过jmeter从表格批量读取数据(一)(http://www.cnblogs.com/lelexiong/p/8728993.html)介绍了从表格批量读取数据,读取数据之后,如果要提取响应数据里面 ...
- mysql 的 docker image 使用(官方文档节选)
1.创建一个 mysql 实例: $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 2.创 ...
- BZOJ-1042:硬币购物(背包+容斥)
题意:硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 思路:这么老的题,居然今天才做到. ...
- python基础语法7 闭包函数与装饰器
闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) f ...
- springMVC中的日期格式的转化
一.jsp页面传递到controller的日期 如果实体类中封装的日期类型为Date,而jsp页面中的传来的为string类型,这个时候后台就会报错,出现400错误,原因是前后端的数据类型不一致.要将 ...
- HTTP协议通信过程
1. 了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器 ...
- 第2章 Spring中的Bean
2.1 Bean的配置 Bean本质是Java中的类.Spring可以被看做一个大型工厂,这个工厂的作用就是生产和管理Spring容器zho中的Bean.想在项目中使用这个工厂,就需要对Spring的 ...