C/C++中的輸入輸出重定向


注:原創不易,轉載請務必註明原做者和出處,感謝支持!算法

一 C/C++中的輸入輸出重定向

重定向在代碼調試時使用有多頻繁,相信常常刷算法題的同窗必定深有體會。本文總結了在C和C++中進行輸入輸出重定向的簡便方法。函數

1.1 C語言輸入輸出重定向

C語言標準庫中提供了freopen()函數來進行輸入輸出的重定向。
函數原型:spa

#include <stdio.h>
FILE *freopen(const char *filename, const char *mode, FILE *stream);

功能:指針

  • 若是filename被指定,則函數將關閉與stream關聯的文件,而後以mode模式打開文件filename並將其與stream進行關聯。
  • 若是filename爲空指針,則函數將stream以指定的mode更改stream的屬性
  • freopen()尤爲適合用來重定向預約義的文件流(stdin、stdout、stderr)

參數:調試

  • filename:包含文件名字符串的指針
  • mode的可能取值
    • r:讀
    • w:寫
    • a:追加(寫)
    • r+:讀寫(文件必須已存在)
    • w+:讀寫(若是文件不存在則建立新空文件,若是已存在,則原文件內容將被丟棄!)
    • a+:追加(讀寫)
  • stream:文件流

返回值:若是重定向成功,則返回stream;不然,返回nullcode

實例:ci

/* 將input.txt重定向到標準輸入 */
freopen("input.txt", "r", stdin);

/* 將標準輸出重定向到output.txt */
freopen("output.txt", "w", stdout);

1.2 C++語言輸入輸出重定向

C++提供了rdbuf()函數來進行重定向,與上述C語言片斷功能同樣的C++代碼以下所示:字符串

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char ** argv)
{
    // 備份cin和cout的默認buf
    streambuf *cin_backup, *cout_backup;
    cin_backup = cin.rdbuf();
    cout_backup = cout.rdbuf();

    // 打開要參與重定向的文件
    fstream in, out;
    in.open("in.txt", ios::in);
    out.open("out.txt", ios::out);
    if (in.fail() || out.fail())
        return -1;

    // 將in.txt內容重定向到cin
    // 將cout重定向到out.txt
    cin.rdbuf(in.rdbuf());
    cout.rdbuf(out.rdbuf());

    int n;
    cin >> n;
    cout << n << endl;

    cin.rdbuf(cin_backup);
    cout.rdbuf(cout_backup);
    return 0;
}

參考資料

  1. C++ Reference
相關文章
相關標籤/搜索