ofstream写入文件

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>  // 记忆点1:万能头包含了文件操作的fstream,若单独写需加 #include <fstream>
using namespace std;

int main() {
// 1. 定义文件名(路径)
string f_name="text.txt"; // 记忆点2:路径分2种
// ✅ 相对路径:"text.txt" → 保存在程序运行的「当前文件夹」(最常用,好记)
// ✅ 绝对路径:Windows下要写 "G:\\C++\\try2\\text.txt"(\要写两个,因为\是转义符),或 "G:/C++/try2/text.txt"(/不用转义,更简单)

// 2. 创建写文件对象 + 关联文件(打开文件)
ofstream fout(f_name); // 记忆点3:核心!ofstream = output file stream(输出文件流),专门用来「写文件」
// 等价写法:ofstream fout; fout.open(f_name); (拆分版,记一个就行)
// 模式:这里是「覆盖模式」(默认)→ 文件已存在则清空原有内容;追加模式要写:ofstream fout(f_name, ios::app);

// 3. 必做:检查文件是否打开成功(新手最易漏!)
if(!fout.is_open()){ // 记忆点4:打开失败的常见原因:路径错、权限不足、磁盘满
cout<<"shibai"<<endl;
return 1; // 打开失败就直接退出,别继续写(写了也白写)
}

// 4. 写入数据(和cout一模一样,不用新学!)
fout << "Hello, File!" << endl; // 记忆点5:fout << 内容 等价于 cout << 内容,endl=换行+刷新(确保数据写入文件)
fout << "数字:" << 123 << " 浮点数:" << 3.14 << endl;
fout << "多行数据" << "\n"; // 记忆点6:\n也能换行,和endl的区别:endl会刷新缓冲区,\n只是换行

// 5. 关闭文件(好习惯)
fout.close(); // 记忆点7:close()=释放文件资源,虽然程序结束会自动关,但显式写=不容易丢数据
cout << "数据写入成功!" << endl;
return 0;
}

ifstream读文件

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;


int main() {
ifstream fin("text.txt");
if(!fin.is_open()){
return 1;
}

/* char c;
* fin>>c;
* cout<<c<<endl;
*
* char s[10];
* fin>>s;
* cout<<s<<endl;
*
* string line;
* getline(fin,line);
* cout<<line<<endl;
*/

string line2;
string result;
while(getline(fin,line2)){ // 循环逐行读取,直到文件末尾
result+=line2; // 拼接当前行内容
result+='\n'; // 补回换行符(getline会丢弃每行末尾的\n,保证格式和原文件一致)
}
cout<<result<<endl; // 输出完整文件内容
fin.close();
}

文件打开再读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 万能头文件:包含文件操作(fstream)、字符串(string)等所有核心头文件,无需单独引入
#include<bits/stdc++.h>
using namespace std;

int main() {
// 定义字符串变量fn,用于存储用户输入的文件名
string fn;
// 读取用户输入的文件名(注意:cin>>会截断空格,文件名含空格时需改用getline)
cin>>fn;

// 【关键】创建ofstream写文件流对象,关联用户指定的文件
// 默认打开模式:ios::out(覆盖模式)→ 文件存在则清空原有内容,不存在则创建
// 若需追加内容,需改为:ofstream fout(fn, ios::app);
ofstream fout(fn);

// 定义字符串变量a,用于存储用户输入的要写入文件的字符串
string a;
// 【易错点】读取用户输入的字符串:cin>>会跳过空格/换行,遇到空格则停止读取(如输入"hello world"仅读取"hello")
// 如需读取含空格的完整字符串:需先cin.ignore()清空换行,再用getline(cin, a)
cin>>a;

// 将字符串a以文本形式写入文件(无额外换行,仅写入字符串本身)
fout<<a;
// 关闭写文件流:显式关闭是良好习惯,确保数据从缓冲区刷入文件,释放系统资源
fout.close();

// 创建ifstream读文件流对象,关联刚才写入的文件
ifstream fin(fn);
// 【必做检查】判断文件是否成功打开(路径错/权限不足/文件被占用都会导致打开失败)
if(!fin.is_open()){
// 打开失败则直接退出程序,避免后续无效的读取操作
return 1;
}

// 定义字符串s,临时存储读取到的文件每行内容
string s;
// 循环逐行读取文件内容:getline会读取一整行(到换行符截止),文件读完后自动退出循环
// 由于写入时仅写了一行字符串,此循环仅执行1次
while(getline(fin,s)){
// 将读取到的内容输出到控制台(可加endl让输出换行,格式更友好)
cout<<s;
}

// 关闭读文件流:释放文件资源,避免资源泄漏
fin.close();

// main函数默认返回0,标识程序正常结束(可显式写出,更规范)
return 0;
}

