C++学习笔记之对文件的操作1

转载自**

https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html

**
=前言=

我们在编写程序的时候,最密不可分的就是对文件进行相应的操作,我们可以从文件中读取数据,可以将数据保存到文件,可以……

总而言之,言而总之,一言以蔽之,对文件的操作是非常重要的,下面我们就来介绍一下C++中是如何对文件进行操作的。

=功能展示=

文件的输出操作
想要程序中的数据输出到文件中,一共需要以下5个步骤:

① 包含fstream头文件:#include

② 建立ofstream对象:ofstream ocout;

③ 将对象与文件关联:ocout.open(“test.txt”);

④ 使用该对象将数据输出到文件test中:ocout<<”Hello,C++!”;

⑤ 关闭与文件的连接:ocout.close();

  p.s. 在这里我们应用ofstream的对象ocout将数据直接输出到了文件中,而不是屏幕上!

完整程序示例:

1
2
3
4
5
6
7
8
9
10
11

 #include <fstream>using namespace std;int main(){ofstream ocout;ocout.open("test.txt");ocout<<"Hello,C++!";ocout.close();return 0;}

运行程序后,我们就会在程序的目录下发现一个test.txt文件,打开之后会显示“Hello,C++!”。如下图所示
在这里插入图片描述

特别注意的是,我们也可以把上面程序的第6和第7行合并为一句话:

ofstream ocout("test.txt");

这句话的意思就是调用ofstream类中的构造函数来创建这个文本文件。另外,我们需要特别注意一点,在完成对整个文件的操作之后,一定要用close()函数将这个文件关闭了,否则在程序结束后,所操作的文件将什么都不会保存下来!!!

读取文件中的数据
打开文件读取数据的方法和输出数据到文集中的方法基本上是一样的,同样也需要5个步骤:

① 包含fstream头文件:#include

② 建立ifstream对象:ifstream icin;

③ 将对象与文件关联:icin.open(“test.txt”);

④ 使用该对象读取文件test中的数据到数组temp中:icin>>temp;

⑤ 关闭与文件的连接:icin.close();

p.s同上面一样,我们也可以将第2步和第3步合并成一句话:

ifstream icin("test.txt");

它的作用就是调用ifstream类中的构造函数来读取这个本地的文本文件。

完整的程序示例:

#include <fstream>
#include <iostream>
using namespace std;int main()
{ifstream icin;icin.open("test.txt");char temp[100];//定义一个字符数组tempicin>>temp;//将文件中的数据读到字符数组temp中cout<<temp<<endl;//将temp中存放的内容输出到屏幕上return 0;
}

运行之前,我们需要在该文件夹下建立test.txt文件,其中的内容就是上面的“Hello,C++!”。那么输出如下:

在这里插入图片描述

可以看到,程序在命令行中显示出来了test.txt文本文件中的内容。

如何读取空格和空格后面的字符  
我们在写文件的时候,空格是不可避免的。但是由于C++的插入操作符有一个毛病,它只要一遇到空字符便会停止输出。这里的空字符就是空格,或者是’\0’。那么这样一来,如果我们在文件中有空格字符,那么空格后面的字符就无法被输出到屏幕上了。比如说,我们建立的test.txt文件中的内容为:Hello C++!即把Hello后面的逗号改成空格,那么重新运行该程序,输出如下:

在这里插入图片描述

那么有没有什么解决方法呢,当然是有的哈。用getline()函数嘛。下面粘一段MSDN上面关于getline()函数原型和参数的介绍哈:

首先是函数原型:

template<class CharType, class Traits, class Allocator>basic_istream<CharType, Traits>& getline(basic_istream<CharType, Traits>& _Istr,basic_string<CharType, Traits, Allocator>& _Str
);template<class CharType, class Traits, class Allocator>basic_istream<CharType, Traits>& getline(basic_istream<CharType, Traits>& _Istr,basic_string<CharType, Traits, Allocator>& _Str,const CharType _Delim
); 

函数中的参数已经用黑体表示出来了哈,下面是参数说明:

复制代码
_Istr
The input stream from which a string is to be extracted.
指明输出的缓冲区是谁

