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,一经查实,立即删除!

相关文章

java == 如何避免空指针异常

package com.zjxnjz.mall;public class Test {public static void main(String[] args) {}public static void test1(){//变量不为null 与null比较的时候不会报空指针异常Integer a1;if(nulla) {} }public static void test1(){//变量为null 与不为null比较的时候会报空指针异…

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…

eclipse中git解决冲突

https://www.cnblogs.com/haimishasha/p/5980416.html

C++如何产生随机数

转载自** https://www.cnblogs.com/ql698214/p/5424937.html ** 一、使用rand()函数 头文件<stdlib.h> (1) 如果你只要产生随机数而不需要设定范围的话&#xff0c;你只要用rand()就可以了&#xff1a;rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在s…

Leetcode016 3Sum Closest

public class S016 {//借鉴S015的思想&#xff0c;只是稍微有点慢public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int result nums[0]nums[1]nums[nums.length-1];for(int i 0;i<nums.length;i){if(i>0&&nums[i]nums[i-1])continue;in…

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

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

优知学院

http://youzhixueyuan.com/single-architecture-soa-micro-service-differentiation.html

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

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

POJ1155 TELE(树形DP)

题目是说给一棵树&#xff0c;叶子结点有负权&#xff0c;边有正权&#xff0c;问最多能选多少个叶子结点&#xff0c;使从叶子到根的权值和小于等于0。 考虑数据规模表示出状态&#xff1a;dp[u][k]表示在u结点为根的子树中选择k个叶子结点的最小权值 最后就从d[1][k]中找满足…

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

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

margin和padding的区别

https://www.cnblogs.com/zxnn/p/8186225.html

前端学习(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; 参考完整图文教程 --》生成证书公钥文件 --》系统应用程序-使用工具-钥匙串访问--》证书助理--》从证书颁发机构请求证书--》默认选项--》存到磁盘--》继续--》生成CertificateSigningRequest.certSigningRequest公钥文件--》生成开发证书 --》开发者管理…

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

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

JAVA高并发秒杀系统构建之——高并发优化分析

https://blog.csdn.net/yd201430320529/article/details/70544203

CSS中的text-shadow。

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