1 solutions

  • 0
    @ 2025-7-3 9:30:01

    本题我们介绍一下 C 和 C++ 的多种文件读写方式,在 DSA 辅助练习以及 CCSP 的多文件题目中会用上,其中后者可能涉及其他函数。

    C 写法

    第一种是直接用 fopen 函数打开文件,并使用 fscanf 从文件中读取。

    #include <stdio.h>
    FILE *in1, *in2;
    int x, y;
    int main()
    {
        in1 = fopen("1.in", "rb"), in2 = fopen("2.in", "rb");
        fscanf(in1, "%d", &x), fscanf(in2, "%d", &y);
        printf("%d", x - y);
    }
    

    另一种是使用 freopen 把文件重定向至标准输入,然后 scanf 输入即可。

    #include <stdio.h>
    int x, y;
    int main()
    {
        freopen("1.in", "r", stdin), scanf("%d", &x);
        freopen("2.in", "r", stdin), scanf("%d", &y);
        printf("%d", x - y);
    }
    

    C++ 写法

    直接利用 fstream 库,有 fstream 类+传入 flag 以及直接使用 ifstream 两种做法。

    #include <iostream>
    #include <fstream>
    int main()
    {
        std::fstream in1("1.in", std::ios::in);
        std::fstream in2("2.in", std::ios::in);
        int x, y;
        in1 >> x, in2 >> y;
        std::cout << x - y;
    }
    
    #include <iostream>
    #include <fstream>
    int main()
    {
        std::ifstream in1("1.in");
        std::ifstream in2("2.in");
        int x, y;
        in1 >> x, in2 >> y;
        std::cout << x - y;
    }
    

    或者利用 rdbuf 函数把缓冲区绑定,等同于文件重定向。

    需要注意的是,如果关闭了输入输出流同步,涉及到多次重定向时,不要使用 freopen,请使用 fstream 系列函数。

    #include <iostream>
    #include <fstream>
    int main()
    {
        std::ios::sync_with_stdio(0);
        std::cin.tie(0), std::cout.tie(0);
        std::ifstream in1("1.in");
        std::ifstream in2("2.in");
        int x, y;
        std::cin.rdbuf(in1.rdbuf()), std::cin >> x;
        std::cin.rdbuf(in2.rdbuf()), std::cin >> y;
        std::cout << x - y;
    }
    
    • 1

    Information

    ID
    95
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    1
    Tags
    # Submissions
    9
    Accepted
    2
    Uploaded By