一:C++输入输出包含下面3个方面

(一)标准I/O

对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出。

(二)文件I/O

以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出

(三)串I/O

对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出

二:I/O类库中常用流类

(一)类名及作用

(二)类关系

ios是抽象基类,由它派生出istream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。

istream类支持输入操作,
ostream类支持输出操作,
iostream类支持输入输出操作。
iostream类是istream类和ostream类通过多重继承而派生的类。
C++对文件的输入输出需要用ifstrcam和ofstream类,两个类名中第1个字母i和o分别代表输入和输出,第2个字母f代表文件 (file)。
ifstream支持对文件的输入操作,
ofstream支持对文件的输出操作。
类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream。

三:标准I/O流:cin,cout,cerr,clog

对象

含义

对应设备

对应的类

c语言中相应的标准文件

cin

标准输入流

键盘

istream_withassign

stdin

cout

标准输出流

屏幕

ostream_withassign

stdout

cerr

标准错误流

屏幕

ostream_withassign

stderr

clog

标准错误流

屏幕

ostream_withassign

stderr

(一)标准输入流

1:常见函数

cin.get()  //获取字符,指定个数字符(字符串),按照字符截取字符串
cin.getline()  //获取一行字符串(允许空格)
cin.ignore()
cin.peek()
cin.putback()

cin.get()的使用


1:cin.get() 读取一个字符

    char a;
a = cin.get();
cout << a << endl;

或者

    char a;
cin.get(a);
cout << a << endl;

2:cin.get()读取指定个数字符(字符串)

    char a[];
cin.get(a,);  //虽然我们获取5个,但是当我们输入5个及以上,内部函数只会获取4个字符,最后加上'\n'
cout << a << endl;  

3:cin.get()获取字符串(根据指定字符截止)

    char a[];
cin.get(a,10,'a');  //遇到字符'a'则结束
cout << a << endl;

4:cin.get()更多用法可以查看源码定义和声明


cin.getline()的使用 :同get()方法的后面两种一致


1.方法一:获取指定个数字符

    char a[];
cin.getline(a,);
cout << a << endl;

2.方法二:按照指定字符截取获取字符串

    char a[];
cin.getline(a,,'z');
cout << a << endl;

注意:getline两种用法区别《重点》

_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{ // get up to _Count characters into NTCS, discard newline  
会将一行数据到'\n'之前全部取出处理,会处理更多的缓冲区数据

return (getline(_Str, _Count, _Myios::widen('\n')));
} _Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim  
只会按照指定字符截取字符串,所以不会获取所有缓冲区数据

 cin.ignore()的使用


1.缓冲区引入《重点》

键盘输入和应用程序处理之间存在输入缓冲区
应用程序和设备磁盘文件之间存在输出缓冲区

例如图中输入字符串先是放入缓冲区中,只取走其中部分字符串。
其余字符串依旧存在缓冲区中,若是继续获取字符,则会先将之前剩余的字符串取出(而这一部分可能是我们不需要的)
    char a[];
cin.getline(a,,'z');
cout << a << endl;
cin.getline(a, , 'f');
cout << a << endl;
system("pause");

注意:若是想取走缓冲区剩余字符。可以使用cin.getline()取走所有剩余数据就可以了

2.cin.ignore()可以用于清除(忽略)缓冲区剩余内容指定个数

    char a[];
cin.getline(a,,'z');
cout << a << endl;
cin.ignore(); //默认是忽略一个字符
cin.getline(a, , 'f');
cout << a << endl;

cin.ignore(); //忽略5个字符

cin.peek()的使用:读缓冲区中下一个字符,但是不将其取走


    char a[];
char ch;
ch = cin.peek();
cout << ch << endl;
cin.getline(a, );
cout << a << endl;


cin.putback()的使用:在缓冲区前面插入一个字符


    char a[];
cin.get(a, );
cout << a << endl;
cin.putback('A');
cin.getline(a, );
cout << a << endl;


更多方法查看手册或者看源码即可


(二)标准输出流

1.输出流控制符

2.用于控制输出格式的流成员函数

3.设置格式状态的格式标志

4.案例使用一 (double浮点型)

    double a = 123.45678910;

    cout << a << endl;    //默认6位有效数 123.456
cout << setprecision() <<a<< endl; //9位有效数 123.456789
/***********浮点数******************/
cout << setprecision();
//浮点数以定点形式输出,精度变为小数点保留位数
cout << setiosflags(ios::fixed) << a << endl; //123.4567891
cout << setiosflags(ios::fixed) << setprecision() << a << endl; //123.45678910
cout << setprecision();
cout << setiosflags(ios::scientific) << a; //设置浮点数以科学计数法形式显示 0x1.edd4p+6

5.案例使用二(int整型):注意setw域宽只对后面一个输出有效

    int a = ;

    cout << a << endl;    

    cout << hex <<a<< endl;    //16进制显示
cout << setiosflags(ios::uppercase) << a << endl; //16进制字母大写
cout << setw() << endl; //设置域宽 右对齐
cout << setfill('*') << a << endl; //右对齐,域宽10,空白填充* cout << setw() << setfill('^'); //设置域宽--->注意setw域宽只对后面一个输出有效
cout << setiosflags(ios::left) << a << endl; //左对齐 //想显示+号,需要在10进制下
cout << dec<<setw()<<setfill('%');
cout << setiosflags(ios::showpos) << a << endl; //设置显示+号

6.注意点

