我们在编写程序的时候,最密不可分的就是对文件进行相应的操作,我们可以从文件中读取数据,可以将数据保存到文件,可以……
总而言之,言而总之,一言以蔽之,对文件的操作是非常重要的,下面我们就来介绍一下C++中是如何对文件进行操作的。
===========================功能展示===========================
- 文件的输出操作
① 包含fstream头文件:#include
② 建立ofstream对象:ofstream ocout;
③ 将对象与文件关联:ocout.open(“test.txt”);
④ 使用该对象将数据输出到文件test中:ocout<<”Hello,C++!”;
⑤ 关闭与文件的连接:ocout.close();
p.s. 在这里我们应用ofstream的对象ocout将数据直接输出到了文件中,而不是屏幕上!
完整程序示例:
#include
运行程序后,我们就会在程序的目录下发现一个test.txt文件,打开之后会显示“Hello,C++!”。如下图所示
特别注意的是,我们也可以把上面程序的第6和第7行合并为一句话:
ofstream ocout("test.txt");
这句话的意思就是调用ofstream类中的构造函数来创建这个文本文件。另外,我们需要特别注意一点,在完成对整个文件的操作之后,一定要用close()函数将这个文件关闭了,否则在程序结束后,所操作的文件将什么都不会保存下来!!!
- 读取文件中的数据
① 包含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
可以看到,程序在命令行中显示出来了test.txt文本文件中的内容。
- 如何读取空格和空格后面的字符
那么有没有什么解决方法呢,当然是有的哈。用getline()函数嘛。下面粘一段MSDN上面关于getline()函数原型和参数的介绍哈:
首先是函数原型:
template
函数中的参数已经用黑体表示出来了哈,下面是参数说明:
_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
其运行的结果如下:
OK啦!!!程序输出成功咯!!但是这个程序还有一个小小的瑕疵,注意看上面输出结果,我们可以看到在命令行中“请按任意键继续…”上面居然还有一个回车!这是怎么回事呢?我们并没有在多输出一个回车啊?
其实是有的!!!!注意,我们在“!”之后回了一次车,然后才输出了ctrl+Z,向getline()函数发送了一个文件结束的标志。之后为了让程序结束,又按了一下回车。那么这里面第2次按下的回车由于超出了文件结束符EOF被自动抛弃了,但是,第一次按下的回车,就是!之后的那个回车却没有被丢弃掉,而是被写入了temp1函数中。这个就是问题的所在。所以我们在输出之后,会看到在“请按任意键继续…”上面居然还有一个回车!对于这个问题,解决方法其实很简单,我们只需要把最后一个Enter改成空字符’\0’就可以了。即在程序的13行之后添加上这样两句话:
int n=strlen(temp1); temp1[n-1]='\0';
第一句话的意思就是读取字符数组temp1中可见字符的长度,并保存到整型变量n中;第二句话的意思就是找到保存Enter键的元素的下标,然后将这个下标的元素赋值成空字符就可以了。完整的程序如下:
#include
好了,终于把这个程序搞定了,好麻烦!!!呼呼~~
这篇博文就记录这么多了,下次接着学习关于C++对文件的操作的方法,^_^
最新评论