C++ 教程 - 08 文件操作与异常处理

news/2024/7/7 20:25:46 标签: c++, 文件处理, 异常处理

文章目录

文件操作

  • 需要头文件
    • <iostream>
    • <fstream>
      • 读取文件 ifstream obj; obj.open(const char* filename, std::in)
      • 写入文件ofstream obj; obj.open(const char* filename, std::out)
      • 读、写文件 fstream,包含了ifstream、ofstream两者的功能;
      • open 的其他方式
        • ios::app ,追加写入;
        • ios::in, 读取方式;
        • ios::out,写入方式;
        • ios::trunc,截断(清空内容)
        • ios::in | ios::out,读写方式
  • 读写案例,让用户输入用户名、密码,存入 userInfo.txt 文件中,并从文件中读取,然后打印到控制台;
#include <iostream>
#include <fstream>  // 文件操作
#include <string>
#include <cstring> // C的字符串操作
using namespace std;


int main() {
	
	// 创建写入的文件对象
	ofstream writeFile;
	// 以写的方式 打开文件
	writeFile.open("userInfo.txt", ios::out);  // ios::in | ios::out 读写方式
	
	// 提示信息
	cout << "输入用户名:";
	char* username = new char;
	char* password = new char;
	cin >> username; // 扫描用户输入信息,遇到空格、换行则结束本次扫描,从空格/换行的下一个位置就绪 流提取

	cout << "输入密码:";
	cin >> password;

	//cout << strcat(username, password) << endl;
	
	// 流插入  写入文件
	writeFile << "用户名:" << username << endl; // 写入一行
	writeFile << "密码:" << password << endl;

	// 关闭文件,(程序退出时也会自动关闭文件)
	writeFile.close();


	// 读取文件,并逐行打印
	ifstream readFile;
	readFile.open("userInfo.txt", ios::in); // 以读取方式打开文件

	cout << "\n读取文件:" << endl;
	string uname, passwd;
	getline(readFile, uname); // 从文件中读取一行,存入uname
	getline(readFile, passwd);
	cout << uname << endl;
	cout << passwd << endl;

	return 0;
}

cin 标准输入在流提取时,遇到空格/换行则结束;
cin.getline(char* xx, streamsize count) 提取一行,默认遇到换行结束;
在这里插入图片描述
 

文件对象其他方法

  • (读取)文件对象的相关方法:
    • file.tellg(),获取指针位置,刚打开的文件处于0位置,数据部分指针[0, n],读取结束指针为-1(无法再移动指针);
    • file.seekg(10, ios::beg),从文件的开始位置,向后移动10个字符;
    • file.seekg(-2, ios::cur), 从当前位置,向前移动2个字符;
    • file.seekg(0, ios::end),从末尾位置向前移动0个字符,即定位到末尾位置;
    • file.get() 读取一个字符,返回字符对应的ASCII码值;
    • file.getline(char* cnt, streamsize count),读取一行(count-1个字符),存入字符指针;
    • file.read(char*, numChar),读取num个字符,存入字符数组中;
    • file >> cnt,以流提取方式读取内容,存入cnt;
    • file.is_open() 文件对象是否打开;
    • file.close(),关闭文件
  • (写入)文件对象的方法:
    • writeFile.tellp(),获取文件指针位置;
    • writeFile.seekp(2, ios::cur),移动文件指针位置;
    • writeFile.put(char c) ,写入一个字符;
    • writeFile.write(const char*, streamsize count) 写入一个字符串,count为字符个数;
    • 流插入写入 writeFile << cnt; 将cnt内容 / 值 以流插入方式写入;

 

  • 写入案例
#include <iostream>
#include <fstream>
#include <string>
#include <cstring> // C的字符操作
using namespace std;


int main(){
    // 写入文件
    ofstream writeFile;
    writeFile.open("save.txt", ios::out); // 写入方式,覆盖已有内容

    if (!writeFile.is_open()) {
        cout << "文件打开失败" << endl;
        // 程序退出
        exit(-1);
    }

    const char* cnt = "hello, my name is jack.\n";

    // 写入一行字符串
    writeFile.write(cnt, strlen(cnt)); // strlen 计算字符的个数

    cnt = "second line.\n";
    writeFile.write(cnt, strlen(cnt));

    // 流插入  写入
    int a = 5;
    writeFile << a << endl;
    const char* name = "lucy li";
    writeFile << name << endl;
    string addr = "beijing zhong guan cun";
    writeFile << addr << endl;

    // 关闭文件
    writeFile.close();

    return 0;
}

  • 读取案例,逐行读取上例save.txt文件中的内容;
#include <iostream>
#include <fstream>
#include <string>
#include <cstring> // C的字符操作
using namespace std;


int main(){
    // 写入文件
    ifstream readFile;
    readFile.open("save.txt", ios::in); // 读取方式

    if (!readFile.is_open()) {
        cout << "文件打开失败" << endl;
        // 程序退出
        exit(-1);
    }

    // 流提取 读取
    char* cnt = new char(0); // 创建字符对象,并初始化\0
    char* line = new char(0);
    const char* space = " ";
    while (readFile >> cnt) { // 遇到 空格/换行 结束,直到读取结束,文件位置指针为-1
        cout << cnt << endl;
        strcat(line, cnt);
        strcat(line, space);
        cout << line << endl;
    }

    // std::getline 逐行读取,读取结束文件位置指针为-1
    // getline(readFile, string cnt) 读取一行,存入cnt
    cout << "读取结束的文件指针:" << readFile.tellg() << endl;
   
    // 关闭文件
    readFile.close();


    return 0;
}

