美文网首页架构算法设计模式和编程理论程序员互联网科技
小朋友学C++(23):C与C++的文件输入输出

小朋友学C++(23):C与C++的文件输入输出

作者: 海天一树X | 来源:发表于2018-07-09 23:23 被阅读112次

    一、fopen

    fopen是C语言中的标准输入输出函数,被包含在<stdio.h>中。
    C语言中,用fopen来打开文件。
    函数声明:FILE * fopen(const char * path, const char * mode);
    path表示文件的路径,可用当前路径或绝对路径,若文件名之前没加路径,表示当前工程所在的路径。
    mode表示使用文件方式,是文件的类型和操作要求,有如下几种:

    r(read):只读;
    w(write):只写;
    a(append):追加;
    t(text):文本文件,可省略;
    b(binary):二进制文件。
    + :读和写
    

    例1

    #include <stdio.h>
    
    int main()
    {
        FILE *fp1, *fp2; //定义文件指针类型
        // input.in文件中放了两个整数
        fp1 = fopen("input.in","r"); //用fopen函数以只读方式(r)打开输入文件input.in;
        fp2 = fopen("output.out","w");//用fopen函数以写入方式(w)打开输出文件output.out;
    
        int a, b;
        fscanf(fp1, "%d %d", &a, &b);//fscanf从文件中读取数据,fp1文件指针指定文件;
        fprintf(fp2, "%d", a + b);//fprintf将数据输出到文件,fp2文件指针指定文件;
    
        fclose(fp1);//关闭文件指针。
        fclose(fp2);
    
        return 0;
    }
    

    在启用fopen函数时,需要特定的函数fscanf,fprintf对文件操作;普通的scanf和printf依然能在命令行界面操作。
    最后要用fclose关闭文件。

    二、freopen

    freopen中的re代表redirect,重定向。
    freopen()函数重定向了标准流,使其指向指定文件,因此不需要修改scanf和printf。
    所谓重定向输出,就是可以把原本只是输出在控制台的字符,输出到你指定的路径文件中。(输入类似,就是从指定的文件中读取,而不是读取在控制台中的输入。)
    重定向函数可以在任何时候开启、关闭。

    函数名:freopen
    标准声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
    所在文件: <stdio.h>
    参数说明:
    path: 文件名,用于存储输入输出的自定义文件名。
    mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。
    stream: 一个文件,通常使用标准流文件。
    返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。
    功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。

    例2

    #include <stdio.h>
    
    int main()
    {
        int a,b;
        // in.txt中有三行数:
        // 10 20
        // 11 22
        // 12 24
        freopen("D:\\in.txt","r",stdin);    //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
        freopen("D:\\out.txt","w",stdout);  //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
        while(EOF != scanf("%d %d",&a,&b))
        {
            // 把30,33,36分成三行写入out.txt中
            printf("%d\n",a+b);
        }
    
        return 0;
    }
    

    注意:如果是Linux/Ma

    例3

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a, b;
        freopen("D:\\in.txt","r", stdin);   //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
        freopen("D:\\out.txt","w", stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
        while(cin >> a >> b)
        {
            cout << a + b << endl;
        }
    
        return 0;
    }
    

    这里stdin和stdout包含在stdio.h中,所以得包含stdio.h或cstdio。

    在windows系统中,控制台的名称为"CON", Unix/Linux系统中,控制台的名称为"/dev/console",所以随时可重定向回控制台

    例4

    #include <stdio.h>
    
    int main()
    {
        int a,b;
        // in.txt中有三行数:
        // 10 20
        // 11 22
        // 12 24
        freopen("D:\\in.txt","r",stdin);    //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
        freopen("D:\\out.txt","w",stdout);  //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
        while(EOF != scanf("%d %d",&a,&b))
        {
            // 把30,33,36分成三行写入out.txt中
            printf("%d\n",a+b);
        }
    
        freopen("CON","r",stdin);
        freopen("CON","w",stdout);
    
        // 在控制台输入两个数并输出结果
        scanf("%d %d", &a, &b);
        printf("%d", a + b);
    
    
        return 0;
    }
    

    三、ifstream和ofstream

    ifstream和ofsteam是C++中标准的文件输入流和文件输出流。

    例5

    #include <fstream>
    using namespace std;
    
    int main()
    {
        ifstream fin("../in.txt");  // ..表示上级目录,.表示当前目录
        ofstream fout("../out.txt");
    
        int a, b;
        fin >> a >> b;
        fout << a + b << endl;
    
        return 0;
    }
    

    四、总结

    C/C++总共有五种输入输出方式
    (1)C++控制台cin/cout
    (2)C语言控制台scanf/printf
    (3)C++文件ifstream/ofstream
    (4)C语言文件fopen/fscan/fprintf/fclose
    (5)C语言重定向freopen

    TopCoder & Codeforces & AtCoder交流QQ群:648202993
    更多内容请关注微信公众号


    wechat_public_header.jpg

    相关文章

      网友评论

      • f8889dc64aea:世界上两个最难学的语言,c++和javascript
        海天一树X:@笑看百态自由自在 js不会,有那么难么?:flushed:
      • 倾闻:一直想学C艹😜😂
        倾闻:@海天一树X C++由于兼容了C,还有多继承,以及各种复杂的特性一般人很难掌握并征服它。我之前看到过一条真假难辨的信息,一女程序员说:“我要要嫁给写C++的大神。”
        海天一树X:@清城晓梦 加油哦。不太难。

      本文标题:小朋友学C++(23):C与C++的文件输入输出

      本文链接:https://www.haomeiwen.com/subject/buexpftx.html