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); // 从文件中读取一行,存入unamegetline(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); // 创建字符对象,并初始化\0char* line = new char(0);const char* space = " ";while (readFile >> cnt) { // 遇到 空格/换行 结束,直到读取结束,文件位置指针为-1cout << cnt << endl;strcat(line, cnt);strcat(line, space);cout << line << endl;}// std::getline 逐行读取,读取结束文件位置指针为-1// getline(readFile, string cnt) 读取一行,存入cntcout << "读取结束的文件指针:" << 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.mzph.cn/bicheng/40615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 面试【★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Matplotlib 简介

import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4]) plt.ylabel(some numbers) plt.show() 当使用plot只传入单个数组时&#xff0c;matplotlib会认为这是y的值&#xff0c;并自动生成长度相同&#xff0c;但是从0开始的x值&#xff0c;所以这里的x会自动生成为 [0,1,2,…

【代码随想录】【算法训练营】【第57天】 [卡码99]岛屿数量 [卡码100]岛屿的最大面积

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 57&#xff0c;周三&#xff0c;再ding一下~ 题目详情 [卡码99] 岛屿数量 题目描述 卡码99 岛屿数量 LeetCode类似题目200 岛屿数量 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#…

Android adb logcat日志过滤输出

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

销毁终结者:IT 采购必知:高效数据销毁服务 文件销毁 硬盘销毁 数据销毁 销毁

在 IT 领域&#xff0c;设备的更新换代是常态&#xff0c;但旧设备中残留的数据却可能成为企业的潜在威胁。为了保障企业的数据安全&#xff0c;专业的数据销毁服务不可或缺。 我们专注于提供高效的文件销毁、数据销毁和硬盘销毁服务&#xff0c;确保您的企业信息得到妥善处理…

JavaScript懒加载图像

懒加载图像是一种优化网页性能的技术&#xff0c;它将页面中的图像延迟加载&#xff0c;即在用户需要查看它们之前不会立即加载。这种技术通常用于处理大量或大尺寸图像的网页&#xff0c;特别是那些包含长页面或大量媒体内容的网站。 好处 **1. 加快页面加载速度&#xff1a…

视频监控平台web客户端的免密查看视频页:在PC浏览器上如何调试手机上的前端网页(PC上的手机浏览器的开发者工具)

目录 一、手机上做前端页面开发调试 1、背景 2、视频监控平台AS-V1000的视频分享页 3、调试手机前端页面代码的条件 二、手机端的准备工作 1、手机准备 2、手机的开发者模式 3、PC和手机的连接 &#xff08;1&#xff09;进入调试模式 &#xff08;2&#xff09;选择…

#数据结构 笔记三

二叉树 1. 概念 二叉树Binary Tree是n个结点的有限集合。它或者是空集n0&#xff0c;或者是由一个根结点以及两颗互不相交、分别称为左子树和右子树的二叉树组成。 二叉树与普通有序树不同&#xff0c;二叉树严格区分左子和右子&#xff0c;即使只有一个子结点也要区分左右。…

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…

【虚拟机】虚拟机网络无法访问问题【已解决】

【虚拟机】虚拟机无法上网问题【已解决】 问题探究解决方法法1&#xff1a;查看相关“网络服务”是否处于正常启动状态法2&#xff1a;重启网络法3&#xff1a;重新安装VMWare法4&#xff1a;使用NAT模式&#xff0c;每次打开win7都没连上网的解决办法 问题探究 安装了很多个虚…

上位机图像处理和嵌入式模块部署(mcu项目1:实现协议)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 这种mcu的嵌入式模块理论上都是私有协议&#xff0c;因为上位机和下位机都是自己开发的&#xff0c;所以只需要自己保证上、下位机可以通讯上&…

Feign 原理流程图练习-01

目录 作业: 老师给的参考流程图 要求 解答 知识扩展 Feign基础原理 接口定义 代理对象生成 请求调用 请求发送 响应处理 容错与熔断 总结 作业: 老师给的参考流程图 pdf版本 【金山文档 | WPS云文档】 Feign https://kdocs.cn/l/ctbagIyxN348 ​ 要求 结合上面…

基于Redisson实现分布式锁

基于redisson实现分布式锁 之前背过分布式锁几种实现方案的八股文&#xff0c;但是并没有真正自己实操过。现在对AOP有了更深一点的理解&#xff0c;就自己来实现一遍。 1、分布式锁的基础知识 分布式锁是相对于普通的锁的。普通的锁在具体的方法层面去锁&#xff0c;单体应…

班迪录屏(Bandicam)7.0下载以及安装教程

最近有小伙伴私信我&#xff0c;问我有没有好用的录屏工具&#xff0c;今天给大家分享一个我一直在使用的录屏工具&#xff0c;也是解锁了V1P版本&#xff0c;绿色版打开就可以使用~ Bandicam录屏&#xff08;PC&#xff09; Bandicam录屏是一款专为捕捉屏幕精彩瞬间而设计的…

PHP家政服务预约单开版微信小程序系统源码

&#x1f3e0; —— 便捷生活&#xff0c;从指尖开始&#x1f4aa; &#x1f308;【开篇&#xff1a;家政新风尚&#xff0c;一键触达】 在忙碌的生活节奏中&#xff0c;你是否渴望拥有一个温馨、整洁的家&#xff0c;却又苦于找不到合适的家政服务&#xff1f;现在&#xff…

EXTI寄存器,AFIO的简洁,EXTI配置的流程

一&#xff0c;AFIO简介 AFIO是Alternate Function Input/Output 的缩写&#xff0c;表示复用功能IO&#xff0c;主要用于实现IO端口的复用功能以及外部中断的控制 STM32外设有很多I/O以及内置外设&#xff08;如12C&#xff0c;ADC,ISP,USART等&#xff09;。为节省引出管脚的…

初试成绩占比百分之70!计算机专硕均分340+!华中师范大学计算机考研考情分析!

华中师范大学&#xff08;Central China Normal University&#xff09;简称“华中师大”或“华大”&#xff0c;位于湖北省会武汉&#xff0c;是中华人民共和国教育部直属重点综合性师范大学&#xff0c;国家“211工程”、“985工程优势学科创新平台”重点建设院校&#xff0c…

PhysioLLM 个性化健康洞察:手表可穿戴设备实时数据 + 大模型

个性化健康洞察&#xff1a;可穿戴设备实时数据 大模型 提出背景PhysioLLM 图PhysioLLM 实现数据准备用户模型和洞察生成个性化数据总结和洞察是如何生成的&#xff1f; 解析分析 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.19283 虽然当前的可穿戴设备伴随应用&…

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

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

vue使用scrollreveal和animejs实现页面滑动到指定位置后再开始执行动画效果

效果图 效果链接&#xff1a;http://website.livequeen.top 介绍 一、Scrollreveal ScrollReveal 是一个 JavaScript 库&#xff0c;用于在元素进入/离开视口时轻松实现动画效果。 ScrollReveal 官网链接&#xff1a;ScrollReveal 二、animejs animejs是一个好用的动画库…