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

文章目录

  • 文件操作
  • 文件对象其他方法
  • 异常处理

文件操作

  • 需要头文件
    • <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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免杀笔记 ---> PE

本来是想先把Shellcode Loader给更新了的&#xff0c;但是涉及到一些PE相关的知识&#xff0c;所以就先把PE给更了&#xff0c;后面再把Shellcode Loader 给补上。 声明&#xff1a;本文章内容来自于B站小甲鱼 1.PE的结构 首先我们要讲一个PE文件&#xff0c;就得知道它的结构…

MySQL之备份与恢复(四)

备份与恢复 存储引擎和一致性 3.复制 从备库中备份最大的好处是可以不干扰主库&#xff0c;避免在主库上增加额外的负载。这是一个建立备库的好理由&#xff0c;即使不需要用它做负载均衡或高可用。如果钱是个问题&#xff0c;也可以把备份用的备库用于其他用户&#xff0c;…

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比&#xff0c;同时还可以兼容ubuntu、安卓等多种操作系统&#xff0c;今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

小龙虾优化24种机器学习多输入单输出回归|时序预测模型

小龙虾优化24种机器学习多输入单输出回归|时序预测模型 文章目录 小龙虾优化24种机器学习多输入单输出回归|时序预测模型前言一、小龙虾优化基本原理二、优化机器学习模型1.COA-CNN-BiGRU-Attention回归模型2.基于小龙虾优化支持向量机的数据回归预测Matlab程序COA-SVM 多特征输…

Android EditText的属性与用法

EditText 是编辑框控件&#xff0c;可以接收用户输入&#xff0c;并在程序中对用户输入进行处理。EditText在App里随处可见&#xff0c;在进行搜索、聊天、拨号等需要输入信息的场合&#xff0c;都可以使用 EditText。 图1 编辑框示意图 EditText 是TextView的子类&#xff0c…

sql语句练习注意点

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感

最终效果 文章目录 最终效果前言素材下载&#xff1a;玩家移动跳跃控制攻击动画配置轻攻击重攻击 攻击时禁止移动和攻击移动补偿敌人击退和播放受击动画受击特效攻击停顿和屏幕震动局部顿帧&#xff08;补充&#xff09;参考源码完结 前言 注意本文为自己的学习记录笔记&#…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过

WCCI 2024第三弹&#xff1a;忍者表演惊艳全场&#xff0c;盛大晚宴不容错过&#xff01; 会议之眼 快讯 会议介绍 IEEE WCCI&#xff08;World Congress on Computational Intelligence&#xff09;2024&#xff0c;即2024年IEEE世界计算智能大会&#xff0c;于6月30日至7月…

React@16.x(47)路由v5.x(12)源码(4)- 实现 Route

目录 1&#xff0c;原生 Route 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Route 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route } from "react-router-dom"; function News() {return <div>News</div>; }func…

使用SSE实现echarts数据实时更新

区别 SSE 和 WebSocket 原理和实现方式的区别 SSE( Server-Sent Events) SSE 是基于传统的 HTTP 协议实现的&#xff0c;采用了长轮询&#xff08;long-polling&#xff09;机制。客户端通过向服务器发送一个 HTTP 请求&#xff0c;服务器保持连接打开并周期性地向客户端发送…

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

Android adb logcat日志过滤输出

Android adb logcat日志过滤输出 adb logcat 输出所有Android设备上的日志。 adb logcat *:Error 过滤输出日志级别只为Error的日志。 过滤某些标签或tag&#xff0c;依次执行: adb shell logcat grep | "你的标签或tag" Android Studio level过滤查看各个等级的日志…

Oracle连接mysql

oracle使用的11g&#xff0c;在一台windows服务器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一台windows服务器&#xff0c;这两个服务器之间的网络是互通的。做BI时&#xff0c;要获取不同数据源的数据&#xff0c;这些数据源可能是Oracle&#xff0c;也可能是sqlserv…

股票分析-20240628

今日关注&#xff1a; 20240626 六日涨幅最大: ------1--------300386--------- 飞天诚信 五日涨幅最大: ------1--------300386--------- 飞天诚信 四日涨幅最大: ------1--------300386--------- 飞天诚信 三日涨幅最大: ------1--------300386--------- 飞天诚信 二日涨幅最…

【pytorch14】感知机

单层感知机模型 对于单层的感知机&#xff0c;它的激活函数是一个sigmoid 对于符号的定义做一个规范化&#xff0c;输入层每一层进行一个编号 输入是第0层&#xff0c;上标0表示属于输入层&#xff0c;下标0到n表示一共有n个节点(这里严格来说应该是0~n-1&#xff0c;为了书写…

Zoom使用的基本步骤和注意事项

Zoom是一款功能强大的视频会议软件&#xff0c;广泛应用于远程办公、在线教育、团队协作等多个场景。以下是Zoom使用的基本步骤和注意事项&#xff1a; 一、注册与登录 注册Zoom账户&#xff1a; 访问Zoom官方网站&#xff08;如zoom.us&#xff09;&#xff0c;点击“注册”…

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)

Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing 一、蒙特卡洛积分 Monte Carlo Integration二、路径追踪 Path tracing1.Whitted-Style Ray Tracings Problems2.只考虑直接光照时3.考虑全局光照①考虑物体的反射光②俄罗斯轮盘赌 RR &#xff08;得到正确shade函数&#x…

精准畜牧业:多维传感监测及分析动物采食行为

全球畜牧业呈现出一个动态且复杂的挑战。近几十年来&#xff0c;它根据对动物产品需求的演变进行了适应&#xff0c;动物生产系统需要提高其效率和环境可持续性。在不同的畜牧系统中有效行动取决于科学技术的进步&#xff0c;这允许增加照顾动物健康和福祉的数量。精准畜牧业技…

JavaScript-WebAPI

文章目录 JS组成什么是 webApis 和APIDOM 简介document 对象 获取 DOM 对象利用css选择器来获取DOM元素选择指定css选择器的所有元素其他获取DOM元素方法&#xff08;了解&#xff09; 操作元素内容对象.innerText对象.innerHTML 操作元素属性操作元素常用属性操作元素样式属性…