_Str
The string into which are read the characters from the input stream.
读取到流中的字符数据

_Delim
The line delimiter.
结束符号
(默认的结束符号是’\n’,而这里采用自定义的结束符号替换掉默认的结束符号。意思就是输出遇到_Delim才会停止输出)
复制代码
好了,有了这个函数,我们就可以把上面的程序中的第10行改成:

icin.getline(temp,100);
这就表示把字符数组temp中的内容全部读取到屏幕上,如下图所示

在这里插入图片描述

OK~~这样一来,我们就不怕文件中有空格了。

另外,如果我们想要在命令行中写一段话,而且这段换中包含了空格和回车,那么我们就应该利用上面getline()函数的第三个参数,因为一段话中有可能会有回车的出现,我们就必须利用getline()的第三个函数将默认的结束符号’\n’换成空字符‘\0’。这是由于空字符的ASCII码为0,我们不可能在文件中输入空字符,因此这个时候,getline()函数会一直读取到文件的末尾才会结束。而如何停止用户输入呢?方法其实很简单,在我们输入完一段话之后,肯定会按下回车。之后我们就应该向该函数发出EOF标志,即文件结束符标志(End Of File)。在命令行里面发送文件结束符的方法是“Ctrl+Z”,之后再次按下回车键就能停止输入了。
p.s. 空格不是空字符,它的ASCII码为32。

下面,咱们用一个实际的例子来演示一下:首先读取一段话,然后将其输出到文件中:

#include <iostream>
#include <fstream>
using namespace std;int main()
{const int num=255;char temp1[num]={0};//初始化数组temp1char temp2[num]={0};//初始化数组temp2//① 输出数据到文件text.txt中ofstream f_out("text.txt");cout<<"请输入文本的内容:\n";cin.getline(temp1,num,0);f_out<<temp1;f_out.close();//② 将文件text.txt中的内容重新读回屏幕上ifstream f_in("text.txt");f_in.getline(temp2,num,0);cout<<temp2<<endl;return 0;
}

对整个程序的分析:

① 输出数据到文件text.txt中
首先我们在第11行定义了一个文件的输出流对象f_out,并用该对象创建了一个text.txt文本文件。之后在程序的第13行采用getline()函数接受文本内容,并将其放到temp1字符数组中。注意,这里的getline()函数的第三个参数为空字符,说明它可以接受空格,并且只有达到文件的末尾才能停止读取用户的键盘输入。好了,如果我们输入完文件之后按下Ctrl+Z,那么接着再次按下Enter回车键就会停止输入。之后在程序的第14行,我们用ofstream的对象fout将缓冲区中的内容输出到文本文件text.txt中。最后关闭这个文件。
② 将文件text.txt中的内容重新读回屏幕上
同输出一样,首先我们在程序的第17行定义了一个文件的输入流对象f_in,并用该对象读取了刚刚创建的text.txt文本文件。之后又调用getlin()函数将文件中的内容输出到了字符数组temp2中,之后运用cout来输出temp2数组的内容到屏幕上。这样一来,我们就完成了对文件的输入输出操作。

其运行的结果如下:

在这里插入图片描述

OK啦!!!程序输出成功咯!!但是这个程序还有一个小小的瑕疵,注意看上面输出结果,我们可以看到在命令行中“请按任意键继续…”上面居然还有一个回车!这是怎么回事呢?我们并没有在多输出一个回车啊?

其实是有的!!!!注意,我们在“!”之后回了一次车,然后才输出了ctrl+Z,向getline()函数发送了一个文件结束的标志。之后为了让程序结束,又按了一下回车。那么这里面第2次按下的回车由于超出了文件结束符EOF被自动抛弃了,但是,第一次按下的回车,就是!之后的那个回车却没有被丢弃掉,而是被写入了temp1函数中。这个就是问题的所在。所以我们在输出之后,会看到在“请按任意键继续…”上面居然还有一个回车!对于这个问题,解决方法其实很简单,我们只需要把最后一个Enter改成空字符’\0’就可以了。即在程序的13行之后添加上这样两句话:

