---
# System prepended metadata

title: Basic fstream

---

# Basic fstream
---
`fstream` 是建立在 `iostream` 上來實作的
所以所有 `iostream` 的操作都可以在 `fstream` 上使用

舉例
```cpp=
ifstream fin("in.txt");
ofstream fout("out.txt");
string str;

while(fin >> str)
    fout << "hello, " << str << endl;
```
由此可以知道 `ifstream` 是讀入，`ofstream` 是輸出
雖然 `fstream` 有自己的讀寫函數
但是 `operator<<`、`oeprator>>` 太好用了:poop:，所以用不太到

然後其實 `fstream` 只要是"文字檔"都可以開
以下為合法操作
```cpp=
ofstream cpp("C++.cpp");
ofstream py("Python.py");

cpp << "#include<iostream>\nusing namespace std;\n";
py << "import sys\nimport path";
```
另外還可以開二進位檔
不過出題用不到，所以我不會:poop: ([紫大](https://www.flag.com.tw/books/product/F0713)有)

然後要注意雖然 `fstream` 的`destructor` 有關閉並處存檔案
但是還是要記得用 `.close()`
養成習慣在檔案用不到時關閉
可以避免檔案開起衝突

最後通常因為看這個是為了出題
所以我也放上出題的模板:poop:
```cpp=
#pragma GCC optimize("O2")
#include <bits/stdc++.h>
#define f first
#define s second
#define pii pair<int, int>
using namespace std;

const string id = "a001"; // problem id
vector<int> num{100, 10000, 1000000}; // number of test data
vector<pii> range{{100, 1000}, {10000, 100000}, {100000, 1000000}}; // range: [l, r]
fstream fin, fout;

string fn(int x) {
	return string{char('0' + x / 10), char('0' + x % 10)};
}

int solve(int x) {
	/* code here to solve */
	/* return solution */
	/* or just use "fout << ans" */
}

int main() {
	srand(time(0));
	mt19937 gen(rand());
	
	for (int i = 0; i < num.size(); i++) {
		uniform_int_distribution<int> dis(range[i].f, range[i].s);
		fin.open(id + "_" + fn(i) + ".in", ios::out);
		fout.open(id + "_" + fn(i) + ".out", ios::out);
		/* ---------- data ----------*/
		for (int j = 0; j < num[i]; j++) {
			/* input, output data
			e.g.
			
			auto rd = dis(gen);
			fin << rd << '\n';
			fout << solve(rd) << '\n';
			
			*/
		}
		fin.close();
		fout.close();
	}
	return 0;
}
```
[最後按照慣例](http://cplusplus.com/reference/fstream/)

---
>[color=#0ff00f][name=revcoding]