在这里插入图片描述

 

异常处理

  • 需要头文件<exception>
  • try { xx } catch (异常类 obj){ } ,可同时使用多个catch代码块捕获多个异常;
  • catch(…){ }, 捕获所有的异常;
  • throw XXX( ) 抛出异常;
  • class MyException: public exception{ } 自定义异常;
  • C++ 提供的标准异常,以继承关系表示;
    在这里插入图片描述
    在这里插入图片描述
#include <iostream>
#include <exception>
using namespace std;


// 定义自己的异常类
class MyException : public exception
{
public:
    string args;
    // 不会继承父类的构造函数
    MyException() {}
    MyException(const string& args) {
        this->args = args;
    }
    virtual ~MyException() {
        cout << "删除对象" << endl;
    }

    //重写 what 虚函数
    const char* what() const throw ()
    {
        // 重写函数体
        return this->args.c_str(); // 转为C字符串,返回值拷贝
    }
};


int main(){
    try
    {
        // 执行的代码,手动抛出异常
        throw MyException("my defined exception");
    }
    catch (const MyException& e)
    {
        cout << "MyException caught" << endl;
        cout << e.what() << std::endl;
    }
    catch (const exception& e)
    {
        //其他的异常
        cout << "其他的异常" << endl;
    }

    return 0;
}

 


http://www.niftyadmin.cn/n/5535161.html

相关文章

2024.7.4

2024.7.4 【又苦又甜&#xff0c;也挺好嘛&#xff0c;很像生活】 Thursday 五月廿九 <theme oi-“graph theory”> P2865 [USACO06NOV] Roadblocks G 主要就是求一个严格次短路&#xff0c;但是有一定条件&#xff0c; 道路可以连续走 我们先求解出最短路&#xff0…

探索 ES6:现代 JavaScript 的新特性

随着 JavaScript 的不断演进&#xff0c;ECMAScript 2015&#xff08;简称 ES6&#xff09;作为 JavaScript 的一次重大更新&#xff0c;带来了许多新特性和语法改进&#xff0c;极大地提升了开发体验和代码质量。本文将详细介绍 ES6 的主要新特性&#xff0c;并展示如何在实际…

最近,被“AI”狠狠刷屏了......

最近&#xff0c;被“AI”狠狠刷屏了。 作为时下最热门的话题&#xff0c;AI画图、AI配音、AI写文案、AI做视频......AI在最近两年可谓是火遍全球。ChatGPT、Midjourney和SORA等技术不断涌现&#xff0c;不仅深刻改变着我们的生活方式&#xff0c;也推动了AI技术的飞速发展。 …

深入浅出:npm 常用命令详解与实践

在现代的前端开发流程中&#xff0c;npm&#xff08;Node Package Manager&#xff09;已经成为了不可或缺的一部分。它不仅帮助我们有效地管理项目中的依赖包&#xff0c;还提供了一系列强大的命令来优化开发体验。在这篇博客中&#xff0c;我们将深入探讨 npm 的常用命令&…

PyTorch实战OCR:CRNN与CTC Loss详解——深度学习图像转文字(2)

文章目录 一、CRNN&#xff08;卷积递归神经网络&#xff09; 1.1 CRNN介绍与网络结构 1.1.1 网络结构 二、网络结构详解 2.1 CNN 2.2 Map-to-Sequence2.3 RNN2.3 CTC Loss 2.3.1 序列合并机制 2.3.2 训练阶段2.3.3 划分标准2.3.4 CRNN总结结 一、CRNN&#xff08;卷积…

线性代数基础概念:矩阵

目录 线性代数基础概念&#xff1a;矩阵 1. 矩阵的定义 2. 矩阵的运算 3. 矩阵的特殊类型 4. 矩阵的秩 5. 矩阵的初等变换 6. 矩阵的特征值与特征向量 7. 矩阵的应用 8. 矩阵总结 总结 线性代数基础概念&#xff1a;矩阵 矩阵是线性代数中的另一个重要概念&#xff0…

kafka(一)原理(2)组件

一、broker 1、介绍 kafka服务器的官方名字&#xff0c;一个集群由多个broker组成&#xff0c;一个broker可以容纳多个topic。 2、工作流程 3、重要参数 参数名称 描述 replica.lag.time.max.ms ISR中&#xff0c;如果Follower长时间未向Leader发送通信请求或同步数据&a…

Django项目 - 合并PDF文件

合并PDF文件可以很好将信息做整合。 博主实现了下面功能&#xff1a; 检测上传的文件是否是PDF从本地拖拽PDF文件到该系统显示需合并文件总数对需合并PDF文件进行排序&#xff0c;删除可预览合并PDF文件下载合并好的PDF文件 代码存放在码云&#xff1a;代码 创作不易&#…