浅谈C++

2023-11-01

 

 引子:

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化。C++中对文件操作需要包含头文件< fstream > 。

C++提供了丰富的文件操作功能,你可以使用标准库中的fstream库来进行文件的读取、写入和定位等操作。文件操作在许多应用中非常常见,例如读取配置文件、处理日志、存储数据等。

首先,你需要包含`<fstream>`头文件,然后可以创建不同类型的文件流对象,如ifstream、ofstream和fstream,它们分别用于读取、写入和读写文件。

对于文件的读取,你可以使用ifstream对象。通过调用`open()`函数并指定文件名,你可以打开一个文件进行读取操作。然后,你可以使用`>>`和其他输入操作符从文件中读取数据,或者使用`getline()`函数逐行读取文件内容。

对于文件的写入,你可以使用ofstream对象。同样,通过调用`open()`函数并指定文件名,你可以打开一个文件进行写入操作。然后,你可以使用`<<`和其他输出操作符将数据写入文件中。

除了读取和写入文件,你还可以使用fstream对象进行读写混合的文件操作。例如,你可以使用`seekg()`和`seekp()`函数定位文件指针,以便在文件中进行随机读写操作。`tellg()`和`tellp()`函数可以获取文件指针的当前位置。

在进行文件操作时,记得检查文件是否成功打开,并确保在不再需要使用文件时关闭它。你可以使用`is_open()`函数检查文件是否成功打开,使用`close()`函数关闭文件。

除了基本的文件读写操作,C++还提供了其他功能,如二进制文件的读写、文件的追加写入、文件错误处理等。你可以根据具体需求查阅C++的相关文档,深入学习和应用这些功能。

在进行文件操作时,应注意文件路径的正确性,避免发生文件找不到或无法读取的问题。此外,操作文件时要考虑文件锁定和并发访问等问题,确保线程安全性和资源的正常释放。

总之,C++的文件操作功能非常强大和灵活,使你能够轻松处理各种文件操作需求。合理运用文件操作,可以简化代码、提高效率,并为数据的存储和管理提供便利。

 

一.基本知识: 

1.1文件类型

文件类型分为两种:
1.文本文件–文件以文本的ASCII码形式存储在计算机中。
2二进制文件·文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。

1.2操作文件分类 

 操作文件的三大类:

1. ifstream:读操作     io对应读写

2.ofstream:写操作

3. fstream :读写操作

1.3文件步骤

1.包含头文件
#include <fstream>

2.创建流对象
ofstream ofs;

3.打开文件
ofs.open("文件路径",打开方式);

4.写数据
ofs <<"写入的数据";

5.关闭文件
ofs.close();

1.4文件打开方式

ios.in 为读文件而打开文件
ios:out 为写文件而打开文件
ios:.ate 初始位置:文件尾
ios:.app 追加方式写文件
ios::trunc 如果文件存在先删除,再创建
ios::binary 二进制方式

注意:文件打开方式可以配合使用,利用|操作符例如:用二进制方式写文件ios::binary |ios: : out

 写文件代码实例:

#include <iostream>
#include <fstream>
using namespace std;
void fun() {
	//1.头文件
	//2.创建流对象
	fstream ofs;
	//3.指定打开方式
	ofs.open("test.txt", ios::out);
	//4.写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	//5.关闭文件
	ofs.close();
}
int main() {
	fun();
	return 0;
}

写文件可以用ofstream或 fstream 

读文件代码实例:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void fun() {
	//1.头文件
	//2.创建流对象
	fstream ofs;
	//3.指定打开方式
	ofs.open("test.txt", ios::out);
	//4.写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	//5.关闭文件
	ofs.close();
}

