文件读写与异常处理
课上练习
知识总结
L2-14.文件读写与异常处理-知识总结
文件读写与异常处理-知识总结 输入输出知识汇总
文件重定向 将控制台输入输出改为文件输入输出
C++文件输入输出 头文件与命名空间
#include <fstream>using namesapce std;
文件输入 ifstream cin;//创建读取变量
1cin.open("in.txt"); // 打开文件int number;
2if (!cin.is_open()) {
3 cout << "can't find file" << endl;
4}
5cin >> number; //读取数据
6cin.close(); //关闭文件文件输出
ofstream cout(“out.txt”);//创建写入变量并打开输出文件,如果文件不存在则创建文件
cout << "hello" << endl; //写入数据
cout.close(); //关闭文件文件读写 追加写入方式,即在文件后添加写入的内容
fstream file("in.txt", ios::in | ios::out | ios::app);
int number;
file >> number;
file << "output";
file.close();清空写入方式,即先清空即将写入的文件再进行写入操作
fstream file(“in.txt”, ios::in | ios::out | ios::trunc);
int number;
file >> number;
file << "output";
file.close();C语言文件输入输出 头文件与命名空间 无需特别添加
文件输入输出
freopen(“in.txt”,”r”, stdin);
freopen(“out.txt”,“w”, stdout);异常处理 程序异常概念 程序异常就是程序的非编译性错误,可能是系统定义的,也可能是程序员定义的。程序的异常处理让程序在发生错误后依旧可以正常运行后续程序。
异常处理的结构 异常处理的三个模块: 抛出(throw):当检测到异常情况时,程序会使用throw关键字抛出一个异常。 尝试(try):try代码块包围可能抛出异常的代码,并指定一个或多个catch块来处理可能发生的异常。 捕获(catch):异常被抛出后,程序会在 catch代码块中捕获并处理这个异常。
try-catch结构如下,throw可以在try模块中,也可以在try模块外。 try {
} catch (exception &error) {} catch (...) {}异常处理代码示例 在try模块中抛出异常
1#include <iostream>
2#include <stdexcept>
3using namespace std;
4
5int main() {
6 int a, b;
7 cin >> a >> b;
8 try {
9 if (b == 0) {
10 throw runtime_error("divide zero");
11 }
12 if (a < b) {
13 throw invalid_argument("a < b");
14 }
15 if (a > 100 || b > 100) {
16 throw invalid_argument("out of range");
17 }
18 int result = a / b;
19 cout << a << " / " << b << " = " << result << endl;
20 } catch (runtime_error &error) {
21 cout << error.what() << endl;
22 } catch (invalid_argument &error) {
23 cout << error.what() << endl;
24 } catch (...) {
25 cout << "an unknow error" << endl;
26 }
27 return 0;
28}不在try模块中抛出异常
1#include <iostream>
2#include <stdexcept>
3using namespace std;
4
5int divide(int a, int b) {
6 if (b == 0) {
7 throw runtime_error("divide zero");
8 }
9 if (a < b) {
10 throw invalid_argument("a < b");
11 }
12 if (a > 100 || b > 100) {
13 throw invalid_argument("out of range");
14 }
15 int result = a / b;
16 return result;
17}
18
19int main() {
20 int a, b;
21 cin >> a >> b;
22 try {
23 int result = divide(a, b);
24 cout << a << " / " << b << " = " << result << endl;
25 } catch (runtime_error &error) {
26 cout << error.what() << endl;
27 } catch (invalid_argument &error) {
28 cout << error.what() << endl;
29 } catch (...) {
30 cout << "an unknow error" << endl;
31 }
32 return 0;
33}异常处理与文件操作代码示例
1#include <iostream>
2#include <fstream>
3#include <stdexcept>
4using namespace std;
5
6int main() {
7 try {
8 ifstream fin("in.txt");
9 if (!fin.is_open()) {
10 throw runtime_error("no file");
11 }
12 } catch (runtime_error &e) {
13 cout << e.what() << endl;
14 }
15 return 0;
16}️课后作业
☝️单选作业
错误的题目要弄懂,不会的千万要来问老师⚠️
✌️总结作业
总结作业非常重要,请务必认真完成✔️
- 文件重定向的含义是什么?
- C++语言重定向文件输入的关键代码。
- C++语言重定向文件输出的关键代码。
- C语言重定向文件输入的关键代码。
- C语言重定向文件输出的关键代码。
- 异常处理的三个关键字及其结构。
👌编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
👌编程作业标准答案
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
L02-24.文件读写与异常处理-选择题
L2-24.文件读写与异常处理-选择题
在C++中,使用文件输入输出流必须包含哪个头文件?
A) #include <fstream>
B) #include <iostream>
C) #include <filestream>
D) #include <stream>
如何在C++中打开一个用于写入的文件?
A) ofstream file("example.txt");
B) ifstream file("example.txt");
C) fstream file("example.txt");
D) filestream file("example.txt");在C++中,如何检查文件是否成功打开?
A) file.is_open();
B) file.good();
C) file.exists();D) A和B都是
如何在C++中关闭一个打开的文件?
A) file.close();
B) close(file);
C) file.end();
D) file.terminate();在C++中,如何向文件写入字符串?
A) file << "Hello, world!";
B) file.write("Hello, world!");
C) file.put("Hello, world!");
D) file.print("Hello, world!");在C++中,如何读取整行文本?
A) getline(file, str);
B) file.getline(str);
C) file >> str;
D) file.read(str);在C++中,如何检查文件读取或写入是否到达文件末尾?
A) file.eof();
B) file.end();
C) file.isEnd();
D) eof(file);在 C++语言中,如果一个函数可能抛出异常,那么一定要在 try 子句里调用这个函数。 A) 正确 B) 错误
通过使用文件重定向操作,可以将程序中输出到cout的内容输出到文件中, 这是常用的记录程序运行日志的方法之一。 A) 正确 B) 错误
下列关于C++语言中异常处理的叙述,正确的是( )。 A)一个try子句可以有多个catch子句与之对应。 B)如果try子句在执行时发生异常 ,就一定会进入某一个catch子句执行。 C)如果try子句中没有可能发生异常的语句 ,会产生编译错误。 D) catch 子句处理异常后 ,会重新执行与之对应的try子句。
L02-24.文件读写与异常处理-选择题答案
L2-24.文件读写与异常处理-选择题答案
A
解析:
L2243题解+参考代码
L2243题解+参考代码 题目链接 相似字符串:L2243
题解 我们需要编写一个程序来判断给定的 T 组字符串 A 和 B 是否相似。字符串 A 和 B 如果满足以下条件之一则相似: A 可以通过删除一个字符变成 B。 A 可以通过插入一个字符变成 B。 A 可以通过修改一个字符变成 B。 A 和 B 完全相同。
算法步骤 读取输入文件:使用 freopen 读取输入文件 L2243.in。 定义函数 aresimilar: 检查字符串长度差异。如果长度差异大于1,则不相似。 如果长度相等,检查最多允许一个字符不同。 如果长度相差1,尝试删除或插入一个字符使其相同。 处理每组字符串: 调用 aresimilar 函数判断每组字符串是否相似。 输出结果到文件:使用 freopen 将结果输出到文件 L2243.out。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4bool are_similar(const string &a, const string &b) {
5 int lenA = a.length();
6 int lenB = b.length();
7
8 if (abs(lenA - lenB) > 1) return false;
9
10 if (lenA == lenB) {
11 int diffCount = 0;
12 for (int i = 0; i < lenA; ++i) {
13 if (a[i] != b[i]) {
14 diffCount++;
15 if (diffCount > 1) return false;
16 }
17 }
18 return true;
19 } else {
20 const string &longer = (lenA > lenB) ? a : b;
21 const string &shorter = (lenA > lenB) ? b : a;
22
23 int i = 0, j = 0;
24 while (i < longer.length() && j < shorter.length()) {
25 if (longer[i] != shorter[j]) {
26 if (i != j) return false;
27 i++;
28 } else {
29 i++;
30 j++;
31 }
32 }
33 return true;
34 }
35}
36
37int main() {
38 freopen("L2243.in", "r", stdin);
39 freopen("L2243.out", "w", stdout);
40
41 int T;
42 cin >> T;
43
44 for (int t = 0; t < T; ++t) {
45 string A, B;
46 cin >> A >> B;
47 if (are_similar(A, B)) {
48 cout << "similar" << endl;
49 } else {
50 cout << "not similar" << endl;
51 }
52 }
53
54 return 0;
55}L2244题解+参考代码
L2244题解+参考代码 题目链接 做题:L2244
题解 我们需要计算小杨同学最多能坚持做题的天数。给定的条件是: 每天完成的题目数等于当天的天数。 每天只能使用一个题单,每个题单只能使用一次,且不必完成题单内所有的题目。 为了解决这个问题,我们需要贪心地使用题单,即先使用题数少的题单来满足每天递增的需求。这样可以确保我们能坚持更多天数。
算法步骤 读取输入:从标准输入读取题单数量 n 和每个题单的题目数。 排序题单:将题单按题目数从小到大排序。 贪心算法: 初始化天数 day 为 0。 遍历排序后的题单数组: 如果当前题单的题目数大于等于当前天数加一,则表示可以完成当天的题目,天数增加一天。 输出结果:输出最多能坚持的天数。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4void solve() {
5 // 打开输入和输出文件
6 freopen("L2244.in", "r", stdin);
7 freopen("L2244.out", "w", stdout);
8
9 int n;
10 cin >> n; // 读取题单数量
11 int problems[100]; // 假设 n <= 100
12
13 // 读取每个题单的题目数
14 for (int i = 0; i < n; ++i) {
15 cin >> problems[i];
16 }
17
18 // 按题目数量排序
19 sort(problems, problems + n);
20
21 int day = 0;
22
23 // 贪心算法,尽量使用题数少的题单
24 for (int i = 0; i < n; ++i) {
25 if (problems[i] >= day + 1) {
26 day++;
27 }
28 }
29
30 // 输出结果
31 cout << day << endl;
32
33 // 关闭文件
34 fclose(stdin);
35 fclose(stdout);
36}
37
38int main() {
39 solve();
40 return 0;
41}