1.回忆C语言的IO流

getchar()          //字符输入函数

putchar()          //字符输出函数

fgetc()/getc()     //字符输入函数

fputc()/putc()     //字符输入函数

fgets()/gets()     //文本行输出函数

fputs()/puts()     //文本行输出函数

printf()/scanf()   //标准格式化输入输出函数

fprintf()/fscanf() //所有流的输入输出函数

fread()/fwrite()   //二进制的输入输出

注:上述函数用法总结我的另一篇博客:https://blog.csdn.net/hansionz/article/details/80884217

在C语言中,我们使用最频繁的函数是printf、scanf。C语言的IO函数是借助缓冲区实现的。缓冲区的读写速度较快,设备和代码都能很快的从其中复制数据和写入数据,从而完成IO操作。

缓冲区的缓冲方式分为三类:

全缓冲:当缓冲区写满之后才刷新出来行缓冲:缓冲区遇到换行符既刷新无缓冲:写入的数据立即被刷新出来

输入/输出缓冲区存在的原因:

可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念。有了这缓冲区,就可以定义“行”的概念,然后按“行”解析缓冲区的内容

2.流的概念

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据的抽象描述。C++流是指信息从外设向计算机内部(如内存) 输入或者从内存向外设输出的过程。这种输入输出的过程被形象的比喻为“流”。流的特点是连续性的,具有方向性。C语言的流是基于缓冲区实现的,输入输出的区别在于方向不同和对数据的操作不同。

流可以分为两种:

文本流:在缓冲区中读出和写入时是基于ASCII或Unicode字符编码的。写入缓冲区的最大长度规定为254个字符。在文本文件结束时规定以一个回车符和换行符结尾,在写入缓冲区时,会将\n转换为回车换行符,在从缓冲区中读取出数据时,就会将回车换行符转换为换行符。二进制流:二进制的流在向缓冲区中写入或读出文件时,不进行字符的转换,直接从设备或文件中读取,在这个过程中不发生任何改变,原先是什么样子,读取之后还是什么样子,它是基于二进制数字。

对于每一个ANSI C程序⽽而言,至少打开三个流:标准输入(stdin)、标准输出(stdout)、标准错误(stderr),他们都是一个指向FILE结构的指针。

3.C++中的IO流

为了实现数据的流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。C++的IO操作编译时会对类型严格的检查,所以C++的IO是类型安全的,而C语言中的输入输出并不是类型安全的

C++中三种IO操作:标准IO 文件IO 串IO。

标准IO:兼容了C中的标准的输入输出,以键盘和屏幕为操作对象,从键盘输入或从屏幕输出文件IO:以磁盘文件为输入输出的对象,数据在磁盘中写入和读出串IO:对内存中指定的空间进行输入输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类。这些类可以对基本类型进行输入输出,也可以对自定义的类型进行输入输出,这些类体现了C++标准IO库的可扩展性。

C++在类库中定义了四个全局流的对象:

cin : 标准输入流,对应键盘cout:标准输出流,对应显示器clog:标准输出错误流,对应显示器cerr:标准输出错误流,对应显示器

注意:

使用cin输入的时候,键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用。如果输入错了,必须在回车之前修改,如果回车键按下就无法修改。只有把输入缓冲区中的数据取完后,才要求输入新的数据。输入的数据类型必须与要提取的数据类型一致,否则会报错。出错只是在流的状态字state中对应位置1,程序继续执行。空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入,因为遇到回车说明输入结束。

4.文件流对象

C++中根据文件内容的数据格式分为二进制文件和文本文件,在类库中实现了对文件操作的类。

fstream库中有三个类流:

ifstream :支持从磁盘文件输入(istream)ofstream 支持向磁盘文件输出(ostream)fstream 支持从磁盘文件输入和输出

在使用时,我们需要创建一个流对象来进行操作,cin cout等流对象是在iostream中创建好的(在上边的类图中可以看到)。

ifstream ifile //输入使用

ofstream ofile //输出使用

fstream iofile //输入输出使用

C++对于文件操作和C语言一样,在类中有关于打开,关闭,写入,和读出的对文件操作的成员函数。

打开文件:将一个流对象与一个文件相关联

//通过构造函数

std::ofstream ofile("test1.txt",std::ofstream::out);

参数:文件名和请求标志位

//使用成员函数open

std::ofstream ofile;

ofile.open("test1.txt",std::ofstream::out)

如果该文件已经打开,open会调用失败。

请求标志位如下:

标志功能in(input)打开文件读,内部流缓冲区支持输入操作out(output)文件打开供写入,内部流缓冲区支持输出操作binary执行二进制操作app()append追加,所有的操作都发生在文件的末尾ate(at end)输出位置在文件的末尾trunc(trucate)打开文件之前存于文件之中的内容都会被丢弃

注:文件打开默认位文本文件权限标志位之间可以使用|进行组合。ofstream的流对象默认是out。ifstream默认是in 所以可以不用写。

close:断开当前文件与流对象之间的关联

ofile.colse();

如果当前流对象没有打开文件,则调用时就会失败。

在对文本文件进行操作时可以用插入 >> 运算符和 提取 << 运算符进行

ofstream ofile("test1.txt",std::ofstream::out);

ofile << "sdasdas";  //表示向文件中输入一个数,输出到流上

char a[1024];

ifstream ifile("test1.txt",std::ifstream::in);

ifile >> a;  //读出文件的数据,输入到流中