void fun1() {
	ifstream ofs;
	ofs.open("test.txt", ios::in);
	//ofs.is_open()打开失败返回false
	if (!ofs.is_open()) {
		cout << "文件打开失败" << endl;
	}
	//读数据
	// 
	//第一种
	char buf[1024] = { 0 };
	//ofs按行输入到buf中,每次循环覆盖上一次
	while (ofs >> buf) {
		cout << buf << endl;
	}

	//第二种
	char buf1[1024] = { 0 };
	//和第一种一样,限定最大的大小
	while(ofs.getline(buf1, sizeof(buf1)) ){
		cout << buf1 << endl;
	}
	//第三种
	string buf2;
	//从ofs输入到buf2中
	while (getline(ofs, buf2)) {
		cout << buf2 << endl;
	}

	//第四种,不推荐
	char c;
	while ((c=ofs.get())!=EOF) {
		cout << c;
	}
	ofs.close();
}
int main() {
	fun();
	fun1();
	return 0;
}

总结:
·读文件可以利用ifstream ,或者ftream类

·利用is_open函数可以判断文件是否打开成功

. close关闭文件

二.二进制读取和写入

代码实例:

#include <iostream>
//1.头文件
#include <fstream>
using namespace std;
class person {
public:
	int age;
	const char *name;    //C++要加const,学到了
};

void fun() {
	//2.打开数据流(读写模式)
	fstream ofs;
	//3.打开文件
	ofs.open("erjinzhi.txt", ios::out | ios::binary);
	//4.写数据
	person p;
	p.age = 18;
	p.name = "tom";
	ofs.write((const char*)&p,sizeof(person));
	p.age = 19;
	p.name = "tony";
	ofs.write((const char*)&p, sizeof(person));
	//5.关闭文件
	ofs.close();
}

void read() {
	//2.打开数据流模式
	fstream ofs;
	//3.打开文件
	ofs.open("erjinzhi.txt", ios::in | ios::binary);
	if (!ofs.is_open()) {
		cout << "打开失败" << endl;
	}
	//4.读数据
	person p;
	ofs.read((char*)&p, sizeof(p));
	cout << p.age << endl;
	cout << p.name << endl;
	ofs.read((char*)&p, sizeof(p));
	cout << p.age << endl;
	cout << p.name << endl;
	ofs.close();
}
int main() {
	fun();  //写文件
	read();
	return 0;
}

ofs.write((const char*)&p,sizeof(person));

ofs.open("erjinzhi.txt", ios::in | ios::binary);

