【C++】文件

news2024/11/26 20:48:48

目录

  • 文件
  • 文件分类
    • 文本文件的读写(ASCII文件)的读写
      • 打开文件
      • 打开文件的方式
      • 关闭文件
      • 将数据写入ASCII文件
      • 从ASCII文件读入数据
    • 二进制存储
    • 对比ASCII和二进制存储
      • 用成员函数read和write读写二进制文件
      • 打开方式
      • 文件的读入与读出

文件

  • 所谓文件,一般指存储在外部介质上数据的集合。
  • 一批数据是以文件的形式存放在外部介质上的
  • 操作系统是以文件的形式存放在外部介质上的。

文件分类

  • 按存储介质
    • 磁盘文件
    • 光盘文件
    • U盘文件
  • 按用途
    • 程序文件
    • 数据文件
  • 按文件中数据的组织形式
  • ASCII文件:以ASCII表示的文件,.txt,.cpp
  • 二进制文件:用二进制形式表示的文件,可以是.o,.exe等程序文件,也可以是特定格式的数据文件

文件流

  • 输出文件流是从内存流向外存文件的数据
  • 输入文件流是从外存文件流向内存的数据
  • 每一个文件流都有一个内存缓存区与之对应
    在这里插入图片描述
  • 文件流本身不是文件,是以文件为输入输出对象的流
  • 要对磁盘文件输入输出,必须通过文件流来实现
  • 文件操作需要流对象,cout,cin是已定义的流对象
  • 文件操作也要定义流对象,例:ofstream outfile;
    在这里插入图片描述

文本文件的读写(ASCII文件)的读写

打开文件

  • 打开文件是指在文件读写之前做必要的准备工作
    (1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件
    (2)指定文件的工作方式

打开文件的两种不同方法
(1)调用文件流的成员函数open,如

 ofstream outfile;//定义输出文件流类对象
 outfile.open("f1.dat",ios::out);

(2)在定义文件流对象时调用文件流类的构造函数

istream infile("c:\\new\\f1.dat",ios::in);

打开文件的方式

ios::in: 供读,文件不存在时,打开失败(ifstream默认的打开方式)
ios::out:供写,文件不存在则创建,若文件已存在,则清空原内容(ofstream默认的打开方式)
ios::ate:文件打开时,指针在文件最后,可改变指针的位置,常和in,out联合常用
ios::app:供写,文件不存在则创建,若文件已存在,则在原文件内容后添加写入新的内容
ios::trunc:在读写前先将文件长度截断为0(默认)
ios::nocreate:文件不存在时产生错误,常用in或app联合使用
ios::noreplace:文件存在时产生错误,常与out联合使用
ios::binary:二进制格式文件

fstream f("d:\\str\\score.dat",ios::in | ios::out | ios::binary);//以读写方式打开二进制文件
  • 打开操作失败,open函数的返回值为0假
if(!outfile.open("fa.dat",ios::app))
{
       cerr<<"open error!";
       exit(1);
}

关闭文件

  • 在对已打开的磁盘文件的读写操作完成后,应关闭该文件。
  • 关闭文件,将缓冲区的数据妥善处理,解除了磁盘文件与文件流的关联,不再通过文件流对该文件进行输入或输出
ofstream outfile("f1.dat",ios::out);
outfile.close();

将数据写入ASCII文件

  • 读入十个数字
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;


int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		a[i] = i;
	}
	
	//打开文件
	ofstream ofs("f1.dat", ios::out);
	
	//读入
	for (int i = 0; i < 10; i++)
	{
		ofs << a[i] << ' ';
	}
	
	//关闭文件
	ofs.close();

	return 0;
}

从ASCII文件读入数据

  • 读出十个数字
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
	int a[10];
	

	//打开文件
	ifstream ofs("f1.dat", ios::in);

	//读出数据
	for (int i = 0; i < 10; i++)
	{
		ofs >> a[i];
	}


	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << ' ';
	}

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

	return 0;
}
  • 读入一行字符,把小写字母字符依次存储在磁盘文件f2.dat中。再把它从磁盘文件读出程序,将其中小写字母改为大写字母,再存入磁盘。
#include <iostream>
#include <fstream>
using namespace std;

void save_to_file()
{
	ofstream outfile("f2.dat");
	char c[80];
	cin.getline(c, 80);
	for (int i = 0; c[i] != '\0'; i++)
	{
		if (c[i] >= 'a' && c[i] <= 'z')
		{
			outfile.put(c[i]);
		}
	}
	outfile.close();
}

void get_from_file()
{
	char ch;
	ifstream infile("f2.dat");
	
	ofstream outfile("f3.dat");
	
	while (infile.get(ch))
	{
		outfile.put(ch - 32);
	}
	infile.close();
	outfile.close();
}


int main()
{
	save_to_file();
	get_from_file();
	return 0;
}