write:ofstream类中提供了write成员函数,用于向文件中写入数据

ostream& write (const char* s, streamsize n);

read:ifstream类中提供了read成员,用于从文件中读取数据

istream& read (char* s, streamsize n);

对二进制读写时,我们采用write和read成员函数进行操作。

其他的成员函数入put() \ get()

istream& get (char& c); //支持从流中读取单个字符

ostream& put (char c);  //将单个字符插入到流中

使用文件IO流用文本及二进制方式读写配置文件:

#include

#include

#include

using namespace std;

class ConfigInfo

{

public:

int port;

char ip[32];

};

class ConfigManager

{

public:

ConfigManager(const char* file = "test.config")

:configfile(file)

{}

//二进制读写

void WriteBinary(const ConfigInfo& info)

{

ofstream ofile(configfile, ofstream::binary | ofstream::out);

ofile.write((const char*)&info, sizeof(info));

ofile.close();

}

void ReadBinary(ConfigInfo& info)

{

ifstream ifile(configfile, ifstream::binary | ifstream::in);

ifile.read((char*)&info, sizeof(info));

ifile.close();

}

//文本读写

void WriteText(const ConfigInfo& info)

{

ofstream ofile(configfile);

ofile << info.port << endl;

ofile << info.ip << endl;

ofile.close();

}

void ReadText(ConfigInfo& info)

{

ifstream ifile(configfile);

ifile >> info.port;

ifile >> info.ip;

ifile.close();

}

private:

string configfile;

};

int main()

{

ConfigManager man;

ConfigInfo rinfo;

ConfigInfo winfo;

winfo.port = 80;

strcpy(winfo.ip,"127.0.0.1");

//二进制读写

man.WriteBinary(winfo);

man.ReadBinary(rinfo);

cout << rinfo.port << endl;

cout << rinfo.ip << endl;

//文本读写

man.WriteText(winfo);

man.ReadText(rinfo);

cout << rinfo.ip << endl;

cout << rinfo.port <

return 0;

}

C语言IO流存储数据,C++的IO流相关推荐

  1. Java实现图书借阅管理系统(IO流存储数据,附源码)

    目录 前言 一.项目概述 1.项目功能结构图 2.项目功能说明 3.项目其他说明 二.开发过程中需要注意的问题 1.开发顺序及思路 2.IO流读写 3.数据共享 4.业务逻辑问题 三.源码链接 前言 ...

  2. c语言采用文件存储数据,C语言读写文件大全 之 基础篇

    一直想着把C语言和C++关于文件操作的相关内容总结一下,这样在使用的时候就可以顺手拈来,嗯,这就是好记性不如烂笔头.既然是文件操作,那么开篇就从"文件"的介绍开始. 1.文件 文件 ...

  3. c语言怎么样文件存储数据,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

  4. 字符流读写数据的介绍

    1.字符流 当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以ava提供一些字符流类,以字符为单位读写数据,专门 ...

  5. 微信公众号开发之流式数据读取

    用户发送信息到微信服务器,然后微信服务器向我们的服务器发送信息,这个信息属于一个流式的数据,我们要写一些方法处理这个数据 我们新建libs文件夹,在文件夹下新建utils.js的文件,这个文件中主要写 ...

  6. java集合输入存储_Java练习IO流使用Properties集合存储数据并...

    案例: package IO; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; ...

  7. Java语言基础(IO流2(字节流、字符流))

    Java语言基础 IO流 字节流 可以读写任何类型的文件,比如:音频.视频 .文本文件 字节流的抽象基类: 字节输入流:InputStream 字节输出流:OutputStream 我们发现Input ...

  8. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  9. Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

最新文章

  1. mysql 5.7.15 安装_mysql 5.7.15 安装配置方法图文教程
  2. TechEd China 2009 课程幻灯片和代码下载 - MBL311 SQL Server Compact 终极性能调校
  3. Angular 学习笔记——service constant
  4. php5.6.16,OSX 10.11 中重新编译PHP5.6.16问题
  5. Oracle010316,安装oracle后登录时出现 ERROR: ORA-01031 insufficient privileges
  6. (转)从开发小白到音视频专家
  7. 使用Python来处理文件
  8. python游戏开发库_太好玩了!用Python写个弹球游戏2.0
  9. 177.第N高的薪水
  10. Ubuntu 突然不然联网解决方法
  11. 中小学网络中心机房建设标准(试行)
  12. 【实践案例分享】PyFlink 在聚美优品的应用实践
  13. Nacos本地进行了远程配置而远程未配置相关信息而导致应用报内存泄漏问题的异常
  14. Android之仿微信发朋友圈图片选择功能
  15. python大作业题目_Python大作业
  16. 二维数组名、二维数组名取地址、二级指针
  17. C#组件系列——又一款Excel处理神器Spire.XLS(二)
  18. LM317的调压电阻的选择
  19. scratch实现猫捉老鼠(下)
  20. 浮动(Floats)原理与清除浮动

热门文章

  1. python共享内存和分布式实现异步加载数据
  2. 适配器模式:我真的不难
  3. Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
  4. 使用antd报less的错误
  5. .NET 调用c++库注意事项
  6. LINUX CentOS6.8 wdcp面板安装
  7. java mp3播放器 无界面
  8. 使用eclipse搭建嵌入式开发环境
  9. JavaMail邮件别名和主题乱码解决[转]
  10. (转)SplitContainer 控件(Windows 窗体)