C++的流输入和输出操作

1、简单提示输入和输出

2、为格式化提供操作符和标志

3、输入和输出对象类型

4、解析输入例子(日期确认)

 

1、简单提示输入和输出

最常用的程序结合输入和输出来沟通,从他们信息(输入)中为用户呈现有用的信息(输出)。无论什么程序一旦离开输入或者输出功能就是没有用的! 

 

命令行的输入和输出是一个程序与用户之间的互动。虽然命令行界面是如此的单调,但至少可以说,这是最基本和最快捷的执行。

 

一个C++程序可以执行输入和输出有好几种方式,最常见的是通过使用流。“流”这个词语的直觉是一个程序“看”只有输入或输出,而不是起源(源)或数据的目的地。一个常见的比喻,当水从你的脚边流过,你看见你脚下的水却不知道这水从哪里来又要流到哪里去。

 

一个输出例子。

#include <iostream>

 

namespace std;

using namespace std;

 

int main(){

cout << "Hello,world.\n"; // The simple "Hello World" example.

return 0;

}

 

用cout和插入操作符(“<<”)应该始终显示在屏幕终端。

 

输入就像输出一样使用cin和提取操作(“>>”)。cin是最好想法的语法用来获取从键盘输入。尽管使用cin靠近提取操作时所有空白被忽略和跳过。使用复合的提取操作来处理字符串,可能会产生不可预期的运行时效果-通常被称为缓冲区问题-适当的对于用户的不可预测性和他们古怪的输入。

 

提取操作是最保守的用来数字输入或者用来可预测性的格式输入-通常来自一个准备好的文件。

 

cout派生自ostream类和cin是派生自istrem类。继承是很有用处的,等下介绍。

 

获取用户最安全的方式是使用重载成员函数get()通常很多程序员都这么做。

 

#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
 char unit;
 bool boolExit = true;

 do
 {
  cout << "Enter Compass Direction.";
  cin.get(unit);  // Get a single character.
  while('\n' != cin.get()); // Clear Buffer.
  switch(unit)
  {
  case 'n':
  case 'N':
   cout << "North.";
   break;

  case 's':
  case 'S':
   cout << "South.";
   break;

  case 'e':
  case 'E':
   cout <<"East.";
   break;

  case 'w':
  case 'W':
   cout <<"West.";
   break;

  default:
   cout << "Check Your Compass.\n";
   boolExit = false;
   break;

  }

 } while ( !boolExit);

 

 return 0;
}

 

前面这个例子的程序请求用户输入,程序预期一个单独的字符。然而用户不会注意到这个单独字符的条件,因此程序员的职责需要预料和处理所有可能的输入-包括“愚蠢”的输入。

 

例子中,只有用户在输入第一个字符来试着存储和验证。所有其他后面的字符串会被这一行“吃掉”:while( '\n' == cin.get() );这会避免缓冲区问题和停止do..while loop 重复的一遍又一遍的同时从一个长的字符串获取各个字符和阻止转储“Check Your Compass”。大家都清楚没有清除缓冲会遇到不良运行时效果。使用流时出现缓冲错误是很常见的。记住要要永远清除缓冲!

程序要能处理用户输入不同长度的字符和有效率的方式存储输入在内存中。通过使用指针可以达到这个目的。

记住指针是一个保存一段运行时在堆上分配预留内存的首地址。一个指针可以“指向”所有类型的变量。一个指针甚至可以指向另外一个指针。

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 char buffer[101], * said;
 cout << "Enter:";
 cin.get(buffer, 101, '\n');
 while('\n' != cin.get());
 said = new char[strlen(buffer)+1];
 strcpy(said, buffer);
 cout << "Echo:" << said;
 delete []said;
 
 system("pause");
 return 0;
}

 前面这个例子第一申明了一个正常的cstring, 有充足的缓冲。第二,一个新的动态的cstring的大小是由通过strlen()函数取得缓冲的大小再增加1用来存放null终止符。显然这样可以节省内存,如果要存储有多个cstring,而不是分配相同的固定长度为每个cstring的。

由于输出可能要被“分流”到不同的目的地,比如,给的低劣的屏幕或文本文件,继承的使用。

#include <iostream>
#include <fstream>
using namespace std;

void stream2(ostream& os, char *);

int _tmain(int argc, _TCHAR* argv[])
{
 stream2(cout, "Hello World.\n");

 char *say = "And Hello again.\n";
 stream2(cout, say);

 ofstream outFile;
 outFile.open("sample.txt");
 stream2(outFile, say);
 outFile.close();

 return 0;
}

void stream2(ostream& os, char *say)
{
 os << say;

 return;
}

