未格式化的输入/输出操作

单字节操作

单字节 IO 操作 说明
is.get(ch) 从 istream is 读取下一个字节存入字符 ch 中,返回 is
os.put(ch) 将字符 ch 输出到 ostream os,返回 os
is.get() 将 is 的下一个字节作为 int 返回
is.putback(ch) 将字符 ch 放回 is,返回 is
is.unget() 将 is 向后 移动一个字节,返回 is
is.peek() 将下一个字节作为 int 返回,但不从流中删除它

使用未格式化 IO 操作读取和写入一个字符

char ch;
while(cin.get(ch))
    cout.put(ch);

将字符放回输入流

  • peek 返回输入流中下一个字符的副本,但不会将它从流中删除,peek 返回的值仍然留在流中。
  • unget 使得输入流向后移动,从而最后读取的值又回到流中。即使不知道最后从流中读取什么值,仍然可以调用 unget。
  • putback 是更特殊版本的 unget:它退回从流中读取的最后一个值,但它接受一个参数,此参数必须与最后读取的值相同。

一般情况下,在读取下一个值之前,标准库保证可以最多退回一个值,即标准库不保证在中间不进行读取操作的情况下能连续调用 putback、unget。

char ch1,ch2;
ch1 = cin.peek();  //@ 读而不取
cout << ch1 << endl;
ch2 = cin.get();
cout << ch2 << endl;
char ch1, ch2, ch3, ch4;
cin >> ch1 >> ch2 >> ch3;
cin.unget();    //@ 最后读取的字符回退到流
cin >> ch4;     //@ ch3 == ch4

cout << "=================" << endl;
cout << ch1 << endl;
cout << ch2 << endl;
cout << ch3 << endl;
cout << ch4 << endl;
    char ch1, ch2, ch3, ch4;
    cin >> ch1 >> ch2 >> ch3;
    cin.putback(ch3);   //@ 最后读取的字符回退到流,参数必须是最后读取的字符
    cin >> ch4;     //@ ch3 == ch4

    cout << "=================" << endl;
    cout << ch1 << endl;
    cout << ch2 << endl;
    cout << ch3 << endl;
    cout << ch4 << endl;

从输入操作返回 int 值

peek 和无参版本的 get 都返回 int 类型的值。

返回 int 的原因是,可以返回文件尾后标记,char 范围的每个值都可以表示一个真实的字符,但是取值范围中没有额外的值可以用来表示文件尾。

返回 int 的函数将它们返回的字符首先转换为 unsigned char,然后再将结果提升到 int。

标准库使用负值作为文件尾, cstdio 中定义了 EOF 用于表示文件尾:

while((ch = cin.get()) != EOF)
    cout.put(ch);

多字节操作

多字节的未格式化 IO 一次可以操作大块数据,这些操作要求分配并管理用来保存和提取数据的字符数组:

多字节 IO 操作 说明
is.get(sink,size,delim) 从 is 中最多读取 size 个字节,并保存在字符数组中,sink 表示字符数组的起始地址,读取过程中直至遇到字符 delim 或读取 size 个字节或遇到文件尾时停止。如果遇到 delim,则将其保留在输入流中,不读取出来存入 sink。
is.getline(sink,size,delim) 与接受三个参数的 get 版本类似,但会读取并丢弃 delim。
is.read(sink,size) 读取最多 size 个字节,存入字符数组 sink 中,返回 is。
is.gcount() 返回上一个未格式化读取操作从 is 读取的字节数。
os.write(source,size) 将字符数组 source 中的 size 个字节写入 os,返回 os。
is.ignore(size,delim) 读取并忽略最多 size 个字符,包括 delim,与其他未格式化函数不同,ignore 有默认参数,size 的默认值是1,delim 的默认值为文件尾。

get 和 getline 接受相同的参数,sink 表示一个 char 数组,用来表示数据。两个函数都一直读取数据,直到下面的条件之一发生:

  • 已读取到 size-1 个字符
  • 遇到文件尾
  • 遇到分隔符

两个函数的差别是对分隔符的处理,get 将分隔符留在 istream 中的下一个字符,而 getline 则读取并丢弃分隔符,无论哪个函数都不会将分隔符保存到 sink 中。

确定读取了多少个字符

调用 gcount 可以确定最后一个未格式化输入操作读取了多少个字符,应该在任何后续未格式化输入操作之前调用 gcount 。特别是,将字符退回流的单字符操作也属于未格式化输入操作。如果在调用 gcount 之前调用了 peek,unget,putback,则 gcount 的返回值为 0。

低层函数容易出错

如果把 get 或者 peek 的返回值赋予一个char 而不是 int,则因为不同的编译平台对 char 有不同的解释,如果将 char 解释为 unsigned char :

char ch;
while((ch = cin.het()) != EOF)
    cout.put(ch);       //@ 因为如果读到 EOF 将其赋值给 char,将导致死循环

原文地址:https://www.cnblogs.com/xiaojianliu/p/12404210.html

时间: 2024-10-11 04:05:04

