C++超详细梳理IO流操作

目录
  • 1.标准输出输入流-控制台流(iostream类)
  • 2. 文件流(I/O操作)
    • 文本文件
      • 使用<< >> 进行读写
      • getline()读取一行
      • get() put()进行单个字符读写
    • 二进制文件读写
      • get() put()进行单个字节读写
      • read() write()多个字节读写
    • 注意事项
  • 3.字符串输入输出流(sstream)
    • sprintf sscanf 和 stringstream的使用
    • 补充内容:C/C++中int和字符串类型的转换
      • string转int
      • int转string
      • 多功能转换
      • stringstream

C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能

C++ 系统实现了一个庞大的类库,其中 ios 为基类,其他类都是直接或间接派生自 ios 类

1.标准输出输入流-控制台流(iostream类)

cin实际上是一个标准输入流对象(类对象),常用的方式有,cin>>(cin.operator>>()), cin.get(), cin.getline()(用法:cin.getline(char s[], int nLength))

或者在std命名空间下,有一个单独的getline()函数,但是该函数时使用string对象作为参数的,即:getline(cin, str)

cout是标准输出流对象(类对象),cout<<

cout cin printf scanf(格式化输入输出)比较

总结:c++中尽量用cin和cout

//c_str()就是把string类对象转换成和c兼容的char*类型。
//这是为了与c语言兼容,在c语言中没有string类型
//故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式
//例如
	string a = "hellofjifj";
	printf("%s\n", a.c_str());
	//printf("%s\n", a);//这样会有问题

2. 文件流(I/O操作)

在文件流中提供了三个派生类对文件数据进行操作(注意这里是类,不像控制台提供的是类对象)

  • ofstream:输出,即写文件,由ostream引申而来
  • ifstream:输入,即读取文件,由istream引申而来
  • fstream :输入输出,同时读写操作,由iostream引申而来

文件的类型:文本文件 和 二进制文件

文件读写的步骤:

  • 包含的头文件:#include <fstream>
  • 创建流
  • 打开文件(文件和流关联)
  • 读写 (写操作:<<,put( ),write( )读操作:>> , get( ),getline( ), read( ))
  • 关闭文件:把缓冲区数据完整地写入文件, 添加文件结束标志, 切断流对象和外部文件的连接

文本文件

使用<< >> 进行读写

<< 能实现以行为单位写入文件

>> 不能一行为单位读入内存,而是以单词为单位。总是以空格、Tab、回车结束

    ofstream OpenFile("file.txt");
  if (OpenFile.fail())
  {
    cout<<"打开文件错误!"<<endl;
    exit(0);
  }
    OpenFile << "abc def ghi";//把内容写入file文件
  OpenFile.close();    
    const int len=20;
    char str[len];
    ifstream OpenFile("file.txt");
  if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile >> str;
    cout << str << endl;
    OpenFile.close(); //str的内容为abc,而不是abc def ghi(见空格停止)

getline()读取一行

getline():以行为单位读入内存,能一次读入一行

函数原型:istream &getline( char *buffer, streamsize num );

getline( )函数用于从文件读取num个字符到buffer(内存)中,直到下列情况发生时,读取结束:

  • num个字符已经读入
  • 碰到一个换行标志
  • 碰到一个EOF
    const int len=20;
    char str[len];
    ifstream OpenFile("file.txt");
    if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.getline(str,20);
    cout << str << endl;
    OpenFile.close();//运行结果:str的内容为abc def ghi (一直把一行读完)

get() put()进行单个字符读写

ostream& put (char c);

函数功能:使用 put( )函数,向文件中写入字符

    char ch='1';
    ofstream OpenFile("file.txt");
  if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.put(ch); // 把字符1写入文件
    OpenFile.close();  

istream& get (char& c);

函数功能:使用 get( )函数,从文件中读取字符

    char ch;
    ifstream OpenFile("file.txt");
  if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.get(ch);
    cout << ch; //把字符1从文件中读到ch(内存)中
    OpenFile.close();  

二进制文件读写

get() put()进行单个字节读写

ofstream &put(char ch)

在内存中写入一个字节到文件

    char ch='a';
    ofstream OpenFile("file.txt",ios::binary);
    //以二进制的方式处理,在打开时要用 ios::binary 显式声明
  if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.put(ch);
    OpenFile.close();  

ifstream &get(char ch)

在文件中读取一个字节到内存

    char ch;
    ifstream OpenFile("file.txt",ios::binary);
  if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.get(ch); // 从文件中读取一个字符
    cout << ch;
    OpenFile.close(); 

