广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++超详细梳理IO流操作
  • 165
分享到

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

2024-04-02 19:04:59 165人浏览 薄情痞子
摘要

目录1.标准输出输入流-控制台流(iOStream类) 2. 文件流(I/O操作)文本文件使用<< >> 进行读写getline()读取一行get(

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流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++超详细梳理IO流操作

本文链接: https://www.lsjlt.com/news/153239.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++超详细梳理IO流操作
    目录1.标准输出输入流-控制台流(iostream类) 2. 文件流(I/O操作)文本文件使用<< >> 进行读写getline()读取一行get(...
    99+
    2022-11-13
  • Java超详细梳理IO流的使用方法上
    目录Java语言的输入输出类库1.流的概念2.流的分类3.流的作用4.输入输出流类库使用InputStream和OutputStream流类1.基本输入输出流1.InpitStrea...
    99+
    2022-11-13
  • C++超详细梳理基础知识
    目录命名空间的使用来源命名空间的使用不展开部分展开全展开函数重载函数重载的规则C++如何实现函数重载引用命名空间的使用 来源 在了解命名空间的原理和使用之前,我们先要理解,命名空间是...
    99+
    2022-11-13
  • Java超详细讲解IO操作字节流与字符流
    目录IO操作字节流FileInputStreamFileOutputStream字节流读写案例字符流FileReaderFileWriter字节流与字符流的区别IO操作 字节流 ...
    99+
    2022-11-13
  • C++详细讲解IO流原理
    目录1. C语言的输入与输出2. 流是什么3. C++IO流4. stringstream的简单介绍1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf (...
    99+
    2022-11-13
  • C语言语义陷阱超详细梳理总结
    目录1 指针与数组2 非数组的指针3 作为参数的数组声明4 空指针并非空字符串5 边界计算与不对称边界6 求值顺序7 整数溢出8 为函数提供返回值1 指针与数组 C语言中只...
    99+
    2022-11-13
  • C++超详细梳理lambda和function的使用方法
    目录lambda表达式谈谈lambda的捕获万能的functionbind操作lambda表达式 lambda表达式又称为匿名表达式,是C11提出的新语法。[]存储lambda表达式...
    99+
    2022-11-13
    C++ lambda C++ function
  • C++ 超详细梳理继承的概念与使用
    目录继承的概念及定义继承的概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱...
    99+
    2022-11-13
  • C++文件操作,超级详细
    目录 常用的文件操作方式:打开文件打开方式参数以只读方式打开文件以只写方式打开文件以追加方式打开文件文件流迭代器 常用的文件操作方式: FILE 结构体:FILE 结构体是 C 语言中...
    99+
    2023-10-18
    c++ ios 开发语言
  • C语言 超详细梳理总结动态内存管理
    目录一.为什么存在动态内存分配二.动态内存函数的介绍1.malloc和free2.calloc3.realloc三.常见的动态内存错误1.对NULL指针的解引用操作2.对动态开辟空间...
    99+
    2022-11-13
  • C语言超详细梳理排序算法的使用
    目录排序的概念及其运用排序的概念排序运用插入排序直接插入排序希尔排序选择排序直接选择排序堆排序交换排序之冒泡排序总结排序的概念及其运用 排序的概念 排序:所谓排序,就是使一串记录,按...
    99+
    2022-11-13
  • Java文件与IO流操作原理详细分析
    目录一、文件1、基本解释2、常用的文件操作3、获取文件相关信息4、目录操作和文件删除二、IO流原理及分类1、IO流原理2、流的分类3、IO流体系图一、文件 1、基本解释 (1)什么是...
    99+
    2022-11-13
  • C++超详细讲解逻辑操作符
    目录一、逻辑运算符的原生语义二、重载逻辑操作符三、小结一、逻辑运算符的原生语义 操作数只有两种值( true和 false )逻辑表达式不用完全计算就能确定最终值最终结果只能是 tr...
    99+
    2022-11-13
  • C++超详细讲解逗号操作符
    目录一、逗号操作符二、重载逗号操作符三、小结一、逗号操作符 逗号操符( , )可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号...
    99+
    2022-11-13
  • Java详细讲解IO流的Writer与Reader操作
    目录接口连接一、Writer方法二、Reader方法接口连接 public static void main(String[] args) throws Exception io流的...
    99+
    2022-11-13
  • C++超详细讲解操作符的重载
    目录一、需要解决的问题二、操作符重载三、小结一、需要解决的问题 下面的复数解决方案是否可行? 下面看一下复数的加法操作: #include <stdio.h> clas...
    99+
    2022-11-13
  • C语言操作符超详细讲解下篇
    目录前言赋值操作符单目操作符单目操作符介绍sizeof 和 数组关系操作符逻辑操作符条件操作符逗号表达式下标引用与函数调用和结构成员[ ] 下标引用操作符( ) 函数调用操作符访问一...
    99+
    2022-11-13
  • C语言操作符超详细讲解上篇
    目录前言1、操作符的分类2、算术操作符3、移位操作符3.1 左移操作符3.1.1 正数左移1位3.1.2 负数左移1位3.2 右移操作符3.2.1 正数右移1位3.2.2 负数右移1...
    99+
    2022-11-13
  • C语言超详细讲解文件的操作
    目录一、为什么使用文件二、什么是文件1.程序文件2.数据文件3.文件名三、文件指针四、文件的打开和关闭五、文件的顺序读写六、文件的随机读写fseekftellrewind七、文件结束...
    99+
    2022-11-13
  • C++超详细讲解数组操作符的重载
    目录一、字符串类的兼容性二、重载数组访问操作符三、小结一、字符串类的兼容性 问题:string 类对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗? string 类最大...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作