未格式化的输入/输出操作的相关文章

2.4 基本的输入/输出操作

在C++输入/输出围绕着数据流这个概念,在数据流中,可以把数据插入输出流,或者从输入流析取数据.到屏幕上命令行的标准输出流称为cout,来自键盘的互补输入流称为cin.这两个流的名称都定义在std名称空间. 2.4.1 从键盘中输入 可以通过标准输入流cin从键盘获得输入,这时要使用流的析取运算符>>.要从键盘把两个整数值读入整型变量num1和num2,eg:std::cin >>num1 >>num2; 析取运算符>>“指向”数据流动的方向,本例中,数据是

Java的输入/输出操作

Java的输入\输出机制 计算机的基本功能就是通过输入输出设备与外部其他设备尽心数据的交互,从其他设备读入数据叫做输入操作,将计算机内的数据写入到其他设备叫做输出操作.可以向计算机发送数据.又可以接受计算机数据的设备叫做输入/输出(I/O)设备,例如磁盘.网络等. Java中主要按照一种方式进行数据交换——流(Stream)的方式.流方式就好比是建立在数据交换源与目的地之间的一条通信路径.但是数据在作为流在该路径中进行传输.数据流的走向是有方向的,相对于计算机而言,传向计算机的数据流叫做输入流(

Ruby——输入&amp;输出

Ruby的输入和输出操作.输入是程序从键盘.文件或者其他程序读取数据.输出是程序产生数据.可以输出到屏幕.文件或者其他程序. Ruby中的一些类有些方法会执行输入&输出操作.例如Kernel.IO.Dir或者File.重点注意Kernal ,IO,两种不同方式 输出到终端 Ruby有一些在终端上打印输出的方法.这些方法是Kernel模块的一部分.Kernel模块的方法对于所有的Ruby对象都是有效的. print和puts方法会将文本输出到终端.它们的不同是会在最后加上一个换行符.print实际

9、流类库与输入/输出

就像C语言一样,c++语言中也没有输入/输出语句.但c++编译系统带有一个面向对象的输入/输出软件爱你包,它就是I/O流类库. 1.I/O流的概念及流类库结构 I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品. 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象. 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动.程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对

Java 输入/输出——流体系(处理流)

关于使用处理流的优势,归纳起来就是两点:(1)对于开发人员来说,使用处理流进行输入/输出操作更简单:(2)使用处理流执行效率更高. 下面程序使用PrintStream处理流来包装OutputStream,使用处理流后的输出流在输出时将更加方便. 1 package com.zyjhandsome.io; 2 3 import java.io.*; 4 5 public class PrintStreamTest { 6 7 public static void main(String[] arg

【计算机组成原理】 输入/输出系统

I/O 系统基本概念 I/O 系统中的几个基本概念如下: 外部设备.包括输入/输出设备及通过输入.输出接口才能访问的外存储结构. 接口.在各个外设与主机之间传输数据时进行各种协调工作的逻辑部件.协调包括传输过程中速度的匹配.电平和格式转换等. 输入设备,用于向计算机系统输入命令和文本.数据等信息的部件.键盘和鼠标是最基本的输入设备. 输出设备.用于将计算机系统中的信息输出到计算机外部进行显示.交换等的部件.显示器和打印机是最基本的输出设备. 外存设备.指除计算机内存及 CPU 缓存等外的存储器.

python基础(文件输入/输出 内建类型 字典操作使用方法)

本文主要介绍了python基础入门,包括文件输入/输出.内建类型.字典操作等使用方法 一.变量和表达式 代码如下: >>> 1 + 1 2>>> print 'hello world' hello world>>> x = 1               >>> y = 2>>> x + y3 Python是强类型语言,无法根据上下文自动解析转换成合适的类型. Python是一种动态语言,在程序运行过程中,同一个变量

《C语言程序设计:现代方法(第2版)》第3章 格式化输入/输出

目录 第3章 格式化输入/输出 第3章 格式化输入/输出 在探索难以实现的问题时,问题本身的简单性只会使情况更糟. scanf函数和printf函数是C语言编程中使用最频繁的两个函数,它们用来格式化输入和输出.正如本章要展示的那样,虽然这两个函数功能强大,但要用好它们却不容易.3.1节描述printf函数,3.2节则介绍scanf函数.但是这两节的介绍都不完整,完整的细节将留到第22章中介绍. 原文地址:https://www.cnblogs.com/shenhuanjie/p/11431045

0X04 字符串和格式化输入/输出

字符串(character string)就是一个或多个字符的序列.如:"hello world",双引号不是字符串的一部分,而是通知编译器,这是一个字符串. C没有为字符串定义专门的变量类型,而是把它存储在一个char数组中.该数组的单元数必须要比字符数多1,因为字符串在数组的最后一个位置会有\0. 在printf中用%s表示打印一个字符串. strlen()函数,以字符为单位给出字符串的长度.需要使用string.h头文件,该头文件中包含许多与字符串相关的函数原型. sizeof: