Unverified Commit 08fc615e authored by akakw1's avatar akakw1 Committed by GitHub
Browse files

Merge pull request #1086 from 24OI/akakw1-patch-1

Update file-operation.md
parents 34de9b67 15daa96b
Loading
Loading
Loading
Loading
+63 −4
Original line number Diff line number Diff line
@@ -11,6 +11,12 @@ C/C++ 将文件分为文本文件和二进制文件。文本文件就是简单

##  `freopen` 函数

### 函数简介

函数用于将指定输入输出流以指定方式重定向到文件,包含于头文件 `stdio.h (cstdio)` 中,该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的

函数主要有三种方式:读、写和附加

### 命令格式

```cpp
@@ -20,8 +26,25 @@ FILE* freopen(const char* filename, const char* mode, FILE* stream);
### 参数说明

-    `filename` : 要打开的文件名
-    `mode` : 文件打开的模式
-    `stream` : 文件指针,通常使用标准文件流 ( `stdin/stdout/stderr` )
-    `mode` : 文件打开的模式,表示文件访问的权限
-    `stream` : 文件指针,通常使用标准文件流 ( `stdin/stdout` ) 或标准错误输出流 (`stderr`) 
-    返回值:文件指针,指向被打开文件

### 文件打开格式(选读)

- `r`:以只读方式打开文件,文件必须存在,只允许读入数据**(常用)**
- `r+`:以读 / 写方式打开文件,文件必须存在,允许读写数据
- `rb`:以只读方式打卡二进制文件,文件必须存在,只允许读入数据
- `rb+`:以读写方式打开二进制文件,文件必须存在,允许读写数据
- `rt+`:以读写方式打开文本文件,允许读写
- `w`:以只写方式打开文件,文件不存在会新建文件,否则清空内容,只允许写入数据**(常用)**
- `w+`:以读 / 写方式打开文件,文件不存在将新建文件,否则清空内容,允许读写数据
- `wb`:以只读方式打开二进制文件,文件不存在将会新建文件,否则清空内容,只允许写入数据
- `wb+`:以读写方式打开二进制文件,文件不存在将新建文件,否则清空内容,允许读写数据
- `a`:以附加方式打开只写文件,文件不存在将新建文件,写入数据将被附加在文件末尾(保留EOF符)
- `a+`:以附加方式打开只写文件,文件不存在将新建文件,写入数据将被附加在文件末尾(不保留EOF符)
- `at+`:以读写方式打开文本文件,写入数据将被附加在文件末尾
- `ab+`:以读写方式打开二进制文件,写入数据将被附加在文件末尾

### 使用方法

@@ -46,6 +69,8 @@ fclose(stdin);
fclose(stdout);
```

!!! 注 `printf/scanf/cin/cout`等函数默认使用 `stdin/stdout`,将 `stdin/stdout`重定向后,这些函数将输入 / 输出到被定向的文件

### 模板

```cpp
@@ -65,6 +90,40 @@ int main(void) {

参考书目:信息学奥赛一本通

## `fopen`函数(选读)

函数大致与 `freopen` 相同,函数将打开指定文件并返回打开文件的指针

### 函数原型

```cpp
FILE * fopen(const char * path, const char * mode)
```

各项参数含义同 `freopen` 

### 可用读写函数(基本)

- `fread/fwrite`
- `fgetc/fputc`
- `fscanf/fprintf`
- `fgets/fputs`

### 使用方式

```cpp
FILE *in, *out; // 定义文件指针
in = fopen("data.in", "r");
out = fopen("data.out", "w");
/*
do what you want to do
*/
fclose(stdin);
fclose(stdout);
```



## C++ 的 `ifstream/ofstream` 文件输入输出流

### 使用方法
@@ -73,14 +132,14 @@ int main(void) {

```cpp
ifstream fin("data.in");
// data.in 就是读取文件名,要和可执行文件放在同一目录下
// data.in 就是读取文件的相对位置或绝对位置
```

输出到文件:

```cpp
ofstream fout("data.out");
// data.out 就是输出文件的文件名,和可执行文件在同一目录下
// data.out 就是输出文件的相对位置或绝对位置
```

关闭标准输入/输出流