read() write()多个字节读写

ostream & ostream :: write ( char * buf , int n ) ;

功能:把buf指向的内容取n个字节写入文件

参数说明:buf表示要写入内存的地址,传参时要取地址。n表示要读入字节的长度

注意:

  • 该函数遇到空字符时并不停止,因而能够写入完整的类结构
  • 第一个参数一个char型指针(指向内存数据的起始地址),与对象结合使用的时候,要在对象地址之前要char做强制类型转换
    char ch[12]="12 3 456 78";
    ofstream OpenFile("file.txt");
  if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.write(ch, 12);
    OpenFile.close();  

istream & read ( char * buf , int n ) ;

功能:从文件中提取 n 个字节数据,写入buf指向的地方中

    char ch[12];
    ifstream OpenFile("file.txt");
    if (OpenFile.fail())
    {
        cout<<"打开文件错误!"<<endl;
        exit(0);
    }
    OpenFile.read(ch,12);
    cout << ch;  //运行结果:数组ch的内容为12 3 456 78
    OpenFile.close();  

注意事项

(1)程序不再使用文件时,为什么要关闭文件?

因为:

  • 文件缓冲区是一块小的内存空间.
  • 操作系统限制同时打开的文件数量

注意:close ( ) 函数关闭文件,但流对象仍然存在。

(2)文件的默认打开方式为文本文件,要是想以二进制的方式处理,在打开时要用 ios::binary 显式声明。

(3)针对文本文件操作时,get函数和>>的区别:

  • 在读取数据时,get函数包括空白字符(遇空白字符不停止读取)
  • >>在默认情况下拒绝接受空白字符(遇到空白符停止读取)

(4)文本文件的读写常使用的方法:使用<<写入文件,使用getline 和 >> 读到内存

二进制文件的读写常使用的方法:使用istream 类的成员函数read 和write 来实现,

3.字符串输入输出流(sstream)

其相应的派生类有istringstream类、ostringstream类、iostringstream类

sprintf sscanf 和 stringstream的使用

其实是整型和字符创类型的相互转化:序列化(转成字符串)和反序列化(将字符串中数据提取处理)

C当中用法:sprintf和sscanf函数

C++中用法:字符串流

struct ServerInfo//要读些的信息类
{
	char _ip[20];
	int  _port;
};
	//C当中用法
    //将info中数据转成字符串并存入buff中
	ServerInfo info = { "192.0.0.1", 8000 };
	char buff[128];//buff的大小不好确定
	sprintf_s(buff, "%s %d", info._ip, info._port);// 序列化,转成字符串存入buff中

    //将buff中数据格式化输出到rinfo中
	ServerInfo rinfo;
	sscanf(buff, "%s%d", rinfo._ip, &rinfo._port);// 反序列化,将字符串buff中数据转成规定格式
	//空格间隔开了
	//C++用法
	//将info中数据转成字符串并存到buff中
    ServerInfo info = { "192.0.0.1", 8000 };
	stringstream ssm;//字符串流对象
	ssm << info._ip <<" "<<info._port;//转成字符串
	string buff = ssm.str();//查看字符串
	//从字符串提取至rinfo
	stringstream ssm;
	ssm.str("127.0.0.1 90");//这两行直接按照下面的写法也行
	//stringstream ssm("127.0.0.1 90");
	ServerInfo rinfo;
	ssm >> rinfo._ip >> rinfo._port;

补充内容:C/C++中int和字符串类型的转换

