Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客

《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 

LinuxC\C++编程技术_夏天又到了的博客-CSDN博客

4.9.1  流的概念

在C++语言中,数据的输入和输出包括对标准输入设备(键盘)和标准输出设备(显示器)、外存磁盘上的文件以及内存中指定的字符串存储空间(当然可用该空间存储任何信息)进行输入输出。对标准输入设备和标准输出设备的输入输出简称为标准I/O,对外存磁盘上的文件的输入输出简称为文件I/O,对内存中指定的字符串存储空间的输入输出简称为(字符)串I/O。

“流”就是“流动”,是物质从一处向另一处流动的过程。C++流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为“流”。为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能。一个流类定义的对象也时常被称为流。例如根据文件流类fstream定义的一个对象fio可称作fio流或fio文件流,用它可以同磁盘上的一个文件相联系,实现对该文件的输入和输出,fio就等同于与之相联系的文件。

因为C++兼容C,所以C中的输入输出函数依然可以在C++中使用,但是很显然,直接把C的那套输入输出搬到C++中肯定无法满足C++的需求,更重要的一点是,C中的输入输出有类型要求,只支持基本类型,因此C++设计了易于使用的并且多种输入输出流接口统一的I/O类库,并且支持多种格式化操作,还可以自定义格式化操作。总体来说,C++中有3种输入输出流。

(1)标准I/O流:内存与标准输入输出设备之间信息的传递。

(2)文件I/O流:内存与外部文件之间信息的传递。

(3)字符串I/O流:内存变量与表示字符串流的字符数组之间信息的传递。

C++引入I/O流,将这3种输入输出流接口统一起来,使用符号“>>”读取数据的时候,不用去管是从何处读取数据,使用符号“<<”写数据的时候,也不需要管是写到哪里去。

4.9.2  流的类库

C++语言系统为实现数据的输入和输出定义了一个庞大的类库,其中ios为根基类,其余都是它的直接或间接派生类,它直接派生4个类:输入流类istream、输出流类ostream、文件流基类fstreambase和字符串流基类strstreambase。C++系统中的I/O类库的所有类被包含在iostream、fstream和strstream这3个系统头文件中。我们可以用图4-4来表示各个类的继承关系。

图4-4

头文件<fstream>提供了3个文件流类:ifstream、ofstream和fstream。

值得注意的是,要在C++中进行文件处理,必须在C++源码文件中包含头文件<fstream>。此外,在C++新标准中,头文件都把.h去掉了,如#include<fstream.h>现在要用:

#include<fstream> 

using namespace std; 

同时要把标准命名空间加上。但是fstream.h和fstream并不是完全等价的。在旧头文件里的fstream.h,如果使用ifstream file的默认参数声明一个输入文件流,当这个要读的file文件不存在时,会自动创建一个空文件,从而给判断文件是否存在造成了很多麻烦。如果使用新标准fstream,就不会创建空文件,从而可以用while(!file)来判断文件是否存在,通过返回数值来指导程序运行。

类似地,头文件ostream.h与iostream也是不同的。iostream.h在旧的C++标准中使用,新标准中用iostream,还要引用命名空间std。iostream.h慢慢地不再使用了,比如微软的VC6可以使用iostream.h,VS 2008已经不能使用iostream.h了。好像不习惯将没有.h 结尾的文件称为头文件,但与时俱进吧,头文件不一定要.h。

4.9.3  打开文件

在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream和fstream对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,就使用ifstream对象。被打开的文件在程序中由一个流对象来表示(这些类的一个实例),而对这个流对象所做的任何输入输出操作实际上就是对该文件所做的操作。要通过一个流对象打开一个文件,需要使用它的成员函数open()。open()函数是fstream、ifstream和ofstream对象的一个成员,该函数声明如下:

void open(const char *filename, ios::openmode mode);

其中,第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。文件打开模式如表4-3所示。

可以把以上两种或两种以上的模式结合使用。例如,如果想要以写入模式打开文件,并希望截断文件,以防止文件已存在,那么可以使用下面的代码:

ofstream outfile;

outfile.open("file.dat", ios::out | ios::trunc );

类似地,如果想要打开一个文件用于读写,可以使用下面的代码:

fstream  afile;

afile.open("file.dat", ios::out | ios::in );

又比如,如果想要以二进制方式打开文件example.bin来写入一些数据,可以这样写:

ofstream file;

file.open ("example.bin", ios::out | ios::app | ios::binary);

ofstream、ifstream和fstream类的成员函数open都包含一个默认打开文件的方式,这3个类的默认方式各不相同,如表4-4所示。

