文件的读写(cpp)
文件的读写(cpp)
c++中要进行文件的读入,首先要包含一个头文件 fstream
。
输出到文件
为打开一个可供输出的文件需要定义一个ofstream
对象并将文件名传入:
std::ofstream out("out.txt");
在不做任何其他操作的情况下,如果该文件不存在就会创建一个相应文件,如果存在就会打开并将原来文件中的信息全部覆盖。如果想要不覆盖原文件而仅仅是在文件的末尾加上要输出的信息,只需要在定义ofstream
对象的时候传入第二个参数std::ios_base::app
以打开追加模式(append_mode):
std::ofstream out_with_append("out.txt", std::ios_base::app);
此外由于文件可能会打开失败,所以需要用if
判断文件是否打开成功。
#include <fstream>
#include <iostream>
int main () {
//输入到文件
std::ofstream out("out.txt");
if (!out) {
std::cerr << "error in out" << std::endl;
} else {
std::cerr << "successfully open out file" << std::endl;
out << "Hello world!" << std::endl;
}
std::ofstream out_with_append("out.txt", std::ios_base::app);
if (!out_with_append) {
std::cerr << "error in out_with_append" << std::endl;
} else {
std::cerr << "successfully open out_with_append file" << std::endl;
out_with_append << "Hello world again!" << std::endl;
}
return 0;
}
这其中std::endl
是事先定义好的操作符,由iostream library
提供,他的作用是插入一个换行符并清除输出缓冲区(output buffer)
的内容。
从文件中读入
要打开一个可供读入的文件,需要先定义一个ifstream
对象并将供于读入的文件传入:
std::ifstream in("out.txt");
同样的文件依然可能会无法正常打开,所以也需要用if
判断一下文件是否打开成功。
下面在上面代码的基础上增添ifstream
的功能
#include <fstream>
#include <iostream>
#include <string>
int main () {
//输出到文件
std::ofstream out("out.txt");
if (!out) {
std::cerr << "error in out" << std::endl;
} else {
std::cerr << "successfully open out file" << std::endl;
out << "Hello world!" << std::endl;
}
std::ofstream out_with_append("out.txt", std::ios_base::app);
if (!out_with_append) {
std::cerr << "error in out_with_append" << std::endl;
} else {
std::cerr << "successfully open out_with_append file" << std::endl;
out_with_append << "Hello world again!" << std::endl;
}
//从文件中读入
std::ifstream in("out.txt");
if (!in) {
std::cerr << "error in in" << std::endl;
} else {
std::cerr << "successfully open in file" << std::endl;
std::string s;
while (in >> s) {
std::cout << s;
}
}
return 0;
}
这里控制台的全部输出内容为
successfully open out file
successfully open out_with_append file
successfully open in file
Helloworld!Helloworldagain!
Process finished with exit code 0
首先注意到这里在in >> s
外面套了一层while,原因是每次读入在没有读到文件末尾的时候 in >> s会返回一个 in
,而当读到文件末尾的时候会返回false,因此可以在while
的循环表达式中作为结束的标志。
其次会发现输出的内容和输入的内容不一样,原因我引用了下面一段解释
因为istream_iterator的自增的副作用等价于相应流通过>>操作符读一个T类型的数据,而istream通过>>操作符读一个字符类型(这里就是char)的数据会跳过前面的空白字符
这里的空白字符不仅包括了空格,还包括换行符。
与ofstream
一样,ifstream
同样也有追加模式。为了以追加模式打开文件需要传入第二个参数std::ios::bash::in|std::ios::bash::app
:
std::ifstream in("out.txt", std::ios_base::in|std::ios_base::app);
这里需要注意的是以追加模式打开文件会默认在文件的末尾,如果没有重新先定位就读取文件内容,那么就会立即遇到文件结束(EOF)
的情况。seekg()
可以将in
重新定位到文件的起始处。
追加模式作用?
#include <fstream>
#include <iostream>
#include <string>
int main () {
//输出到文件
std::ofstream out("out.txt");
if (!out) {
std::cerr << "error in out" << std::endl;
} else {
std::cerr << "successfully open out file" << std::endl;
out << "Hello world!" << std::endl;
}
std::ofstream out_with_append("out.txt", std::ios_base::app);
if (!out_with_append) {
std::cerr << "error in out_with_append" << std::endl;
} else {
std::cerr << "successfully open out_with_append file" << std::endl;
out_with_append << "Hello world again!" << std::endl;
}
//从文件中读入
std::ifstream in("out.txt", std::ios_base::in|std::ios_base::app);
in.seekg(0);
if (!in) {
std::cerr << "error in in" << std::endl;
} else {
std::cerr << "successfully open in file" << std::endl;
std::string s;
while (in >> s) {
std::cout << s;
}
std::cout << std::endl;
out_with_append << "append text" << std::endl;
in >> s;
std::cout << s << std::endl;
}
return 0;
}
文件的读写(cpp)的更多相关文章
- (转)iOS学习之 plist文件的读写
在做iOS开发时,经常用到到plist文件, 那plist文件是什么呢? 它全名是:Property List,属性列表文件,它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.plist ...
- Qt对ini文件的读写
研究了以下Qt下ini文件的读写,不废话,上干货. 写入ini文件 WriteIni.cpp void WriteIni::writeSettings() { QSettings settings(& ...
- Qt对xml文件的读写
最近研究了一下qt下对xml文件的读写,小计一下,成为自己的知识. main函数调用: #include <QApplication> #include "readconfig. ...
- fopen()函数以"a+"方式打开一个不存在的文件后读写出现问题
问题:在完成课后习题的时候,使用fopen()函数以"a+"方式打开一个不存在的文件时,写入.读取出现错误: //添加用户输入单词后,在单词头加入编号,确保编号跟着前面的开始排序 ...
- QT从入门到入土(三)——文件的读写操作
引言 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能. Qt 提供了两种读写纯文本文件的基本方法: 用 QFi ...
- C#对于文件的读写
C#文件的读写操作 转载请注明出处 http://www.cnblogs.com/Huerye/ /// <summary> /// 写入txt文件 /// </summary> ...
- java filechannel大文件的读写
java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/ java 读取一个 ...
- c# txt文件的读写
在公司实习,任务不太重,总结一下c#关于txt文件的读写,以便以后有用到的时候可以查看一下.如果有写得不完整的地方还请补充 说明:本人C#水平可能初级都谈不上,高手轻喷,参考:http://www.c ...
- C++中关于文件的读写
在C++的学习过程中,我们时常要用到对文件的操作,下面我们讲一下文件的读写. 首先,读.也就是把已有的文件读到控制台上,那么如何操作呢?首先要将文件操作的输入输出流包含进去. <fstream& ...
随机推荐
- 为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
- 【Nginx】配置nginx图片服务器
想通过nginx来访问服务器上的图片 可以搭建一个nginx图片服务器. 做法如下: 先安装nginx,这里直接用yum来进行安装的 安装方法如下: https://blog.csdn.net/iml ...
- Python eval 函数用途
Python eval 函数用途: eval 函数可将字符串转换成列表,元组和字典 实例如下: 可以把list,tuple,dict和string相互转化. ##################### ...
- wmic 查看主板信息
查看主板信息的一个命令:wmic baseboard get 当然在命令提示符里查看,真的很费劲,所以我们将命令格式化一下:wmic baseboard get /format:HFORM >c ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- vue首次加载白屏过渡动画(vue优化)
过渡动画需要在index.html文件里面添加 1.css,在public.index.css创建index.css html, body, #app { height: 100%; margin: ...
- 基于Abp React前端的项目建立与运行——React框架分析
基于Abp React前端的项目建立与运行 目录 基于Abp React前端的项目建立与运行 1 Abp项目配置 2 运行WebApi后端项目 2.1 创建C3D数据库,并且将数据库对应链接字符串替换 ...
- U盘制作系统启动盘方法
1.下载一个UltralSO用来把CentOS系统镜像写入U盘作为启动安装盘 U盘用一个空U盘,会格式化的. 下载下来,使用试用版就行 刻录完成.
- Linux 下安装 JDK
JDK 依赖包: yum install glibc.i686 卸载原有的 JDK 查看本机已安装软件:rpm -qa 查看与java相关的软件:rpm -qa | grep java 删除自带软件: ...
- 跨度实际上是用来计算排位(rank) 目标节点在跳跃表中的排位 有序集 排序计算
跳跃表的实现 - Redis 设计与实现 http://redisbook.com/preview/skiplist/datastruct.html 有序集合 /* ZSETs use a speci ...