二进制存储

  • 对于数值数据,ASCII数据与二进制形式不同
  • short int类型 12345
    用ASCII形式存储
    在这里插入图片描述
    文件打开是长这样的
    在这里插入图片描述
    如果用二进制形式存储
    其实就是用两个字节(short int)来存储

在这里插入图片描述
而我们打开文件看到的是(有时候会显示出莫名其妙的符号,二进制不是给人看的,是用来存储数据的)
在这里插入图片描述

对比ASCII和二进制存储

  • ASCII文件直观,便于人阅读,但一般占存储空间较多,且需要花费时间转换;
  • 二进制文件是计算机的内部形式,节省空间,且不需要转换,但不能直观显示。
  • 对于字符信息,在内存中是以ASCII形式存放,无论是用ASCII文件输出,还是二进制文件输出,形式一样的。

用成员函数read和write读写二进制文件

打开方式

ofstream ofs("file1.dat",ios::out | ios::binary);
ifstream ifs("file2.dat",ios::in  | ios::binary);

文件读写方式

istream& read(char *buffer,int len);
ostream& write(const char *buffer,int len);
char *buffer 指向内存中的一段存储空间
int len 是读写的字节数
例如:
ofs.write(p1,50)//将p1指向的空间中50个字节存入文件对象ifs
ifs.read(p2,30)//将文件对象b读出30个字节,存之p2指向空间

文件的读入与读出

#include <iostream>
using namespace std;
#include <fstream>

struct student
{
	char name[5];
	int num;
	int age;
	char sex;
};


int main()
{
	student stu[3] =
	{
		{"Li",25,18,'f'},
		{"Wang",32,19,'m'},
		{"Fun",40,16,'f'}
	};
	
	//读到文件里
	ofstream outfile("stu.dat", ios::binary);

	for (int i = 0; i < 3; i++)
	{
		outfile.write((char*)&stu[i], sizeof(stu[i]));
	}
	outfile.close();

	//从文件里读入内存
	student stu1[3];
	ifstream infile("stu.dat", ios::binary);
	for (int i = 0; i < 3; i++)
	{
		infile.read((char*)&stu1[i], sizeof(stu1[i]));
	}
	infile.close();
	
	for (int i = 0; i < 3; i++)
	{
		cout << "No." << i + 1 << endl;
		cout << "Name:" << stu1[i].name << endl;
		cout << "Num:" << stu1[i].num << endl;
		cout << "Age:" << stu1[i].age << endl;
		cout << "sex:" << stu1[i].sex << endl;
	}
	return 0;
}

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

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

相关文章

【Ajax零基础教程】-----第一课 Ajax简介

一、什么是ajax ajax即 Asynchronous javascript And XML (异步 javaScript 和 XML) 是一种创建交互式&#xff0c;快速动态应用的网页开发技术&#xff0c;无需重新加载整个网页的情况下&#xff0c;能够更新页面局部数据的技术。 二、为什么使用Ajax 通过在后台与服务器进行少…

一览函数式编程

文章目录 一、 什么是函数式编程1.1 编程范式1.1.1 命令式编程(Imperative Programming)范式1.1.2 声明式编程(Declarative Programming)范式1.1.3 函数式编程(Functional Programming)范式1.1.4 面向对象编程(Object-Oriented Programming)范式1.1.5 元编程(Metaprogramming)范…

Pascal Content数据集

如果您想使用Pascal Context数据集&#xff0c;请安装Detail&#xff0c;然后运行以下命令将注释转换为正确的格式。 1.安装Detail 进入项目终端 #即 这是在我自己的项目下直接进行克隆操作&#xff1a; git clone https://github.com/zhanghang1989/detail-api.git $PASCAL…

我用 GitHub 9.8k 的 Go 语言 2D 游戏引擎写了个游戏

前言 hi&#xff0c;大家好&#xff0c;这里是白泽。今天给大家分享一个 GitHub &#x1f31f;9.8k 的 Go 语言 2D 游戏引擎。 https://github.com/hajimehoshi/ebiten 引擎的贡献者依旧在积极维护&#xff0c;是一个兼具学习 & 娱乐的项目&#xff01; 为此我也用这个…

Prompt提示词教程 | 提示工程指南 | 提示词示例 入门篇

在上一节中&#xff0c;我们介绍并给出了如何赋能大语言模型的基本示例。如果还没看而且是刚入门的同学建议看下&#xff0c;有个基本概念。 Prompt提示词教程 | 提示工程指南 | 提示工程简介https://blog.csdn.net/HRG520JN/article/details/138523705在本节中&#xff0c;我…

结合kimi chat的爬虫实战思路

背景 想钻研一下项目组件&#xff0c;找找之后的学习方向。不能自以为是&#xff0c;所以借着网开源项目网站上公布的项目内容看一下&#xff0c;那些是我可以努力去学习的&#xff08;入门的&#xff09;。首先需要获取相关内容&#xff0c;于是爬取整理。 任务1&#xff1a…

