跳转至

文件操作

文件的概念

文件是根據特定的目的而收集在一起的有關數據的集合。C/C++ 把每一個文件都看成是一個有序的字節流,每個文件都是以 文件結束標誌(EOF)結束,如果要操作某個文件,程序應該首先打開該文件,每當一個文件被打開後(請記得關閉打開的文件),該文件就和一個流關聯起來,這裏的流實際上是一個字節序列。

C/C++ 將文件分為文本文件和二進制文件。文本文件就是簡單的文本文件(重點),另外二進制文件就是特殊格式的文件或者可執行代碼文件等。

文件的操作步驟

1、打開文件,將文件指針指向文件,決定打開文件類型;
2、對文件進行讀、寫操作(比賽中主要用到的操作,其他一些操作暫時不寫);
3、在使用完文件後,關閉文件。

freopen 函數

函數簡介

函數用於將指定輸入輸出流以指定方式重定向到文件,包含於頭文件 stdio.h (cstdio) 中,該函數可以在不改變代碼原貌的情況下改變輸入輸出環境,但使用時應當保證流是可靠的。

函數主要有三種方式:讀、寫和附加。

命令格式

1
FILE* freopen(const char* filename, const char* mode, FILE* stream);

參數説明

  • filename: 要打開的文件名
  • mode: 文件打開的模式,表示文件訪問的權限
  • stream: 文件指針,通常使用標準文件流 (stdin/stdout) 或標準錯誤輸出流 (stderr)
  • 返回值:文件指針,指向被打開文件

文件打開格式(選讀)

  • r:以只讀方式打開文件,文件必須存在,只允許讀入數據 (常用)
  • r+:以讀/寫方式打開文件,文件必須存在,允許讀/寫數據
  • rb:以只讀方式打開二進制文件,文件必須存在,只允許讀入數據
  • rb+:以讀/寫方式打開二進制文件,文件必須存在,允許讀/寫數據
  • rt+:以讀/寫方式打開文本文件,允許讀/寫數據
  • w:以只寫方式打開文件,文件不存在會新建文件,否則清空內容,只允許寫入數據 (常用)
  • w+:以讀/寫方式打開文件,文件不存在將新建文件,否則清空內容,允許讀/寫數據
  • wb:以只寫方式打開二進制文件,文件不存在將會新建文件,否則清空內容,只允許寫入數據
  • wb+:以讀/寫方式打開二進制文件,文件不存在將新建文件,否則清空內容,允許讀/寫數據
  • a:以只寫方式打開文件,文件不存在將新建文件,寫入數據將被附加在文件末尾(保留 EOF 符)
  • a+:以讀/寫方式打開文件,文件不存在將新建文件,寫入數據將被附加在文件末尾(不保留 EOF 符)
  • at+:以讀/寫方式打開文本文件,寫入數據將被附加在文件末尾
  • ab+:以讀/寫方式打開二進制文件,寫入數據將被附加在文件末尾

使用方法

讀入文件內容:

1
2
freopen("data.in", "r", stdin);
// data.in 就是讀取的文件名,要和可執行文件放在同一目錄下

輸出到文件:

1
2
freopen("data.out", "w", stdout);
// data.out 就是輸出文件的文件名,和可執行文件在同一目錄下

關閉標準輸入/輸出流

1
2
fclose(stdin);
fclose(stdout);

printf/scanf/cin/cout 等函數默認使用 stdin/stdout,將 stdin/stdout 重定向後,這些函數將輸入/輸出到被定向的文件

模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <cstdio>
#include <iostream>

int main(void) {
  freopen("data.in", "r", stdin);
  freopen("data.out", "w", stdout);
  /*
  中間的代碼不需要改變,直接使用 cin 和 cout 即可
  */
  fclose(stdin);
  fclose(stdout);
  return 0;
}

fopen 函數(選讀)

函數大致與 freopen 相同,函數將打開指定文件並返回打開文件的指針

函數原型

1
FILE* fopen(const char* path, const char* mode)

各項參數含義同 freopen

可用讀寫函數(基本)

  • fread/fwrite
  • fgetc/fputc
  • fscanf/fprintf
  • fgets/fputs

使用方式

1
2
3
4
5
6
7
8
FILE *in, *out;  // 定義文件指針
in = fopen("data.in", "r");
out = fopen("data.out", "w");
/*
do what you want to do
*/
fclose(in);
fclose(out);

C++ 的 ifstream/ofstream 文件輸入輸出流

使用方法

讀入文件內容:

1
2
ifstream fin("data.in");
// data.in 就是讀取文件的相對位置或絕對位置

輸出到文件:

1
2
ofstream fout("data.out");
// data.out 就是輸出文件的相對位置或絕對位置

關閉標準輸入/輸出流

1
2
fin.close();
fout.close();

模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <fstream>
using namespace std;  // 兩個類型都在 std 命名空間裏

ifstream fin("data.in");
ofstream fout("data.out");

int main(void) {
  /*
  中間的代碼改變 cin 為 fin ,cout 為 fout 即可
  */
  fin.close();
  fout.close();
  return 0;
}

參考資料

  1. 信息學奧賽一本通