int n=strlen(temp1);
temp1[n-1]='\0';第一句话的意思就是读取字符数组temp1中可见字符的长度,并保存到整型变量n中;第二句话的意思就是找到保存Enter键的元素的下标,然后将这个下标的元素赋值成空字符就可以了。完整的程序如下:#include <iostream>
#include <fstream>
using namespace std;int main()
{const int num=255;char temp1[num]={0};//初始化数组temp1char temp2[num]={0};//初始化数组temp2//① 输出数据到文件text.txt中ofstream f_out("text.txt");cout<<"请输入文本的内容:\n";cin.getline(temp1,num,0);int n=strlen(temp1);temp1[n-1]='\0';f_out<<temp1;f_out.close();//② 将文件text.txt中的内容重新读回屏幕上ifstream f_in("text.txt");f_in.getline(temp2,num,0);cout<<temp2<<endl;return 0;
}

然后是程序的输出:

在这里插入图片描述

好了,终于把这个程序搞定了,好麻烦!!!呼呼~~

这篇博文就记录这么多了,下次接着学习关于C++对文件的操作的方法,_

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记之对文件的操作2

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126680.html ** 什么都不说了&#xff0c;继续《C学习笔记之对文件的操作<1>》的内容… 功能展示 打开文件的方式 当我们想要打开的文件不存在的时候&#xff0c;一般地&#xff0c;ofstream类的对象…

前端学习(1802):前端调试之事件伪类练习

index.html <!DOCTYPE html> <html lang"en"><head> <!--系统内置 start--> <script type"text/javascript"></script> <!--系统内置 end--><meta charset"UTF-8"><title>练习</titl…

前端学习(1809):前端调试之微博头部开发

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>微博实战--head&l…

数据结构实验四 排序算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416&#xff09; 2019年6月4日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验四 排序算法 指导老…

数据结构实验五 查找算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416B&#xff09; 2019年6月11日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验五 查找算法 指导…

前端学习(1811):前端调试之css装饰cursor练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构实验六 综合数据处理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416A&#xff09; 2019年6月14日 学院 计算机科学与教育软件学院 年级、专业、班 计算机大类 144班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验六…

CSS中的text-shadow。

text-shadow&#xff08;文字投影&#xff09;&#xff0c;box-shadow&#xff08;容器投影&#xff09;&#xff0c;border-radius&#xff08;圆角&#xff09;这三个属性估计以后用的比较多&#xff0c;记录 一下。目前不支持IE系列&#xff08;不过可以使用其他方法实现&am…

前端学习(1803):前端调试之事件伪类练习二

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构课程设计 神秘国度的爱情故事

数据结构 课程设计报告 广州大学 计算机科学与网络工程学院 计算机系 17级计科专业2班 2019年6月30日 广州大学学生实验报告 开课学院及实验室&#xff1a;计算机科学与工程实验室 2019年07月01日 学院 计算机科学与网络工程学院 年级/专业/班 计科1…

前端学习(1805):前端调试之列表伪类练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

Android中的一些基础知识(二)

这几天在回顾Android的基础知识&#xff0c;就把一些常见的知识点整理一下&#xff0c;以后忘了也可以翻出来看一看。 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细&#xff0c;这里我只是翻译了一下。 onCreate&#xff1a;当Activity第一次…

关于Open browser failed!! Please check if you have installed the browser chrome correctly!错误的一种解决方法

新建一个文件夹&#xff0c;再在新建的文件夹里写html文件&#xff0c;再用快捷键&#xff1a;altb打开即可。

前端学习(1806):前端调试之列表伪类练习二

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

虚拟机安装

带你解密Linux的【Vm】-CSDN博客https://blog.csdn.net/lz17267861157/article/details/134031133

推荐开发工具系列之--LinrF5(自动刷新)

最近有点事&#xff1b;略忙&#xff1b;以至于上篇文章说好的明天一直到了今天才到&#xff1b; //*******************************分割是会呼吸的痛****************************** 作为一个程序员&#xff1b;尤其是作为一个网站开发程序员&#xff1b;如果再更尤其点作为一…