fstream

article/2025/9/13 16:21:54
ifstream -- 从磁盘中写入内存

ofstream -- 从内存中输出到磁盘


#include <fstream>
ofstream     //文件写操作,内存写入存储设备(文件)  输出流
ifstream      //文件读操作,存储设备到内存.       输入流
fstream      //读写操作,对打开的文件可进行读写.   前两者的结合


头文件 < fstream> 
c++中有一个stream,所有的I/O都是以这个流类为基础的。继承结构如下图: 
这里写图片描述

a.”<<”插入器,向流输出数据; 
b.”>>”析取器,向流输出数据; 
我们主要讨论ifstream和ofstream 
ifstream 和ofsteam 包含在头文件fstream中。 
ofstream 是从内存读到硬盘; 
ifstream 是从硬盘读到内存。 
fstream 是可对打开的文件进行读写操作。

1.打开文件

在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作。 
函数:open() 
void open ( const char * filename,ios_base::openmode mode = ios_base::in | ios_base::out ); 
void open(const wchar_t *_Filename, ios_base::openmode mode= ios_base::in | ios_base::out,int prot = ios_base::_Openprot); 

参数: filename 待操作的文件名 
mode 打开文件的方式 
prot 打开文件的属性

打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

  • ios::app:  以追加的方式打开文件
  • ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性
  • ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
  • ios::in:   文件以输入方式打开(文件数据输入到内存)
  • ios::out:   文件以输出方式打开(内存数据输出到文件)
  • ios::nocreate:不建立文件,所以文件不存在时打开失败
  • ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
  • ios::trunc:  如果文件存在,把文件长度设为0

可以用“或”把以上属性连接起来,如ios::out|ios::binary 
Demo

fstream file1;  
file1.open("c:\\config.sys",ios::binary|ios::in,0);
file1.open("c:\\config.sys"); <=> file1.open("c:\\config.sys",ios::in|ios::out,0); 
fstream file1("c:\\config.sys"); 
ifstream file2("c:\\pdos.def");//以输入方式打开文件  
ofstream file3("c:\\x.123");//以输出方式打开文件  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定

2.关闭文件

file.close() 
打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。

3.读写文件

类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。 
一般来说,我们将使用这

3.1文本文件的读写

些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符<<: 
DEMO