追加文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<bits/stdc++.h>  // 万能头:不用记一堆头文件,包含文件/字符串/输入输出所有需要的内容
using namespace std;

int main() {
// ===== 第一步:读取text.txt原有内容并输出 =====
string fn="text.txt"; // 定义要操作的文件名(固定为text.txt)
ifstream fin(fn); // 1. 创建「读文件工具」(记:ifstream=读,ofstream=写)
if(!fin.is_open()){ // 【必做检查】文件没打开成功(比如文件不存在),直接退出
return 1;
}
string line; // 临时存文件里的“每一行”
string result; // 存文件的“全部内容”
while(getline(fin,line)){ // 2. 逐行读文件(新手首选!比逐字符读更易理解)
result+=line; // 把每行内容拼起来
result+='\n'; // 【关键】补换行符!getline会吃掉每行末尾的\n,不加会拼成一行(比如“第一行第二行”)
}
cout<<result; // 输出文件原有内容
fin.close(); // 3. 读完关文件!释放资源(好习惯,不然文件会被占用)

// ===== 第二步:追加写入内容到文件末尾 =====
// 4. 创建「写文件工具」,重点:ios_base::out|ios_base::app = 追加模式(记:app=追加)
ofstream fout(fn,ios_base::out|ios_base::app);
if(!fout.is_open()){ // 写文件也要检查是否打开成功
return 1;
}
string sss;
cin>>sss; // 读取你输入的内容(注意:会截断空格,比如输入“hi 123”只读“hi”)
fout<<sss<<endl; // 把输入的内容写到文件末尾,endl=换行+确保内容立即写入(不暂存)
fout.close(); // 写完关文件

// ===== 第三步:重新读取文件最新内容并输出 =====
fin.clear(); // 【新手必记】第一次读完文件后,fin记着“文件读完了”,clear()清空这个状态
fin.open(fn); // 【关键】重新绑定文件(只clear不open,还是读不到内容!)
if(!fin.is_open()){ // 再次检查打开状态
return 1;
}
string line2;
string result2;
while(getline(fin,line2)){ // 逐行读更新后的文件
result2+=line2;
result2+='\n';
}
cout<<result2; // 输出追加后的完整内容
fin.close(); // 最终关闭文件
return 0; // 补充:原代码漏了,新手记得加,标识程序正常结束
}

二进制

二进制读写:

\1. 开模式:加binary(out/in | binary);

// 写模式+二进制模式:ios::out | ios::binary(记:out=写,binary=二进制) ofstream fout(fn, ios::out | ios::binary);

// 读模式+二进制模式:ios::in | ios::binary(in=读,可省略,默认就是读) ifstream fin(fn, ios::in | ios::binary);

\2. 写用write:(char*)&数据,sizeof算字节;

\3. 读用read:顺序字节全一致,字符串先读长度;

\4. 流程:创对象→查打开→关文件(和文本一样)。

打开一个文件加到另一个里面

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<bits/stdc++.h>
using namespace std;


int main() {
string sfn="text.txt";
string efn="text2.txt";
ifstream fin(sfn);
if(!fin.is_open()){
return 1;
}

ofstream fout(efn);
//加 ios::app 开启追加模式(默认是覆盖模式,会清空text2.txt)
// ofstream fout(efn, ios::app);
if(!fout.is_open()){
return 1;
}
string str;
string result;
while(getline(fin,str)){
fout<<str<<endl;
}
fin.close();
fout.close();
}