string转int

  • atoi(c库函数、ascll to integer)
  • strtol(c库函数,字符串转成长整型)
  • stoi(stoi是C++的函数,头文件:#include < string >)

int转string

  • itoa(c库函数)
  • to_string(C++11的函数,可以适应8种类型的重载,将其转换为string,头文件:#include < string >)

多功能转换

stringstream

到此这篇关于C++超详细梳理IO流操作的文章就介绍到这了,更多相关C++ IO流内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++学习之IO流(输入输出流)详解

    目录 介绍 基本输入.输出流 freopen 字符类的处理 介绍 流: 若干字节数据从一端到另一端我们叫做流 例如:操作文件,从程序到文件,数据的流动的操作称为流操作 流类体系 专门处理输入输出流.字符流.文件流,包含有: 流对象 流运算符 >>  << 输入/出流对象 + 流运算符 >>  <<---处理输入输出的数据 字符流对象 + 流运算符 >>   <<   ---处理字符流 文件的对象 + 流运算符 >>  &l

  • 浅谈C++ IO流

    1.输入输出(IO)与流的概念 输入输出(IO)是指计算机同任何外部设备之间的数据传递.常见的输入输出设备有文件.键盘.打印机.屏幕等.数据可以按记录(或称数据块)的方式传递,也可以 流的方式传递. 所谓记录,是指有着内部结构的数据块.记录内部除了有需要处理的实际数据之外,还可能包含附加信息,这些附加信息通常是对本记录数据的描述. 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作称

  • C++语言io流处理基本操作教程示例详解

    目录 一.输入输出流对象 流对象常用的处理函数 流控制字符 二.字符流操作 sstream 三. 文件流流类 四.文件指针定位 一.输入输出流对象 cout:标准输出流 cerr:标准出凑  和cout(只是用于如果是错误时要输出的) cin  :   标准输入 流对象常用的处理函数 输出字符 put() 输入字符:get() 输出字符串:write() 输入字符串getline() char ch; cin.get(ch); cout << ch<<endl; cout.put(

  • C++IO流之fstream, stringstream使用小结

    目录 IO流 1. C语言IO 2. C++IO 2.1 C++标准IO流 2.2 C++文件IO流 2.3 C++ stringstream IO流 1. C语言IO C语言中常用的输入输出函数有如下几种:前者是格式化标准输入输出,后者是格式化文件输入输出,最后是格式化字符串输入输出. 函数名 内容 备注 scanf 从标准输入流(键盘)读取格式化的数据 省略standard fscanf 从所有输入流读取读取格式化数据 f:file sscanf 从字符串中读取格式化的数据 s:string

  • C++:IO类,文件输入输出,string流练习题

    目录 前面已经在用的IO库设施 IO类 IO对象不能拷贝或赋值 条件状态 管理输出缓冲 文件输入输出 fstream特有的操作 文件模式 string流 stringstream特有的操作 练习 练习1 练习2 练习3 练习4 练习5 练习6 练习7 练习8 练习9 总结 前面已经在用的IO库设施 istream:输入流类型,提供输入操作. ostream:输出流类型,提供输出操作 cin:一个istream对象,从标准输入读取数据. cout:一个ostream对象,向标准输出写入数据. ce

  • C++详细讲解IO流原理

    目录 1. C语言的输入与输出 2. 流是什么 3. C++IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf(). scanf(): 从标准输入设备(键盘)读取数 据,并将值存放在变量中.printf(): 将指定的文字/字符串输出到标准输出设备(屏幕).注意宽度输出和精度 输出控制.C语言借助了相应的缓冲区来进行输入与输出.如下图所示: 对输入输出缓冲区的理解: 1 .可以屏蔽掉低级I/O的实现

  • 带你了解C++的IO流

    目录 一.C语言的输入与输出 二.C++中流的概念 三.C++IO流 1.C++标准IO流 2. C++文件IO流 四.stringstream 总结 一.C语言的输入与输出 C语言中我们最长用到的输入输出方式就是scanf ()与printf(). scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中. printf(): 将指定的文字/字符串输出到标准输出设备(屏幕). C语言借助了相应的缓冲区来进行输入与输出.如下图所示: 其中,输入输出缓冲区的作用:可以屏蔽掉低级I/O的

  • C++  系统IO流介绍

    目录 1.iostream标准库 2.namespace 3.C和C++输出区别 4.总结 前言: 本次讲解一个小知识点,也是最常见的一个知识点:iostream:不管编写什么程序,必然会使用到IO流交互,从细节上理解简单的IO流: 1.iostream标准库 定义:标准库所提供的IO接口,用于与用户交互: 输入流:cin 输出流:cout.cerr.clog 输出流三者的一个区别: 1.首先就是输出目标的不同,cerr主要用来输出错误信息,clog主要用来输出日志信息: 2.cerr有个最大的

  • C++超详细梳理IO流操作

    目录 1.标准输出输入流-控制台流(iostream类) 2. 文件流(I/O操作) 文本文件 使用<< >> 进行读写 getline()读取一行 get() put()进行单个字符读写 二进制文件读写 get() put()进行单个字节读写 read() write()多个字节读写 注意事项 3.字符串输入输出流(sstream) sprintf sscanf 和 stringstream的使用 补充内容:C/C++中int和字符串类型的转换 string转int int转st

  • Java超详细梳理IO流的使用方法上

    目录 Java语言的输入输出类库 1.流的概念 2.流的分类 3.流的作用 4.输入输出流类库 使用InputStream和OutputStream流类 1.基本输入输出流 1.InpitStream流类 2.OutputStream流类 2.输入输出流的应用 2.1文件输入输出流 2.2顺序输入流 2.3管道输入输出流 2.4过滤输入输出流 2.5标准输入输出 你要学会: 流的概念 处理字节流的类 处理字符流的类 Java标准输入输出 文件管理类 Java语言的输入输出类库 1.流的概念 流是

  • Java 超详细讲解IO操作字节流与字符流

    目录 IO操作 字节流 FileInputStream FileOutputStream 字节流读写案例 字符流 FileReader FileWriter 字节流与字符流的区别 IO操作 字节流 java.io.InputStream 输入流,主要是用来读取文件内容的. java.io.OutputStream 输出流,主要是用来将内容字节写入文件的. FileInputStream 该流用于从文件读取数据,它的对象可以用关键字 new 来创建. 有多种构造方法可用来创建对象. 可以使用字符串

  • Java详细讲解IO流的Writer与Reader操作

    目录 接口连接 一.Writer方法 二.Reader方法 接口连接 public static void main(String[] args) throws Exception io流的所有方法都需要链接他们的接口父类,Exception. 一.Writer方法 方法引入: Writer Writer = new FileWriter("D:\\java制作\\高级特性\\src\\com\\ytzl\\第二章\\demo4\\io流\\two\\FileWriter方法.txt"

  • Java超详细梳理异常处理机制

    目录 一.异常概述与异常体系结构 1. 异常概述 引入 概念 2. 分类 2.1 Error vs Exception 2.2 编译时异常vs运行时异常 3. 常见异常 3.1 分类 3.2 代码演示 二.异常处理机制 1. 概述 2. 异常处理机制一之try-catch-finally 2.1 语法格式 2.2 使用 2.3 代码演示 3. 异常处理机制二之声明抛出异常throws 3.1 语法格式 3.2 使用 4. try-catch-finally与throws的区别 5. 手动抛出异常

  • C语言 语义陷阱超详细梳理总结

    目录 1 指针与数组 2 非数组的指针 3 作为参数的数组声明 4 空指针并非空字符串 5 边界计算与不对称边界 6 求值顺序 7 整数溢出 8 为函数提供返回值 1 指针与数组 C语言中只有一维数组.数组中的元素可以是任意类型的对象,这也是多维数组构建的理论基础所在 对于一个数组,我们只能做两件事:确定该数组的大小以及获得该数组下标为0的元素的指针.任何一个数组下标运算都等同于一个对应的指针运算. 数组名代表首元素的地址,无法对其进行++或者–操作,换句话说,我们无法改变数组名(表示的值),因

  • C语言超详细梳理排序算法的使用

    目录 排序的概念及其运用 排序的概念 排序运用 插入排序 直接插入排序 希尔排序 选择排序 直接选择排序 堆排序 交换排序之冒泡排序 总结 排序的概念及其运用 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法

  • Java 超详细讲解字符流

    目录 一.字符流的由来 二.编码表 字符集: Unicode字符集: UTF-8编码规则: 三.字符串中的编码解码问题 编码方法(IDEA): 解码方法(IDEA): 四.字符流的编码解码问题 四.字符流写数据的五种方法 五.字符流读数据的两种方法 一.字符流的由来 由于使用字节流操控中文时不是很方便,Java就提供了字符流来进行操控中文 实现原理:字节流+编码表 为什么用字节流进行复制带有中文的文本文件时没有问题? 因为底层操作会自动进行字节拼接成中文 怎样识别该字节是中文呢? 汉字在存储时,

  • C语言 超详细梳理总结动态内存管理

    目录 一.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc和free 2.calloc 3.realloc 三.常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟的空间使用free释放 4.使用free释放一块动态开辟空间的一部分 5.对同一块开辟的空间多次释放 6.动态内存开辟忘记释放(内存泄漏) 四.几个经典的笔试题 一.为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int a = 10://在栈空间开辟4个字节的连续

  • C语言超详细讲解文件的操作

    目录 一.为什么使用文件 二.什么是文件 1.程序文件 2.数据文件 3.文件名 三.文件指针 四.文件的打开和关闭 五.文件的顺序读写 六.文件的随机读写 fseek ftell rewind 七.文件结束判定 一.为什么使用文件 当我们写一些项目的时候,我们应该要把写的数据存储起来.只有我们自己选择删除数据的时候,数据才不复存在.这就涉及到了数据的持久化的问题,为我们一般数据持久化的方法有,把数据存在磁盘文件.存放到数据库等方式.使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久

随机推荐