只有在函数被调用且没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。

由于对类ofstream、ifstream和fstream的对象所进行的第一个操作通常都是打开文件,因此这些类都有一个构造函数可以直接调用open函数,并拥有同样的参数。这样,我们就可以通过以下方式进行与上面同样的定义对象和打开文件的操作:

ofstream file ("example.bin", ios::out | ios::app | ios::binary); // 定义对象的同时直接打开文件

两种打开文件的方式都是正确的。

另外,我们可以通过调用成员函数is_open(),来检查一个文件是否已经被顺利地打开了:

bool is_open();

该函数返回一个布尔值,值为真(true)代表文件已经被顺利打开,值为假(false)则相反。

4.9.4  关闭文件

当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。关闭文件需要调用成员函数close(),它负责将缓存中的数据释放出来并关闭文件。close()函数是fstream、ifstream和ofstream对象的一个成员函数,声明如下:

void close();

这个函数一旦被调用,原先的流对象就可以被用来打开其他的文件了,这个文件也就可以重新被其他的进程访问了。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close()。

4.9.5  写入文件

在C++编程中,我们使用流插入运算符(<<)向文件写入数据,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里使用的是ofstream或fstream对象,而不是cout对象。

4.9.6  读取文件

在C++编程中,我们使用流提取运算符(>>)从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里使用的是ifstream或fstream对象,而不是cin对象。

下面来看一个例子,以读写模式打开一个文件。在向文件afile.dat写入用户输入的信息之后,程序从文件读取信息,并将其输出到屏幕上。

【例4.13】用C++流的方式读写文件

(1)打开Visual Studio Code,新建文本文件test.cpp,输入代码如下:

#include <fstream>
#include <iostream>
using namespace std;
 
int main ()
{
    char data[100];

    // 以写模式打开文件
    ofstream outfile;
    outfile.open("afile.dat");

    cout << "Writing to the file" << endl;
    cout << "Enter your name: "; 
    cin.getline(data, 100);

    // 向文件写入用户输入的数据
    outfile << data << endl;

    cout << "Enter your age: "; 
    cin >> data;
    cin.ignore();
   
    // 再次向文件写入用户输入的数据
    outfile << data << endl;

    // 关闭打开的文件
    outfile.close();

    // 以读模式打开文件
    ifstream infile; 
    infile.open("afile.dat"); 
 
    cout << "Reading from the file" << endl; 
    infile >> data; 

    // 在屏幕上写入数据
    cout << data << endl;
   
    // 再次从文件读取数据,并显示它
    infile >> data; 
    cout << data << endl; 

    // 关闭打开的文件
    infile.close();

    return 0;
}

(2)上传test.cpp到Linux,在终端下输入命令g++ -o test test.cpp,然后运行test,结果如下:

# g++ -o test test.cpp
# ./test
Writing to the file
Enter your name: zww
Enter your age: 61
Reading from the file
zww
61

可以看到在同目录下生成了一个文件afile.dat,查看里面的内容可得:

# cat afile.dat
zww
61

上面的例子中使用了cin对象的附加函数,比如getline()函数从外部读取一行,ignore()函数会忽略掉之前读语句留下的多余字符。

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

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

相关文章

FPGA:Quartus软件与操作系统版本对照表

文章目录 1.软件概述2.软件版本3.设计流程4.支持的设备5.新特性6.版本对照 1.软件概述 Quartus软件是由英特尔&#xff08;Intel&#xff09;公司开发的一款功能强大的FPGA&#xff08;现场可编程逻辑门阵列&#xff09;设计工具&#xff0c;广泛应用于数字电路设计、仿真、综…

ui设计公司分享:浅色 UI 设计

在数字化产品琳琅满目的今天&#xff0c;用户对于界面的要求早已不止于功能的实现&#xff0c;更追求一种舒适、无压的交互体验。而浅色UI设计&#xff0c;凭借其独特的魅力&#xff0c;正逐渐成为众多设计师营造优质体验的首选。 一、浅色UI设计的视觉优势 &#xff08;一&a…

Unity中实现伤害跳字效果(简单好抄)

第一步骤安装并导入Dotween插件&#xff08;也可以不用导入之后直接下载我的安装包&#xff09; 官网DOTween - 下载 第二步&#xff1a; 制作跳字预制体 建议把最佳适应打开&#xff0c;这样就不怕数字太大显示不全了。 第三步&#xff1a;创建一个空对象并编写脚本JumpNumbe…