ofstream out("out.txt");
if(out.is_open())
{out<<"HELLO WORLD!"<<endl;out.close();
}
`
结果在文件out.txt中写入了HELLO WORLD!
`
ifstream in("out.txt");
cha buffer[200];
if(in.is_open())
{while(!in.eof()){in.getline(buffer,100)cout<<buffer<<endl;out.close();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

结果在屏幕上输出了 :HELLO WORLD! 

状态标志符的验证(Verification of state flags)

  • bad() 
    如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
  • fail() 
    除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
  • eof() 
    如果读文件到达文件末尾,返回true。
  • good() 
    这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。

3.2二进制文件的读写

  • write ( char * buffer, streamsize size );//从buffer中读取size个字符,写到文件中。
  • read ( char * buffer, streamsize size );//从文件中读取size个字符到buffer中

这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。

// reading binary file  #include <iostream>  #include <fstream.h>  const char * filename = "test.txt";  int main () {  char * buffer;  long size;  ifstream in (filename, ios::in|ios::binary|ios::ate);  size = in.tellg();  in.seekg (0, ios::beg);  buffer = new char [size];  in.read (buffer, size);  in.close();  cout << "the complete file is in a buffer";  delete[] buffer;  return 0;  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
//运行结果:  
The complete file is in a buffer  `
  • 1
  • 2
  • 3
  • put() 
      ofstream &put(char ch),使用: 
      file1.put(’c’) //就是向流写一个字符 ‘c’。
  • get() 
    (1).ifstream &get(char ch),使用: 
    file1.get(x)//从文件中读取一个字符存储在x中 
    (2).ifstream &get(char *buf,int num,char delim=’\n’),从文件中读取长度为num的字符串到buf中,或者读取到delim为止,使用: 
    file2.get(str1,127,’A’); //从文件中读取字符到字符串str1,当遇到字符’A’或读取了127个字符时终止。

4.文件定位

和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。相应的函数:

  • seekg(): 
    istream &seekg(streamoff offset,seek_dir origin);//设置读位置,
  • seekp() 
    ostream &seekp(streamoff offset,seek_dir origin); //设置写位置 
    定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:

  • ios::beg:  文件开头

  • ios::cur:  文件当前位置
  • ios::end:  文件结尾 
    DEMO 
    file1.seekg(1234,ios::cur); //把文件的读指针从当前位置向后移1234个字节 
    file2.seekp(1234,ios::beg); //把文件的写指针从文件开头向后移1234个字节

5.缓存和同步(Buffers and Synchronization)

当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。 
当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:

  • 当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。
  • 当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。
  • 控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。
  • 明确调用函数sync(): 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败。


http://chatgpt.dhexx.cn/article/0kEnbAHH.shtml

相关文章

fstream读写文件

1.fstream是什么&#xff1f; fstream是C标准库中面向对象库的一个&#xff0c;用于操作流式文件。 fstream本质上是一个class&#xff0c;提供file操作的各种方法。 2.关系图 basic_fstream是一个类模板&#xff0c;暂且不用深入理解它。我们关心的事&#xff0c;它前面继承…

【C++入门】文件流(fstream)介绍和使用

1、打开函数&#xff1a;open mode含义ios::in以读取方式打开文件ios::out以写入方式打开文件ios::binary以二进制方式存取ios::ate存取指针在文件末尾ios::app写入时采用追加方式ios::trunc写入时抹去旧数据 (1)在C11标准时&#xff0c;open函数的文件路径可以传char指针也可以…

谷歌浏览器代理服务器出现问题怎么办?(最快的解决办法)

谷歌浏览器代理服务器出现问题怎么办? 两个解决办法&#xff08;其他浏览器也可用&#xff09;&#xff1a; &#xff08;1&#xff09;方法一&#xff1a;【重置】浏览器。&#xff08;最方便快捷的方式&#xff09; ①进入“设置”——&#xff09;选择“重置并清理”——…

上不了网,代理服务器出现问题

上不了网&#xff0c;代理服务器出现问题 1.问题截图 2.解决的方法

代理服务器可能有问题,或地址不正确的解决方案

可能是设置了代理服务器的原因。 1.先打开代理服务器设置 2.关闭代理服务器。

win10 代理服务器出现问题 或者地址有误

本人win10系统&#xff0c;今天晚上使用浏览器&#xff0c;打开页面的时候突然出现了&#xff1a; 代理服务器出现问题 或者地址有误。 具体诊断&#xff0c;错误截图也就不放了。 解决办法&#xff1a;原本那个使用代理服务器不知道怎么的打开了&#xff0c;关掉之后再通过…

代理服务器可能有问题,或地址不正确(已解决)

解决代理服务器可能有问题&#xff0c;或地址不正确 1. 问题描述2. 解决方法 1. 问题描述 如果遇到电脑连上wifi&#xff0c;其他应用可以上网(例如可以登录QQ)&#xff0c;但是浏览器不能浏览网页&#xff0c;出现代理服务器可能有问题&#xff0c;或地址不正确 这个错误&…

Mac 使用Charles后,退出Charles后,不能浏览网页,提示:未连接到互联网代理服务器出现问题,或者地址有误。

问题&#xff1a; Mac 使用Charles后&#xff0c;退出Charles后&#xff0c;不能浏览网页 提示&#xff1a;未连接到互联网代理服务器出现问题&#xff0c;或者地址有误。 原因&#xff1a; 出现该问题的原因&#xff1a;使用Charles时&#xff0c;会自动打开网络代理。正常…

代理服务器有问题怎么办?

问题&#xff1a;代理服务器可能有问题&#xff0c;或vkeeper链接无网络&#xff08;vkeeper两步都要做&#xff09; 解决方法&#xff1a; 第一步&#xff1a;在下方搜索栏搜索更改代理设置并点击&#xff1b;或其他方式进入代理服务器设置 进入后&#xff0c;观察 手动设置代…

chrome 未连接到互联网 代理服务器出现问题,或者地址有误

一天两头的连不上网&#xff0c;原因是莫名其妙的被加上了代理&#xff0c;解决方案如下&#xff1a; 请检查您的代理服务器设置或与网络管理员联系&#xff0c;以确保代理服务器正常运行。如果您认为自己不需要使用代理服务器&#xff0c;请执行以下操作&#xff1a; 依次转到…

未连接到互联网 代理服务器出现问题,或者地址有误。

请检查您的代理服务器设置或与网络管理员联系&#xff0c;以确保代理服务器正常运行。如果您认为自己不需要使用代理服务器&#xff0c;请执行以下操作&#xff1a; 依次转到 Chrome 菜单 >“设置”>“显示高级设置…”>“更改代理服务器设置…”>“LAN 设置”&…

网页未连接到互联网,代理服务器出现问题

网页未连接到互联网&#xff0c;代理服务器出现问题 如果网络正常连接但是网页却打不开&#xff0c;&#xff08;qq微信都可以登录&#xff09;网页出现以下页面&#xff1a; 解决办法&#xff1a; windows搜索代理服务器&#xff0c;或者打开设置-网络和Internet-代理。关闭使…

浏览器代理服务器出现问题

使员工charles时&#xff0c;会出现&#xff0c;可以启动charles&#xff0c;解决问题&#xff0c;或者关闭代理 一直使用正常&#xff0c;浏览器突然不能访问&#xff0c;显示如下 搜狗浏览器&#xff1a; 到搜狗浏览器&#xff0c;设置--高级 不使用代理 解决问题 chrome浏览…

问题:未连接到互联网 代理服务器出现问题,或者地址有误。

出现的问题如下图&#xff1a; 解决方案如下&#xff1a; (此问题有俩种解决方法&#xff0c;我个人推荐使用第二种方案&#xff0c;能够最快最好最实用地去解决此问题;) 法一&#xff1a;燃眉之急的方法(但不能完全解决问题)&#xff1a; 步骤1&#xff1a;按 WinR 键&…

Chrome代理服务器出现问题,或者地址有误(win10)

chrome浏览器输入任何网址都显示如下界面 这种情况&#xff0c;原因有很多&#xff0c;总之网络连接有问题&#xff1a; 解决&#xff1a; 1、查看网络连接&#xff0c;确认只有chrome不好使&#xff0c;其他软件联网正常 2、是否使用了“梯子”之类的东西&#xff0c;如果有&…

浏览器提示代理服务器出现问题,或则地址有误

如下图&#xff1a; 解决&#xff1a; 代理问题&#xff0c;电脑开代理了&#xff0c;关掉即可。具体步骤&#xff1a;

win10连着网但网页打不开,代理服务器出现问题,或地址有误

win10连着网但电脑网页打不开 代理服务器出现问题&#xff0c;或地址有误&#xff0c;但QQ等软件却能正常运行。 打开设置&#xff1a;查找internet选项&#xff1a; 打开后点击“连结”&#xff0c;然后点下方的“局域网设置”。 之后把代理服务器里的"为LAN使用地理服务…

[Win10] 代理服务器出现问题或地址有误

本文介绍了访问浏览器时显示代理服务器出现问题或地址有误的解决方案 1 问题描述 打开 Chrome 浏览器访问网页时&#xff0c;提示代理服务器出现问题或地址有误&#xff0c;无法连接至互联网 2 问题排查 打开cmd&#xff0c;输入 ping 127.0.0.1 命令检查主机的网卡是否正常…

windows无法上网:代理服务器出现问题或地址有误

1.问题描述 微信、QQ可以登录正常使用&#xff0c;也可以ping通百度&#xff0c;但是浏览器无法上网&#xff0c;如下图所示。 2.解决办法 控制面板→网络和Internet→ Internet选项→连接→局域网设置&#xff1a;取消代理服务器勾选&#xff0c;选择自动检测设置&#xff0c…

解决代理服务器出现问题,无法连接校园网

和往常一样&#xff0c;打开电脑&#xff0c;却遇到了这样的问题 不要慌&#xff0c;这就说解决的办法 windowR 向搜索框输入控制面板&#xff0c;不要直接打开控制面板&#xff0c;点击右边的internet选项 然后进入接下来的页面&#xff0c;点击连接到局域网设置&#xff0…