前面这个例子,ostream类是作为函数stream2()的一个参数。这是因为继承允许许多输入流通过函数体,包括ofstream类型的文件流和ostream类型的标准cout。

也有一些与char say[] = "Whatever"很相似;而不是char *say="Whatever";。大多数人会说这两个代码片段没什么不同。那么,这两者之间是否有所不同呢?当然有。使用数组在静态内存块标记了9个字节的存储,8个字符加上一个NULL字符。然而,指针同样标记了需要的9个字节,另外有两个字节来保存引用char2say的指针变量。

继承是C++一个强大的特征,用来派生类。简单地说,一个派生类使用一个现有的类,但是添加了独特的功能(额外的特征)类形成一个新的类。比如,cout和ofstream同样都派生自ostream类-ofstream类增加额外的成员函数像open()和close()。cin和ifstream同样派生自istream类。

需要注意的是一个流可以成为一个函数的参数,唯一的限制是这个函数的形参必须传引用而不是传值。

一些有用的流控制函数的概况:

istream::get() 从istrem获取和返回一个字符-包含空白字符。

istream::get(char&) 从istream获取一个字符并且存储到参数别名的引用。也包含空白字符。

istream::get(char*, int ,char) 从istream处不断获取字符直到整数限制-1到达,找到分界字符,或者到达流的末尾。获取的字符存储到给定的由null终结的cstring。如果分界符找到了,那么它不提取也不存放。这个也包含空白字符。

ostream::put(char) 放一个单独发字符到ostream中。

istream::putback(char) 将一个字符放回到istream。这个字符必须是刚刚提取的,否则其结果未定义。

转载于:https://www.cnblogs.com/qqting/archive/2010/08/16/1800839.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI虚拟偶像:知识图谱赋予AI“生命感”

来源&#xff1a;脑极体AI是个非常有趣的词&#xff0c;不管是中文翻译的&#xff0c;还是英文的Artificial Intelligence&#xff0c;都有“生物性”的含义。一个是集结了地球顶尖智慧的“人工”&#xff0c;另一个Intelligence则专指生物拥有的智慧。不过在当今的AI风潮中&am…

PySide6、PyQt6、ui文件转py文件、Qt Designer 使用

QT 官网&#xff1a;https://www.qt.io/zh-cn/develop 用 Python 编写安卓 APK&#xff1a;https://zhuanlan.zhihu.com/p/398126847 1、PySide6、PyQt6、PyQt5 PySide6、PySide2、PyQt5 都是基于 Qt 库&#xff0c;Qt 是一组 C 库和开发工具&#xff0c;包括图形用户界面、网…

用visio反向工程画oracle数据库表的结构图

步骤: 1、数据库----反向工程 2、在反向工程向导中选择--设置--然后选择---Microsoft--ODBC-for--oracle 3、新建数据源---选择用户数据源----Microsoft--ODBC-for--oracle4、输入用户名和数据库名5、输入数据库密码---选择需要绘制的表转载于:https://www.cnblogs.com/kokyu/a…

Mockito—参数匹配~任意

