前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fstream读写文件read_使用同一个fstream

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

作者头像
全栈程序员站长
发布2022-11-04 20:28:25
1K0
发布2022-11-04 20:28:25
举报

大家好,又见面了,我是你们的朋友全栈君。

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 );

代码语言:javascript
复制
#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类

代码语言:javascript
复制
#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类。

代码语言:javascript
复制
#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()

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

代码语言:javascript
复制
    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.cn/191772.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年9月19日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.fstream是什么?
  • 2.关系图
  • 3.实验
    • 3.1 打开/创建文件
      • 3.2 写文件 write()
        • 3.3 读文件 read()
          • 3.4 读文件 getline()
          • 4.最后
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档