注意这两个函数的用法即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈C++ 的相关文章

  • 在 iOS4 中视图控制器即将弹出时收到通知

    这个问题以前有人问过 但我能找到的答案是 2009 年的 不适合我的问题 让我重申一下这个问题 我有一个UINavigationController产生并推动许多不同的UIViewControllers 入栈 其中之一涉及一些核心数据操作
  • UITextField 的自定义字体在编辑模式下发生变化

    我有一个UITextField这是从 xib 加载的 在它的视图控制器中viewDidLoad方法中 我将字体设置为自定义值 该值在 plist file和所有 它显示良好 除非处于编辑模式 此时字体从我的自定义字体切换为默认字体 我认为这
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • 使用不同的苹果帐户更新 XCODE

    我的操作系统是 MAC 10 7 3 xcode 4 3 1 使用不同的 apple id 安装 因为我的 macbook pro 以前被我的朋友使用过 现在 当我尝试将 Xcode 升级到 4 3 2 时 它会询问我朋友帐户的凭据 不幸的
  • didReceiveRemoteNotification 将用户带到正确的视图

    我有一个聊天应用程序 当发送新消息时 我的服务器会发送推送通知 我遇到的问题是如何将用户带到正确的视图 我正在发送一个channelID在推送通知中 但我如何检索它并将用户带入实际对话 我使用此代码来检测何时单击推送通知 void appl
  • 当前收据无效或不匹配的 ds 人员 ID

    我正在尝试测试 MacOS 的应用内购买 输入测试用户凭据后 App Store 抱怨 当前收据无效或 ds 人员 ID 不匹配 并且购买失败 我尝试了很多方法来解决这个问题 获取 App Store 收据 http www kotanco
  • NSView 鼠标跟踪

    我在 Mac OS X 上遇到了 Cocoa NSView 的奇怪行为 我在 NSView 容器中有一个自定义 NSView 这个自定义 NSView 跟踪鼠标移动 点击 并有一个工具提示 当我在所描述的视图上方添加 NSView 时 即使
  • 理解 Objective-C 中选择器的唯一性

    我无法理解 选择器 的部分功能 如苹果指南中所述 我把我感到困惑的部分加粗了 在 Objective C 中 选择器有两个含义 可以用来参考 当在源代码消息中使用方法时 只需使用方法的名称 到一个物体 不过 它也指的是唯一标识符 编译源代码
  • iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放

    我正在将图像制作成视频 但总是因为内存警告而崩溃 分配太多CVPixelBufferCreate 我不知道如何正确处理 我看过很多类似的主题 但没有一个能解决我的问题 这是我的代码 void writeImagesArray NSArray
  • 自定义 UITableViewCell 错误

    我收到此错误 Terminating app due to uncaught exception NSUnknownKeyException reason
  • 使用 NSDateFormatter 和 TimeZone(不带 GMT 时间修饰符)将 NSDate 转换为 NSString

    我正在初始化我的 NSDateFormatter NSDateFormatter dateFormatter NSDateFormatter alloc init autorelease dateFormatter setLocale NS
  • 是否可以对 UILabel 的文本颜色变化进行动画处理? [复制]

    这个问题在这里已经有答案了 UIView animateWithDuration 5 animations myLabel textColor UIColor redColor 标签文本颜色立即改变 Try this UIView tran
  • 有 Mac 版的 IE 测试器吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Objective C 宏附加到字符串

    我认为这是一件非常简单的事情 但由于我是 iOS 开发和 Objective C 的新手 所以我无法弄清楚 define RESTFUL PATH PREFIX https gogch com gch restful define LOGI
  • 为什么我无法更改 UIBarButtonItem 的标题?

    我想改变UIBarButtonItem s title 但这段代码不起作用 void viewDidLoad self smay void smay AppDelegate apd AppDelegate UIApplication sha
  • 在两个可移动 uiview 之间画线

    我有一个带有节点的 滚动视图 UIViews 可以拖动 我正在尝试在选定的之间绘制边缘UIViews使用 calayer 但我不知道当视图位置发生变化时如何重新绘制线条 In my viewControllerI 类在节点数组中添加第一个和
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 在提交到 Mac App Store 的应用程序中调用 openssl 是否可以接受?

    我有点不清楚调用提交到 App Store 的应用程序之外的进程的规则是什么 我读到 如果您想使用 Cocoa 和 OSX 库之外的其他库 框架 您必须将其包含在您的应用程序中 例如 如果使用 QT Python 或 Ruby 编写应用程序
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代

