fstream读写文件read_使用同一个fstream

fstream读写文件read_使用同一个fstream1.fstream是什么?fstream是C++标准库中面向对象库的一个,用于操作流式文件。fstream本质上是一个class,提供file操作的各种方法。2.关系图basic_fstream是一个类模板,暂且不用深入理解它。我们关心的事,它前面继承的那一堆东西。fstream是basic_fstream<char>的一个模板类,也就说明,fstream也继承了一堆东西。我们再关心一下从ios_base基类,重点继承了什么?文件流的打开模式。3.实验3.1打开/创建文件


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.fstream是什么?

fstream是C++标准库中面向对象库的一个,用于操作流式文件。
fstream本质上是一个class,提供file操作的各种方法。

2.关系图

在这里插入图片描述
basic_fstream是一个类模板,暂且不用深入理解它。我们关心的事,它前面继承的那一堆东西。

fstream是basic_fstream<char>的一个模板类,也就说明,fstream也继承了一堆东西。

我们再关心一下从 ios_base基类,重点继承了什么?文件流的打开模式。
在这里插入图片描述

3.实验

3.1 打开/创建文件

void open( const char *filename, ios_base::openmode mode =ios_base::in|ios_base::out );

#include <iostream>
#include <fstream>
using namespace std;
int main()
{ 
   
    fstream fs;
    cout << "hello" << endl;
    fs.open("d://zhou");    
    if (fs.is_open())
    { 
   
        cout << "open success" << endl;
    }
    else
    { 
   
        cout << "open failed" << endl;
    }
    system("pause");
    return 0;
}

输出结果
在这里插入图片描述
打开失败了。
说明不能自动创建不存在的文件。

修改fs.open("d://zhou"); 为fs.open("d://zhou", ios_base::in); ,即只读的方式打开。
运行后,文件依旧不能被创建。

修改fs.open("d://zhou"); 为fs.open("d://zhou", ios_base::out); ,即只写的方式打开。
运行后,文件在D盘被创建了。
在这里插入图片描述在这里插入图片描述
所以,想要打开一个不存的文件,并且创建它,必须包含 ios_base::out模式。

3.2 写文件 write()

basic_ostream& write( const char_type* s, std::streamsize count );
它是继承于ostream类

#include <iostream>
#include <fstream>
using namespace std;
int main()
{ 
   
    char str[] = "hello world";
    fstream fs;
    cout << "hello" << endl;
    fs.open("d://zhou.txt", ios_base::out); 
    if (fs.is_open())
    { 
   
        cout << "open success" << endl;
    }
    else
    { 
   
        cout << "open failed" << endl;
    }
    
    fs.write(str, sizeof(str) - 1);  //写入内容
    //fs << str << endl;
    
    system("pause");

    return 0;
}

实验结果
在这里插入图片描述
写入有两种方式,一种是使用 fs.write,另一种是使用 << 流操作符号。流操作符号本质也是调用了write方法。

3.3 读文件 read()

basic_istream& read( char_type* s, std::streamsize count );
它是继承于istream类。

#include <iostream>
#include <fstream>
using namespace std;
int main()
{ 
   
    char str[] = "hello world";
    char rstr[128] = { 
   0};
    fstream fs;

    cout << "hello" << endl;

    fs.open("d://zhou.txt", ios_base::out | ios_base::in); 
    if (fs.is_open())
    { 
   
        cout << "open success" << endl;
    }
    else
    { 
   
        cout << "open failed" << endl;
    }

    fs.write(str, sizeof(str) - 1);  //写入
    fs.sync();                       //写入硬盘
    fs.seekg(ios_base::beg);         //文件指针的位置回到开头
    fs.read(rstr, sizeof(rstr));     //读数据

    cout << rstr << endl;

    fs.close();
    system("pause");

    return 0;
}

实验结果
在这里插入图片描述
写入”hello word” 再读出来。
咦?怎么读一个数据不是只调用read就行吗?怎么多了好几个?
因为…
fs.write()是将内容写入缓冲区(内存)。fs.sync() 是为了将缓冲区的内容刷新写入硬盘。而read方法是只能读取硬盘上的内容,读不了缓冲区。
fs.seekg()则是将文件的指针回到开头。当为了写入之后,文件指针指向了末尾了。调用read时候,也就会从末尾读,啥也读不出来。

3.4 读文件 getline()

读文件的操作,getline比read更加常用。
getline一读就一整行了。
getline的内容实现也是依靠read方法(c语言是这样,c++可能也是这样)。

    while (!fs.eof()) 
    { 
   
        fs.getline(rstr, sizeof(rstr));     //读数据
        cout << rstr << endl;
    }

fs.eof()是为了判断是否到达末尾,若抵达末尾,返回true,否则false。

实验结果
在这里插入图片描述

4.最后

fstream的方法何其之多,掌握比较常用的即可。许多操作跟C语言类似。
学习C++最重要的技能之一是学会查找文档。
中文手册:https://www.apiref.com/cpp-zh/cpp.html
英文手册:http://www.cplusplus.com/reference/

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191772.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • MySQL与SqlServer的区别「建议收藏」

    MySQL与SqlServer的区别「建议收藏」一、MySQL与SqlServer的区别目前最流行的两种后台数据库即为Mysql和SQLServer。这两者最基本的相似之处在于数据存储和属于查询系统,你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL(数据库管理标准)。还有,这两种数据库系统都支持二进制关键字和关键索引,这就大大地加快了查询速度。同时,二者也都提供支持XML的各种格式。根本的区别:SQL服务器的狭隘的、保守的存储引擎而MySQL服务器的可扩展、开放的存储引擎;SQL服务器的引擎是Sybase,而MyS

    2022年10月2日
  • vscode设置删除行快捷键[通俗易懂]

    vscode设置删除行快捷键[通俗易懂]开发中习惯的快捷键删除:ctrl+Dvscode的删除快捷键:ctrl+shift+K修改方式:默认ctrl+D被addselectiontonextfindmatch使用,先修改调它的快捷键,如图改为ctrl+shift+alt+D,按回车键保存在修改DeleteLine的快捷键为ctrl+D,按回车键保存完成…

    2022年6月15日
  • Centos7防火墙配置

    Centos7防火墙配置

    2021年11月22日
  • 动画插件–AnimateCSS

    动画插件–AnimateCSS1.什么是Animate.css?其实swiper-animate就是参考Animate.css演变出来的一个插件, Animate.css和swiper-animate一样都是用于快速添加动画的, 所以会用swiper-animate就会用Animate.css2.Animate.css的使用:引入animate.css的文件 给需要执行动画的元素添加类名3.示例animated这个类名是animated.css的基类,但凡需要通过animated.css来添加动画,都需

    2022年7月27日
  • 集合的定义_集合的概念知识点

    集合的定义_集合的概念知识点确定性给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。互异性一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出

    2022年8月4日
  • RecyclerView Adapter中notifyDataSetChanged 的作用

    RecyclerView Adapter中notifyDataSetChanged 的作用一直认为notifyDataSetChanged是用来刷新数据的当数据发生变化的时候调用notifyDataSetChanged官方说:通知任何注册的观察者数据发生了改变(Notifyanyregisteredobserversthatthedatasethaschanged)–自己翻译的不保证完全正确。。。。。。今天有空翻阅下源码publicfin…

    2022年6月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号