C++文件操作

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

\(freopen\)函数

相关的描述

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

相应的声明

函数的声明:
\(\textcolor{purple}{FILE\ \ \ }^{\textcolor{blue}{*}}\textcolor{orange}{freopen}(\textcolor{blue}{const\ \ }\textcolor{purple}{char\ \ \ }^{\textcolor{blue}{*}}filename{,\ }\textcolor{blue}{const\ \ }\textcolor{purple}{char\ \ \ }^{\textcolor{blue}{*}}mode{,\ } \textcolor{purple}{FILE\ \ \ }^{\textcolor{blue}{*}}stream)\)
相应的参数

\(\textcolor{#CD2990}{filename}——文件名,自定义的文件的位置,如果放在和代码相同的文件夹下就只用文件名\)
\(\textcolor{#CD2990}{mod}——文件的访问模式\)
\(\textcolor{#CD2990}{stream}——要被重新打开的流文件\)

\(\color{pink}{mod}\)一般如下:

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

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

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

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

使用的方法

\(\textcolor{#CD2990}{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;
}

\(\textcolor{#CD2990}{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;
}

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

posted @ 2023-03-23 04:48  WUTONGHUA02  阅读(35)  评论(0编辑  收藏  举报