02_C\C++文件操作
Carpe Tu Black Whistle

文件的概念

文件,是根据特定的目的而收集在一起的有关数据的集合。

万物皆文件

C/C++ 把每个文件都看成是一个有序的字节流,每个文件都以 文件结束标志(EOF)结束。

文件的操作步骤

  1. open the file. 将文件指针指向文件,决定打开文件类型;
  2. 对文件进行读、写操作;
  3. 使用完,close file.

freopen 函数

将输入输出流以 指定方式 重定向到文件,包含在头文件 stdio.h(cstdio)
函数主要有三种方式: 读、写和附加

命名格式

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

参数说明

  • filename
  • mode: 设置文件打开模式
  • stream: 文件指针,标准文件流(stdin/stdout)活标准错误输入流(stderr)
  • 返回值:文件指针,指向被打开文件

文件打开模式

image

使用方法

读入文件内容

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

输出到文件

1
2
freopen("data.out","w",stdout);
// data.out 就是输出文件到文件名,和可执行文件在统一目录下

关闭标准输入/输出流

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

模板

1
2
3
4
5
6
7
8
9
10
11
12
#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)

可用读写函数(基本)

  • 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(stdin);
fclose(stdout);

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
#include <cstdio>
#include <fstream>
ifstream fin("data.in");
ofstream fout("data.out");
int main(void) {
/*
中间的代码改变 cin 为 fin ,cout 为 fout 即可
*/
fin.close();
fout.close();
return 0;
}

结构体的构造函数

一个普通定义的结构体,内部会生成默认的构造函数

构造函数

1
2
3
4
5
6
struct studentInfo{
int id;
char gender;
// 默认生成的构造函数
studentInfo(){}
}

有两种相似的表达

正常模式

1
2
3
4
5
6
7
8
9
10
struct studentInfo{
int id;
char gender;
// 下面的参数用以对结构体内部变量进行赋值
studentInfo(int _id, char _gender){
// 赋值
id = _id;
gender = _gender;
}
}

单行实现构造函数

单行定义的写法有点像python

1
2
3
4
5
struct studentInfo{
int id;
char gender;
studentInfo(int _id, char _gender): id(_id), gender(_gender){}
};

覆盖机制

构造函数被重新定义后,会遇到默认构造函数被覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct studentInfo{
int id;
char gender;
// 用以不初始化就定义结构体变量
studentInfo(){}
// 只初始化gender
studentInfo(char _gender){
gender = _gender;
}
// 同时初始化id和gender
studentInfo(int _id, char _gender){
id = _id;
gender = _gender;
}
};