为什么相关性不是因果关系?人工智能中的因果推理探秘

目录 一、背景 &#xff08;一&#xff09;聚焦当下人工智能 &#xff08;二&#xff09;基于关联框架的人工智能 &#xff08;三&#xff09;基于因果框架的人工智能 二、因果推理的基本理论 &#xff08;一&#xff09;因果推理基本范式&#xff1a;因果模型&#xff0…

VMamba 安装教程(无需更改base环境中的cuda版本)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …

FRP内网穿透0.61.1新版教程

在上一篇zerotier讲述了如何实现虚拟局域网搭建&#xff0c;这篇会讲述FRP内网穿透的使用教程 那么frp与zerotier的区别是什么呢&#xff1f;&#xff08;说人话&#xff09; FRP 主要用于内网服务向外网的单向暴露。 ZeroTier 用于构建一个虚拟的私有网络&#xff0c;实现多点…

如何使用MaskerLogger防止敏感数据发生泄露

关于MaskerLogger MaskerLogger是一款功能强大的记录工具&#xff0c;该工具可以有效防止敏感数据泄露的发生。 MaskerLogger旨在保护目标系统的日子安全&#xff0c;此格式化程序可确保你的日志安全并防止敏感数据泄露。例如使用此格式化程序&#xff0c;打印下列数据&#x…

React进阶之react.js、jsx模板语法及babel编译

React React介绍React官网初识React学习MVCMVVM JSX外部的元素props和内部的状态statepropsstate 生命周期constructorgetDerivedStateFromPropsrendercomponentDidMount()shouldComponentUpdategetSnapshotBeforeUpdate(prevProps, prevState) 创建项目CRA&#xff1a;create-…

【Python】JSON

文章目录 定义Json格式数据转化 定义 JSON是一种轻量级的数据交互格式&#xff0c;可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 JSON可以直接和Python的字典或列表进行无缝转换 【主要功能】 JSON就是一个在各个编程语言中流通的数据格…

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

【18】Word:明华中学-儿童医保❗

目录 题目​ NO2 NO3 NO4 NO5 NO6 NO7 NO8 NO9 题目 NO2 布局→页面设置对话框→纸张方向&#xff1a;横向→纸张大小&#xff1a;A3 &#xff1b;页面设置对话框&#xff1a;直接输入纸张大小的宽度和高度即可→页面设置对话框&#xff1a;上下左右边距→版式&…

数据结构漫游记:动态实现栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

SpringBoot 搭建 SSE

参考链接 https://www.51cto.com/article/798001.html 了解一下SseEmitter&#xff08;一&#xff09;-CSDN博客 依赖 有默认的 springboot-web 依赖即可 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

python_在钉钉群@人员发送消息

python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南&#xff0c;适用于群机器人接收消息&#xff0c;处理完一系列的动作之后&#xff0c;将消息返回给发消息的人员&#xff0c;同时该人员。 需要在企微后台新建一个自建应用&#xff0c;在自建应用里…

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…

HTML之拜年/跨年APP(改进版)

目录&#xff1a; 一&#xff1a;目录 二&#xff1a;效果 三&#xff1a;页面分析/开发逻辑 1.页面详细分析&#xff1a; 2.开发逻辑&#xff1a; 四&#xff1a;完整代码&#xff08;不多废话&#xff09; index.html部分 app.json部分 二&#xff1a;效果 三&#xff1a;页面…

PostgreSQL的学习心得和知识总结(一百六十六)|深入理解PostgreSQL数据库之\watch元命令的实现原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

使用 Parcel 和 NPM 脚本进行打包

使用 Parcel 和 NPM 脚本进行打包 Parcel Parcel 是一个零配置的网页应用程序打包工具&#xff0c;主要用于快速构建现代 JavaScript 应用。 我们可以使用npm直接安装它 npm install --save-dev parcel //这将把 Parcel 添加到 devDependencies 中&#xff0c;表明它是一个…

项目实战--网页五子棋(游戏大厅)(3)

我们的游戏大厅界面主要需要包含两个功能&#xff0c;一是显示用户信息&#xff0c;二是匹配游戏按钮 1. 页面实现 hall.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><meta name"viewport"…

网络安全VS数据安全

关于网络安全和数据安全&#xff0c;我们常听到如下两种不同声音&#xff1a; 观点一&#xff1a;网络安全是数据安全的基础&#xff0c;把当年做网络安全的那一套用数据安全再做一遍。 观点二&#xff1a;数据安全如今普遍以为是网络安全的延伸&#xff0c;实际情况是忽略数据…