随机推荐

  • python安装cv2

    pip install opencv python
  • [开发过程]<RTOS>关于RT-Thread

    以前一直折腾FreeRTOS 没时间折腾RT Thread 虽然暂时对RT Thread学的不深 但是从学习难度和社区支持来看 相信多年后RT Thread会成为主流 大概是因为很多RT Thread的中文资料吧 入门还要先学FreeRTO
  • matlab工作区显示的是什么,matlab工作区介绍

    Workspace 工作区窗口 Command History 指令历史记录窗口 Current Directory 当前目录选择窗口 主要内容 Matlab简介 数组和矩阵 Matlab绘图 Matlab Workspace 工作区窗口
  • Spring oauth2.0 刷新token后设置原token5分钟内继续可用

    默认情况下刷新token后原token会立马不可用 但是在某些情况下我们需要刷新token后原token在一定时间内继续可用 例如微信的刷新token 通过查看DefaultTokenServices中的刷新token方法refreshAc
  • 栈破坏检测

    在C C 语言中 由于代码书写人员能够直接通过指针来操作内存的内容 在通常的时候没有可靠的方法来防止对数组的越界访问读写操作 但是 我们可以在发生了越界访问的时候 在没有造成任何有害结果之前 尝试检测到他 栈保护机制是在栈帧中任何局部缓冲区
  • Maven之pom.xml文件中的Build配置

    Maven之pom xml文件中的Build配置 前言 在日常的开发中 我们经常使用maven来管理和构建我们的项目 即使现在使用了各种springboot等方便快捷的框架 jar包的引入也是通过maven来进行的 因此有必要了解pom x
  • Batch和Epoch之间的区别是什么?

    写在前面 快速理解 随机梯度下降 SGD 是一种迭代学习算法 它使用训练数据集来更新模型 Batch 批量 大小是梯度下降算法的超参数 在模型的内部参数更新之前控制训练样本的数量 一个周期内一次批量训练的样本数 Epoch数是梯度下降算法的
  • python 图片与二进制之间的转换

    一 PIL格式图片转成二进制 先读取为PIL格式 再转为二进制 import io import base64 from PIL import Image def image2byte image 图片转byte image 必须是PIL格
  • java代码分层 handle_java 代码分层

    JAVA代码层次 阿里推荐 开放接口层 可直接封装 Service 方法暴露成 RPC 接口 通过 Web 封装成 http 接口 进行 网关安全控制 流量控制等 终端显示层 各个端的模板渲染并执行显示的层 当前主要是 velocity 渲
  • PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR

    lr scheduler 学习率 学习率的参数调整是深度学习中一个非常重要的一项 Andrew NG 吴恩达 认为一般如果想调参数 第一个一般就是学习率 作者初步学习者 有错误直接提出 热烈欢迎 共同学习 感谢Andrew ng的机器学习和
  • easyui tabs 一个窗口修改完成后刷新另一个窗口

    在一个tab中添加或删除数据后 要改变主页 相当于链接的另一个tab 的内容 1 在要刷新的窗口的初始化中添加 js 刷新方法 并保存到 window top 中 window top Refresh CloudHomePage Conte
  • 二、基础平滑、面积折线图与折线堆叠、面积堆叠《手把手教你 ECharts 数据可视化详解》

    注 本系列教程需要对应 JavaScript html css 基础 否则将会导致阅读时困难 本教程将会从 ECharts 的官方示例出发 详解每一个示例实现 从中学习 ECharts ECharts 官方示例 https echarts
  • Mybatis学习(二)--getMapper接口绑定方案和多参数传值

    在Mybatis的基础使用中 如果想向一个sql语句中传递多个参数 只能将parameterType设置为某个类或者Map 不能直接传入多个参数 接口绑定方案可以实现直接传入多个参数 Mybatis的接口绑定方案与基本的使用方法不同的地方在
  • unity 射线获取坐标

    射线 碰到障碍物就会断开 鼠标点击屏幕获得一个二维坐标 通过相机的射线转换为三维世界坐标 private Vector3 worldPos 鼠标点击的点所对应的世界里面的位置 点击鼠标右键 if Input GetMouseButton 1
  • ThinkPHP文件包含漏洞分析

    出品 长白山攻防实验室 ID A Tree 0x00 声明 以下内容 来自长白山攻防实验室的A Tree作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责
  • Vue3集成高德地图方法

    1 注册高德开发者账号 获取key和安全密钥 2 下载依赖 可参考高德官方文档 https lbs amap com api jsapi v2 guide webcli map vue1 npm i amap amap jsapi load
  • GD32f103 8M晶振改12M , 要修改的地方

    手里的单片机是gd32f103ret6 晶振和官方库默认的8M不一致 导致串口乱码 网上找了好久全是STM32的例子 不过还是有参考意义的 以下是gd32f10x 的设置方式 1 Keil中的Target设置 PS 这一项好像会自动设置 安
  • 7、变量进阶

    7 变量进阶 理解 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1 1 引用的概念 在 Py
  • [论文阅读]《how to share a secret》

    how to share a secret Adi Shamir 文章主要讲了如何将数据D分为n份 任意k份可以重组成D 任意k 1份不会泄露任何关于D的信息 这种技术能为密码系统构建鲁棒的密钥管理机制 即使灾难破坏一半信息或者安全性被破坏
  • 浅谈C++

    引子 程序运行时产生的数据都属于临时数据 程序一旦运行结束都会被释放通过文件可以将数据持久化 C 中对文件操作需要包含头文件 lt fstream gt C 提供了丰富的文件操作功能 你可以使用标准库中的fstream库来进行文件的读取 写