.成员函数width-->cout.width()
setw--->cout<<setw()
只对其后的第一个输出项有效
.格式状态分5组,每组只有一个有效(互斥)例如:dec,oct,hex设置多个只有后面那个有效
.可以使用'|'一次设置多个状态

四:文件I/O

ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。
ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。
fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

(一)状态模式

文件输入输出设置方式

注意:有些属性是互斥的,使用时注意
例如:app和trunc--->app是在文件末尾加入,而trunc是清空文件查询写入。功能互斥,用于打开文件会打开失败
。
注意:打开文件时,所有打开方式,基本都是:若是文件不存在则自动创建

文件属性

属性  含义
0  普通文件,打开访问
1 只读文件
2 隐含文件
3 系统文件

(二)案例使用:写入文件并读取数据

#include <iostream>
#include <fstream> void main()
{
char info[];
cin.getline(info, ); //写入数据
ofstream ofile;
ofile.open("D:\\1\\io2.txt", ios::app|ios::trunc); //以追加和创建方式打开 默认是普通文件
if (!ofile)
{
cout << "ofile open failure" << endl;
}
else
{
ofile << info; //写入普通数据
ofile.close(); //关闭文件
} memset(info, , ); //初始化空 //读取数据
ifstream ifile;
ifile.open("D:\\1\\io2.txt", ios::in); //读取文件 0是默认普通文件,可以像上面一样不写
if (!ifile.is_open())
{
cout << "open failure" << endl;
}
else
{
ifile.getline(info, );
ifile.close();
cout << info << endl;
} system("pause");
}

(三)案例使用:二进制文件操作read,write

对二进制文件的读写主要使用istream中的write和read方法来实现
istream& read(char* buf,int len)
ostream& write(char* buf,int len)
typedef struct
{
char name[];
bool sex;
int age;
}Stu; void main()
{
//结构体操作
Stu s,s2;
strcpy(s.name, "fagfwa");
s.sex = true;
s.age = ; //写入二进制文件
ofstream ofile;
ofile.open("D:\\1\\stu.bin", ios::binary|ios::out);
if (!ofile.is_open())
return ;
ofile.write((char*)&s,sizeof(s));
ofile.close(); //读取二进制文件
ifstream ifile;
ifile.open("D:\\1\\stu.bin", ios::binary | ios::in);
if (!ifile)
return;
ifile.read((char*)&s2, sizeof(s2));
cout << s2.name << endl << s2.age << endl << s2.sex << endl;
ifile.close(); system("pause");
}

C++回顾day03---<输入输出流>的更多相关文章

  1. Java I/O(二)其他常用的输入输出流PrintStream等、标准流重定向

    四.FilterOutputStream.PrintStream PrintStream是继承自FilterStream类的,例如标准输出流System.out就是著名的PrintStream类对象. ...

  2. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  3. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  4. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  5. java 对象输入输出流

    对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息.              ObjectInputStream   : 对象输入流            ...

  6. 【转】输入/输出流 - 全面掌握IO

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  7. 输入输出流(IO)

    输入输出流(IO)文件(File)java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等), ...

  8. Java输入/输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  9. JAVA Io 缓冲输入输出流

    java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...

  10. C++输入输出流

    一.C++输入输出流的含义 以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.程序的输入指的 ...

随机推荐

  1. 炫龙炎魔T1笔记本 Win7 系统安装

    系统链接:https://pan.baidu.com/s/1T5FdJf1jhTj78vEBYCXxyA 密码:rl7m 1.制作系统盘(下载文件中有教程),插好U盘,重启计算机 2.按F2进入BOS ...

  2. chome(谷歌浏览器)上传文件崩溃/上传图片崩溃/打开浏览文件未响应 解决方案

    测试解决方案:关闭搜狗输入法(我用的是搜狗输入法,若使用其他输入法,此方案也可能适用),再测试是否重现浏览器崩溃问题 可选解决方案:升级搜狗输入法(如果想 卸载输入法 也可以) 前面有段时间chome ...

  3. 设置TextBlock默认样式后,其他控件的Text相关属性设置失效问题

    问题: 定义了默认TextBlock样式后,再次自定义下拉框 or 其他控件 ,当内部含有TextBlock时,设置控件的字体相关样式无效,系统始终使用TextBlock设置默认样式 解决方案: 为相 ...

  4. 本机不安装Oracle客户端,使用PL/SQL Developer和 Instant Client 工具包连接oracle 11g远程数据库

    一.先到Oracle网站下载Instant Client 下载地址:http://www.oracle.com/technetwork/cn/database/features/instant-cli ...

  5. easyui中datagrid+layout布局

    1.掌握layout布局 首先,layout布局的具体使用可参考官网http://www.jeasyui.net/plugins/162.html layout布局分为东南西北中五个区域,如图我们将其 ...

  6. Thread中的join()方法

    package com.qjc.thread; public class JoinExcemple { // join方法就是用来同步的 public static void main(String[ ...

  7. jQuery each、节点操作、动画演示、尺寸操作、扩展方法

    一.each 1.方式一:$.each(数组或者自定义对象,function(i,j){console.log(i,j)}) $.each(li,function(i,j){ console.log( ...

  8. WiFi广告强推的基本技术原理和一些相关问题

    WiFi推原理(转) 本文地址:http://jb.tongxinmao.com/Article/Detail/id/412 WiFi广告强推的基本技术原理和一些相关问题 WiFi广告推送原理就是利用 ...

  9. (十三)Batch Processing

    In addition to being able to index, update, and delete individual documents, Elasticsearch also prov ...

  10. (四)Exploring Your Cluster

    The REST API Now that we have our node (and cluster) up and running, the next step is to understand ...