C++文件操作

这里只涉及到了C/C++中的一种再文件中输入的方法
因为自己比较懒,遇到的文件问题也比较少,就找了一个简单用的

freopen函数

相关的描述

简单来说就是freopen函数可以将本来要输出到终端(Shell、黑色的窗口)的东西输入到文件中(专业点就是重定向输入输出流),更专业点的我就不太清楚了,感兴趣可以查查具体的定义。
它定义在 C的标准库 stdio.h 中,使用时记得引入头文件 <stdio.h>废话
C++中记得引入 <cstdio>有点用o(〃'▽'〃)o

相应的声明

函数的声明:
FILE   freopen(const  char   filename, const  char   mode, FILE   stream)
相应的参数

filename
mod访
stream

mod一般如下:

r 打开一个用于读取的文件,且文件必须存在,没有的话要先创建
w 创建一个用于写入的文件,如果文件存在则会删除旧的文件的内容再输入
a 向文件的末尾追加数据,如果文件不存在就会先创建一个,追加的位置从上一次光标的位置开始,注意换行
r+ 打开一个用于读取和写入的文件,文件必须先存在,注意下逻辑的关系、写入和读取的顺序,写入是覆盖的
w+ 创建一个用于读取和写入的文件,如果文件存在则会删除旧的文件的内容,同样注意写入和读取的顺序
a+ 打开一个用于读取和追加数据的文件,如果文件不存在会先创建

stream一般为:stdin(标准输入流,默认为键盘),stdout(标准输出流,默认为屏幕),stderr (标准错误输出流,默认为屏幕)

返回值
如果文件成功打开,则函数会返回一个文件的指针,指向用于标识流的对象。否则,函数就会返回空指针。
要注意一点就是,重定向输入输出流后输入输出的地方就是一直是那个你重定向后的位置了。

输入输出流重定向到文件后,就再文件中进行输入输出
将输入输出流重定向回到控制台后,才会继续正常的进行键盘和终端输入和输出

使用的方法

C++

#include <cstdio> #include <iostream> #include <string>//string和getline函数使用 using namespace std; int main(void) { freopen("test.in","r",stdin);//将输入流重定向为test.in文件,注意这里的文件路径//相同文件夹可以直接使用文件名字 freopen("test.out","w",stdout);//类比上面注释 string s; //getline会读到文件的EOF为止(不是换行) while(getline(cin,s))//一次读取到一个换行符为止,是个不错的读取方式。 { if(s=="")continue; //注意这里,可能gteline读了换行符,而cin却不接受,所以导致读入了空串,注意读取时文件的末尾在那里,注意哪里有多的换行。 cout<<s<<endl; } //这里的读取函数可以根据需求来进行更换 freopen("CON","r",stdin);//将输入流重定向到控制器,可以重新通过键盘输入。 freopen("CON","w",stdout);//将输入重定向到控制器,可以输出到屏幕。 fclose(stdin);//关闭输入流文件,注意这里关闭了就不能再进行输入了 fclose(stdout);//关闭输出流文件,这里关闭了就不能再进行输出了 return 0; }

C(区别主要在于读取的函数)

#include <stdio.h> #include <stdlib.h>//malloc使用 int main(void) { freopen("test.in","r",stdin); freopen("test.out","w",stdout); char*s=(char*)malloc(100000);//分配空间 while(gets(s))printf("%s\n",s);//一个换行符为一次读取,但使用gets时,传进去的char*必须是先有一定的空间的。 //这里的读取函数可以根据需求来进行更换 freopen("CON","r",stdin); freopen("CON","w",stdout); fclose(stdin); fclose(stdout); return 0; }

一个非常重要的点:同时对一个文件进行读取和写入的时候,要避免出现死循环的情况,容易再不小心之间造成无限输入(读一行,输出两行)


__EOF__

本文作者WUTONGHUA02
本文链接https://www.cnblogs.com/WUTONGHUA02/p/17246108.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   WUTONGHUA02  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示