Unity与C#的关系

第一&#xff0c;我们首先需要知道Unity与C#的关系是什么&#xff1f; 第二&#xff0c;我们要明白为什么Unity会使用C#&#xff0c;而不是C&#xff1f; 第三&#xff0c;我们需要知道Unity是怎么使用C#的&#xff1f; 第一点&#xff1a; 先说结论&#xff1a;C#是Unity用…

【Verilog】big_small_cnt

通用大小计数器 timescale 1ns / 1ps // // Company: // Engineer: wengf // Create Date: // Design Name: // Module Name: big_small_cnt // Project Name: // Target Devices: // Tool Versions: // Description: // Dependencies: // Revision: // Revision 0…

一起刷C语言菜鸟教程100题(15-26含解析)

五一过的好快&#xff0c;五天假期说没就没&#xff0c;因为一些事情耽搁到现在&#xff0c;不过还是要继续学习的&#xff0c;之后就照常更新&#xff0c;先说一下&#xff0c;这个100题是菜鸟教程里面的&#xff0c;但是有一些题&#xff0c;我加入了自己的理解&#xff0c;甚…

odoo实施之创建行业demo

创建数据库&#xff0c;添加公司数据 选择应用&#xff0c;获取15天免费试用 创建完成 设置客户公司logo 创建用户 更改用户语言 前置条件&#xff1a;配置邮件 开发模式下&#xff0c;额外信息 加载demo数据

Conda下Richdem包遇到问题

Conda中Richdem包遇到问题 文章目录 Conda中Richdem包遇到问题问题一报错解决 问题二报错解决 参考 问题一 报错 RichDEM 是一套数字高程模型 &#xff08;DEM&#xff09; 水文分析工具&#xff0c;这次打算用richdem进行地形分析&#xff0c;尝试在conda里面安装richdem包的…

VMware下Ubuntu的安装教程

文章目录 一、Ubuntu如何下载1.下载官方地址https://ubuntu.com/2.点选Ubuntu服务器版本3.点击下载Ubuntu服务器版本iso镜像二、VMware安装Ubuntu服务器系统1.创建虚拟机2.选择下载好的Ubuntu服务器镜像3.创建安装完成三、Ubuntu Server如何设置1.Ubuntu Server没有中文所以全都…

windows vscode设置扩展和缓存目录

vscode的扩展和缓存占了很大的空间&#xff0c;而且默认在C盘&#xff0c;很烦。。。 修改vscode快捷方式的目标处&#xff1a;"C:\Users\Nv9\AppData\Local\Programs\Microsoft VS Code\Code.exe" --extensions-dir "D:\Program Cache\VScode\extensions"…

sql注入练习

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一&#xff0c;它不是利用操作系统的BUG来实现攻击&#xff0c;而是针对程序员编写时的疏忽&#xff0c;通过SQL语句&#xff0c;实现无账号登录&#xff0c;甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

kraken2 最新版安装,极简模式

kraken2 git clone https://github.com/DerrickWood/kraken2.gitcd kraken2./install_kraken2.sh /opt/krakenvim .bashrc ---------------- # Kraken export PATH"/opt/kraken:$PATH" ----------------source .bashrc Note: 不晓得是不是我设置了清华源&#xff0c…

Spring Boot集成Swagger快速入门Demo

1.什么是Swagger&#xff1f; Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 主要作用&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作。&#xff08;实际开发中&#xff0c;接口文档的内容会不停的…

kafka学习笔记(三、生产者Producer使用及配置参数)

1.简介 1.1.producer介绍 生产者就是负责向kafka发送消息的应用程序。消息在通过send()方法发往broker的过程中&#xff0c;有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用后才能被真正的发往broker。 demo: public class Kafk…

【NodeMCU实时天气时钟温湿度项目 4】通过NTPClient库获取实时网络时间并显示在TFT屏幕上

今天是【实时天气时钟温湿度项目】第四专题&#xff0c;主要内容是&#xff1a;学习导入NTPClient库&#xff0c;通过这个库获取实时网络时间&#xff0c;显示在1.3寸TFT液晶屏幕上。此前三个专题&#xff0c;请选择查看以下链接。 第一专题内容&#xff0c;请参考 【N…

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看&#xff08;非必须&#xff09; docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地&#xff0c;这样即使容器被删除&#xff0c;数据也不会丢失。 mkd…

牛客NC142 最长重复子串【中等 字符串 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4fe306a84f084c249e4afad5edf889cc 思路 注意&#xff1a;题目给的时间复杂度是O(N^2)那么直接套用双重循环&#xff1a;外层循环i为假定起始重复子串的初始位置&#xff0c;内层循环的j为假定重复子串的结束位置…