import org.mockito.Mockito;Test public void withUnspecifiedArguments() {List list Mockito.mock(List.class);//匹配任意参数Mockito.when(list.get(org.mockito.Matchers.anyInt())).thenReturn(1);//测试Assert.assertEquals(1, list.get(1));Assert.assertEquals(1, l…

该如何对「半监督学习算法」实际性应用进行评估?Google给出了新答案

原文来源&#xff1a;arXiv 作者&#xff1a;Avital Oliver、Augustus Odena、Colin Raffel、Ekin D. Cubuk、Ian J. Goodfellow「雷克世界」编译&#xff1a;KABUDA、EVA半监督学习&#xff08;Semi-supervised learning&#xff0c;SSL&#xff09;提供了一个强大的框架&…

Python PyQt5 教程

PyQt5教程 &#xff1a;http://code.py40.com/face 教程翻译自&#xff1a;http://zetcode.com/gui/pyqt5/ PyQt5 的 核心API 以及 扩展应用&#xff08;CSDN 学院收费视频&#xff09;&#xff1a;https://edu.csdn.net/course/play/9870/222942 pyqt5 - 对文本样式进行操作&…

Silverlight中全屏处理

Silverlight插件支持全屏模式&#xff0c;这个没什么好说的&#xff0c;只需要用设置IsFullScreen属性即可&#xff0c;问题在于全屏模式中&#xff0c;尽管屏幕变大了&#xff0c;但是页面中的控件并未相应的变大&#xff0c;下面是我在网上找到的解决这个问题的两种方式。 第…

Mockito—参数匹配

mock方法时&#xff0c;总会因场景不同&#xff0c;调整参数的匹配情况。比如&#xff1a;某个参数是为了在数据库进行模糊查询的&#xff1b;或则精确匹配时&#xff0c;引用类型参数未实现equals方法。这时候就需要mock方法时&#xff0c;进行不同匹配。 1. 参数精确匹配 Ma…

人工智能的过去、现在和未来

来源&#xff1a; 人工智能和大数据 作者&#xff1a; 腾讯 AI Lab 主任 张潼在回答人工智能达到了什么程度这个问题之前&#xff0c;需先了解人工智能的概念是什么&#xff1f;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是指计算机像人一样拥有智…

Python3 函数注释: 参数 中 的 冒号 与 箭头

From&#xff1a;https://blog.csdn.net/liang19890820/article/details/74264380 简述 在 Python 3.x 中&#xff0c;增加了一个新特性 - 函数注释&#xff08;Function Annotations&#xff09;&#xff0c;顾名思义&#xff0c;可做为函数额外的注释来用。 函数注释是一个可…

软件生存周期文档系列 之 6.用户操作手册

6 用户操作手册 6.1 引言 6.1.1 编写目的 6.1.2 项目背景 6.1.3 参考资料&#xff08;包括项目计划任务书、合同或批文&#xff1b;项目开发计划&#xff1b;需求规格说明书&#xff1b;概要设计说明书&#xff1b;详细说明书&#xff1b;测试计划等&am…

Dom4j完整教程~DOM4J简介

DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台&#xff0c;采用了 Java 集合框架并完全支持 DOM&#xff0c;SAX 和 JAXP。 DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型&#xff0c;就能使用。 Dom&#xff1a;把整个文档作为一个对象。 DO…

除了芯片 我们还应关注哪些核心技术

来源&#xff1a;传感器技术&#xff08;公众号&#xff09;最近的“中兴封杀”事件&#xff0c;让国人深深领略了缺少核心技术给企业乃至行业和国家带来的巨痛。除了我们知道的芯片技术之外&#xff0c;还有哪些核心技术需要我们重点关注呢&#xff1f;超级计算终端 超级计算终…

Python PyInstaller 安装 和 使用教程( 打包生成 exe )

From&#xff1a;http://c.biancheng.net/view/2690.html Python zipapp打包教程&#xff1a;http://c.biancheng.net/view/2687.html 在创建了独立应用&#xff08;自包含该应用的依赖包&#xff09;之后&#xff0c;还可以使用 PyInstaller 将 Python 程序生成可直接运行的程…

Dom4j完整教程~XML文档简单操作

读取XML文档&#xff1a; 读写XML文档主要依赖于org.dom4j.io包&#xff0c;有DOMReader和SAXReader两种方式。因为利用了相同的接口&#xff0c;它们的调用方式是一样的。 public static Document load(String filename) { Document document null; try { SAXReader sax…

Yann LeCun:距离“真正的” AI,我们还缺什么?

来源&#xff1a; AI科技大本营&#xff08;ID&#xff1b;rgznai100&#xff09;GMIC Beijing 2018 大会第一天&#xff0c;首个演讲者是 Facebook 首席 AI 科学家 Yann LeCun。他讲述了关于深度学习的最新研究成果&#xff0c;同时也描述了深度学习的未来&#xff0c;以及机…

Python 使用 smtp ssl 模式 发送邮件与附件

参考 &#xff1a; 发送邮件简单入门 ( 以qq邮箱,163邮箱为例 ) &#xff1a;https://blog.csdn.net/qq_38661599/article/details/81013834 smtp ssl 模式 发送邮件 与 附件&#xff1a;https://www.cnblogs.com/SunshineKimi/p/10629342.html Python…

Unity.Interception System (2.0)

转载于:https://www.cnblogs.com/artech/archive/2010/08/27/1810010.html

PyQt5 快速开发 与 实战

From&#xff1a;https://blog.csdn.net/jia666666/category_9278208.html PyQt5 信号 与 槽 信号与槽的入门应用&#xff08;一&#xff09;&#xff1a;https://blog.csdn.net/jia666666/article/details/81774175 信号与槽的再细分&#xff08;二&#xff09;&#xff1a;ht…

Flex 流式布局 之 滚动条篇

Flex 流式布局 之 滚动条篇 flex 框架支持流式布局&#xff0c;什么是流式布局呢&#xff0c;就是在运行时对象的大小是未知的&#xff0c;它可能需要由他的内容(childs)或由它的容器来决定它的实际大小。flex 中有两种流式一种就是 百分比形式的(percentWidth)&#xff0c;还…