C++的流类库与输入输出
C# 数据的输入和输出
Console.Write Line("\n{0:F}\n{0:F4}", a);
using System;
class MyReadline
{
public static void Main()
{
int i;
string str;
Console.Write("请输入你的姓名:");
str= Console.ReadLine();
Console.Write("用户的姓名为:");
5.2.1 数据的格式化
一般实现把数字转换为指定格式的字符串输出的基本方式有3种:
Write()和WriteLine()方法可以直接把数值类型变量的值,转换成字符串输出到控制台中,并可使用格式说明符 来控制输出的数据格式。
Write()方法用来向控制台输出一条信息,并且光标仍在输出信息的末尾。一般Write()方法中有以下两种常用的 形式:
C#的控制台I/O主要是通过命名空间System中的类Console来实现的,该类给出了标准的输入和输出 的方法,这些方法可用于从控制台读写字符。
本章介绍的内容不是任何C#语法,而是.NET框架中常用的控制台输入/输出的类和方法的使用格式。
本章学习重点:
掌握在控制台中输入/输出数据的方法 掌握输出格式化数据的方法 掌握处理字符串的方法
程序运行结果:
请从键盘输入一个字符:a (回车) 97 a
5.1.1 Console.Read()方法
【例5.2】通过Read()方法从控制台接收用户输入的一系列字符,然后把用户输入的内容显示出来。
using System;
class MyRead2
《C++程序设计》电子教案第10章 流类库与输入输出
C++中所有流都是相同的 , 但文件可以不同 。 中所有流都是相同的, 但文件可以不同。 中所有流都是相同的 使用流以后, 使用流以后 , 程序用流统一对各种计算机设备 和文件进行操作,使程序与设备、 和文件进行操作 , 使程序与设备 、 程序与文件 无关,从而提高了程序设计的通用性和灵活性。 无关 , 从而提高了程序设计的通用性和灵活性 。 也就是说, 也就是说 , 无论与流相联系的实际物理设备差 别有多大,流都采用相同的方式运行。 别有多大 , 流都采用相同的方式运行 。 这种机 制使得流可以跨越物理设备平台, 制使得流可以跨越物理设备平台 , 实现流的透 明运作,而与实际的物理设备无关。例如, 明运作 , 而与实际的物理设备无关 。 例如 , 往 显示器上输出字符和向磁盘文件或打印机输出 字符,尽管接受输出的物理设备不同, 字符 , 尽管接受输出的物理设备不同 , 但具体 操作过程是相同的。 操作过程是相同的。
返回本节
10.2 格式化 格式化I/O
10.2.1 10.2.2 10.2.3 10.2.4 ios类中的枚举常量 类中的枚举常量 使用ios成员函数 使用 成员函数 使用I/O操作符 使用 操作符 检测流操作的错误
返回首页
10.2.1 ios类中的枚举常量 类中的枚举常量
在根基类ios中定义有三个用户需要使用的枚举类型, 在根基类 中定义有三个用户需要使用的枚举类型,由 中定义有三个用户需要使用的枚举类型 于它们是在公用成员部分定义的, 于它们是在公用成员部分定义的,所以其中的每个枚举类 型常量在加上ios::前缀后都可以为本类成员函数和所有外 型常量在加上 前缀后都可以为本类成员函数和所有外 部函数访问。 部函数访问。 在三个枚举类型中有一个无名枚举类型, 在三个枚举类型中有一个无名枚举类型,其中定义的每个 枚举常量都是用于设置控制输入输出格式的标志使用的。 枚举常量都是用于设置控制输入输出格式的标志使用的。 该枚举类型定义如下: 该枚举类型定义如下: enum { skipws,left,right,internal,dec,oct,hex,sh owbase,showpoint, uppercase,showpos,scientific,fixed,unitbuf, stdio };
第10章 C++语言的输入与输出-面向对象程序设计(C++语言)(第二版)-程磊-清华大学出版社
设置状态标志flags 清楚状态标志,并返回前状态标志 测试状态标志 设置标志flags, 并返回前状态标志 返回当前的宽度设置值 设置域宽w,返回以前的设置 设置小数位数p,返回以前的小数位数 返回当前的填充字符 设置填充字符ch,返回当前的填充字符
13
下面分别介绍这些成员函数的使用方法;
(1)设置状态标志:
cout<<”x_width=”<<cout.width( )<<endl; cout<<”x_fill=”<<cout.fill ( )<<endl; cout<<”x_precision=”<<cout.precision( )<<endl; cout<<123<<” ”<<123.45678<<endl; cout<<”______________________________\n”; cout<<”*** x_width=10,x_fill=, x_precision=4 ***\n”; cout.width(10); cout.precision(4); cout<<123<<” ”<<123.45678<<” ”<<234.567<<endl;
1. C++的流概述 ❖ 在C++中,输入输出流被定义为类,称为流类。 ❖ I/O 系 统 仍 然 是 以 字 节 流 的 形 式 实 现 的 , 流
(Stream)实际上就是一个字节序列,流总是 与某一设备相联系的,它既可以从输入设备 (如键盘、磁盘等)流向计算机内存,亦可以 从计算机内存流向输出设备(如显示器、打印 机、磁盘等)。 ❖ 输入输出的字节可以是ASCII字符、内部格式 的原始数据、图形图像、数字音频、视频等。
C++:流类库与输入输出
C++:流类库与输⼊输出7.2.1 C++的输⼊输出流ios:流基类(抽象类)istream:通⽤输⼊流类和其他输⼊流的基类ostream:通⽤输出流类和其他输出类的基类iostream:通⽤输⼊输出流类和其他输⼊输出流类的基类(以下的派⽣类对象有cin、cout、cerr、clog)ifstream:输⼊⽂件流类ofstream:输出⽂件流类fstream:输⼊输出⽂件流istrstream:输⼊字符串流类ostrstream:输出字符串流类strstream:输⼊输出字符串类iostream_withassign: 通⽤输⼊输出流类和其他输⼊输出流类iostream的的派⽣类7.2.2 预定义的流对象C++中包含⼏个预定义的流对象,它们是标准输⼊流对象cin、标准输出流对象cout、⾮缓冲型的标准出错流对象ceer、缓冲型的标准出错流对象clogcin是istream的派⽣类istream_withassign的对象,它与标准输⼊设备(通常是键盘)相联系。
cout是ostream的派⽣类ostream_withassign的对象,它与标准输出设备(通常是显⽰器)相联系。
ceer是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
clog是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
由于istream和ostream类都在头⽂件iostream中声明的,因此只要在程序中包含头⽂件iostream.h,C++程序开始时这四个标准流对象的构造函数都被⾃动调⽤。
7.2.3 输⼊输出流的成员函数(1)put函数put函数⽤于输出⼀个字符格式:cout.put(char ch)例如:cout.put('A')===cout.put(65)===cout.put(25+40)(2)get函数get函数的功能与提取运算符>>类似,主要不同之处是get函数在读⼊数据时可以包括空⽩字符,⽽后者不可以。
10 文件流类
10.2 标准I/O流
常用函数:
• 设置输入/输出宽度函数:setw(int)
• 设置输出填充字符函数:setfill(int)
• 设置输出精度函数:setprecision(int) • 设置输入/输出整型数数制函数:dec、hex和oct • 取消输入结束符函数:ws • 控制换行操作符:endl • 代表输出单字符‚\0”的操作符:ends
其实,所谓输入输出,是相对于内存而言的。 在C++程序中,数据可以从程序流向屏幕或磁盘文件,也可以从键盘或 磁盘文件流入到程序中。 换一种角度,简单说,I/O流就是一系列写到屏幕或从键盘读出的各种 字符。 从流中获取数据的操作称为提取(或抽取)操作。 向流中添加数据的操作称为插入操作。 如下图所示:
第10单元 输入输出流
基本概念 标准I/O流 文件I/O流
串I/O流
10.1 基本概念
一、为什么要有C++流类库
C语言中的输入输出系统不支持自定义的对象或数据类型。
如有下面的定义:
struct sample {
int i ;
float f; char *ch; }s1; 不能用下面的输出函数来输出以上结构变量s1: printf(“%sample”,s1);
10.2 标准I/O流
【例】 void main( )
{
char str[]="You will be the C++ master !"; cout.write(str,sizeof(str)-1); cout<<endl; cout.write(&str[4],4) <<endl; }
cin,cout用法详解
在C中,输入输出要用printf和scanf,这是2个很麻烦的东西,因为在输入数据的同时还要说明数据的类型,如果输入数据较多,那就很麻烦了,所以我们的C++搞了两个更爽的东西cout和cin,来替换它们.首先我们先了解一下这两个东西的来处,它们是来自C++的一个类库叫 " iostream".iostream是由istream(输入类)和ostream(输出类)派生.所以在iostream中就有了输入和输出的相关对象:1,cin,表示标准输入(standard input)的istream类对象.cin使我们可以从设备读取数据.2,cout,表示标准输出(standard output)的ostream类对象.cout使我们可以向设备输出或者写数据.3,cerr(暂时还没试过,先别理吧)暂时先介绍那么多,这里我主要想说的是cin.get()和cin.getline(),cin.clear(),cin.sync()等的用法.首先看看cin.get(),它是一个读取单个字符的方法.字符变量=cin.get();相当于cin.get(字符变量);#include<iostream>usingnamespace std;int main(){char cstr;cstr=cin.get(); //读取单个字符,在屏幕输入,也相当于cin.get(cstr);cout<<cstr<<endl; //输出刚刚载入的单个字符system("pause");}运行程序后,一切正常:输入:a 输出:a但当我们输入的不只一个英文字符时,那又会如何呢?输入:abcd 输出:a由此可知,它只能读取第一个字符,但如果我们把程序修改成:int main(){char cstr;char bstr;cstr=cin.get(); //读取单个字符,在屏幕输入bstr=cin.get();cout<<cstr<<bstr<<endl; //输出刚刚载入的单个字符system("pause");}我们再输入:abcd 最后输出了:ab既然cin.get()是读取第一个字符,那bstr为什么不也是a呢?其实原理是这样的:在cin这个对象里,有一个储存字符的流,可以想象成缓冲区,但事实上是cin里封装的一个东西.当我们在程序上输入字符后,对象cin获得了我们输入的字符,例如获得abcd,然后再通过.get()把流里面的第一个字符去掉,赋给cstr,这时,cin里储存的流的数据为bcd,而cstr则获得了 a.当我们再次运行bstr=cin.get();时,同理把cin里流的数据的b拿出来给了bstr,此后,cin里面的流的数据为cd,而bstr则为b,所以最后输出时,便能输出ab了.还有个补充,究竟什么时候才输入数据呢?我们可以再通过上面的代码进行尝试,我们输入单个字母'a',然后按回车,发现并没有输出数据,而是再等待一次输入数据,我们再输入字母'b',按回车后便输出ab了.相信到这里,大家都应该明白了,因为当我们第一次输入a后,通过cstr=cin.get();使cin里的流没有数据,清空了.所以到第二次要再赋给bstr值时,它找不到数据,要重新再输入数据.由此来看可以知道,当cin里的流数据清空时,便需要重新输入才能赋值.而cin.get()还有个用法:int main(){char cstr;char bstr;cstr=cin.get(); //读取单个字符,在屏幕输入cin.get();bstr=cin.get();cout<<cstr<<bstr<<endl; //输出刚刚载入的单个字符system("pause");}程序中有3个cin.get(),所以我们尝试输入:abc. 发现输出了:ac由此能知道,当空回调cin.get();时,cin.get便自动在cin中的流数据中删除一个字母,起了一个删除作用.对cin.get()有了一定了解之后,对cin.getline()的学习就可以更快了,原理是一致的,但是cin.getline()则是获取一整行文本.以下是cin.getline()原形: getline(char *line,intsize,char='\n')第一个就是字符指针,第二个是字符长度,第三个1行的结束标识符.int main(){char cstr[200];cin.getline(cstr,sizeof(str));//第三个参数不输入,默认回车为结束标识符cout<<cstr<<endl; //输出system("pause");}这样我们输入一堆英文或数字,然后按回车,就会输出一行刚刚输出的东西了.接下来.我们讨论第三个参数的作用.int main(){char cstr[200];cin.getline(cstr,sizeof(str),'X'); //我们以单个英文字母'X'作为终止标识符cout<<cstr<<endl; //输出system("pause");}当我们输入一大堆东西,例如输入: kkkkkkk(回车) 输出: kkkkkkk(回车)llllllx(回车) llllll这样X便成了终止符,其原理和cin.get一样.或许我们可以像cin.get那样尝试一下:int main(){char cstr[200];char bstr[200];cin.getline(cstr,sizeof(str),'X'); //我们以单个英文字母'X'作为终止标识符cin.getline(bstr,sizeof(btr),'a');cout<<"第一行是:"<<cstr<<endl; //输出cout<<"第二行是:"<<bstr<<endl;system("pause");}我们输入:kkkkkkkkk(回车) 输出:第一行是:kkkkkkkkk(回车)oooooooooX(回车) oooo ooooo(回车)bbbbbbbbba(回车) 第二行是:(回车)bbbbbbbbb在这里,我在不厌其烦地说一下原理,如果刚刚cin.get()原理看懂的可以跳过. 首先,我们第一次getline会把X前面的字符赋给cstr,然后从cin里的数据流删除,标识符X也删除了,所以输出的cstr如上所示.当我们第二次运行getline 时,此时cin里的数据流为(回车)bbbbbbbbba,回车也是一个字符,事实上在数据流里用"\n"表示,接着就按照原来第一次的方法,把标识符'a'前面的字符赋给bstr,然后再删除字符号及标识符.所以输出结果如上.接下来我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin 里面的数据流,而实际上却与此相差很远,首先我们看看以下代码:#include<iostream>usingnamespace std;int main(){int a;cin>>a;cout<<cin.rdstate()<<endl;if(cin.rdstate() == ios::goodbit){cout<<"输入数据的类型正确,无错误!"<<endl;}if(cin.rdstate() == ios_base::failbit){cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; }system("pause");}我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate();当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下:cin.clear(标识符);标识符号为:∙goodbit 无错误∙Eofbit 已到达文件尾∙failbit 非致命的输入/输出错误,可挽回∙badbit 致命的输入/输出错误,无法挽回若在输入输出类里.需要加ios::标识符号通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:#include<iostream>usingnamespace std;int main(){int a;while(1){cin>>a;if(!cin) //条件可改写为cin.fail(){cout<<"输入有错!请重新输入"<<endl;cin.clear();cin.sync(); //清空流}else{cout<<a;break;}}system("pause");}上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear 让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.对比:输入字符串1.cin>>的读入方式总是将前导的空格(包括空格,回车,水平或垂直制表符等)过滤2.getline可将字符串一次性地输入。
c++11-流类库与输入输出
6
输 插入运算符(<<) 插入运算符( ) 出 流
插入(<<)运算符是所有标准C++数据类型预先 设计的。 用于传送字节到一个输出流对象。
7
控制输出格式
输 出 流
控制输出宽度
–
为了调整输出,可以通过在流中放入setw操纵符或调用width成 员函数为每个项指定输出宽度。
例11-1 使用width控制输出宽度
8
输 例:使用 填充 使用*填充 出 流
#include <iostream> using namespace std; void main() { double values[]={1.23,35.36,653.7,4358.24}; for(int i=0; i<4; i++) 输出结果: 输出结果: { cout.width(10); ******1.23 ******1.23 cout.fill('*'); cout<<values[i]<<'\n'; *****35.36 } *****653.7 } ***4358.24
12
输 进制 出 流
dec、oct和hex操纵符设置输入和输出的缺省进 制。
13
输 输出文件流成员函数 出 流
输出流成员函数有三种类型:
– – –
与操纵符等价的成员函数。 执行非格式化写操作的成员函数。 其它修改流状态且不同于操纵符或插入运算符的成 员函数。
14
输 输出文件流成员函数 出
open函数
ifstream myFile;//建立一个文件流对象 myFile.open("filename",iosmode); myFile.open("filename",iosmode); //打开文件 打开文件"filename" //打开文件"filename"
第7章 输入输出流
第7章 输入输出流
第7章 输入输出流
(2)返回流是否处于正常状态 :int fail() const; 该函数返回failbit状态,以判断流操作是否失败。failbit表 示发生流格式错误,但缓冲区中的字符没有丢失。这种错误通常 是可以修复的。 (3)判断流是否正常 int good()const; int operator void *(); 上述两个函数的功能相似,如果eofbit、failbit和badbit全 部都没有被置位[即均为 0,读写正常(即符合读取和写入的类 型),没有文件末尾],则返回1 (true),否则返回0 (false)。
第7章 输入输出流
C++程序设计
第7章 输入输出流
第7章 输入输出流
流类简介 标准流对象 控制 I/O 格式 调用cout的成员函数 调用cin的成员函数
本章内容
第7章 输入输出流
第一节 流类简介
常考知识点: C++流的基本概念 iostream中流类库的基本概念 主要头文件的基本功能 提取运算符>>的使用 插入运算符<<的使用
(1)返回流是否结束: int eof() const; 函数返回eofbit的值。当文本文件结束时,在输入流中会 自动设置eofbit。在应用程序中可以用eof( )函数测试是否到达 文件尾,当文件操作结束遇到文件尾时,函数返回1;否则返回0。 在标准输入流cin中,可以通过按下〈Ctrl+Z〉组合键表示 输入流的结束。
第7章 输入输出流
(3)设置和返回输出宽度 int width(int nw); 该函数将下一个输出项的显示宽度设置为nw。如果nw大于 数据所需宽度,则在没有特别指示时数据采用右对齐方式。如果 nw小于数据所需宽度,则nw无效,数据以默认格式输出。函数 width()的设置没有持续性,输出一项数据后自动恢复为系统默 认设置。
c++流类库与输入输出习题答案
1.概念填空题1.1头文件iostream中定义了4个标准流对象cin,cout,cerr,clog。
其中标准输入流对象为cin,与键盘连用,用于输入;cout为标准输出流对象,与显示器连用,用于输出。
1.2用标准输入流对象cin与提取操作符>>连用进行输入时,将空格与回车当作分隔符,使用get()成员函数进行输入时可以指定输入分隔符。
1.3每一个输入输出流对象都维护一个流格式状态字,用它表示流对象当前的格式状态并控制流的格式。
C++提供了使用格式控制函数与操作子函数来控制流的格式的方法。
1.4 C++根据文件内容的数据格式可分为两类:文本文件和二进制文件。
前者存取的最小信息单位为字节,后者记录。
1.5文件输入是指从文件向内存读入数据;文件输出则指从内存向文件输出数据。
文件的输入输出首先要打开文件;然后进行读写;最后关闭文件。
1.6文本文件是存储ASCII码字符的文件,文本文件的输入可用cin从输入文件流中提取字符实现。
文本文件的输出可用cout将字符插入到输出文件流来实现。
程序在处理文本文件时需要(需要/不需要)对数据进行转换。
1.7二进制文件是指直接将计算机内的数据不经转换直接保存在文件中。
二进制文件的输入输出分别采用read()、write() 成员函数。
这两个成员函数的参数都是2个,分别表示读写缓冲区和字节数。
1.8设定、返回文件读指针位置的函数分别为seekg,tellg;设定、返回文件写指针位置的函数分别为seekp,tellp。
2 简答题2.1 为什么cin输入时,空格和回车无法读入?这时可改用哪些流成员函数?2.2 文件的使用有它的固定格式,试做简单介绍。
2.3 在ios类中定义的文件打开方式中,公有枚举类型open_mode的各成员代表什么文件打开方式?2.4 简述文本文件和二进制文件在存储格式、读写方式等方面的不同,各自的优点和缺点。
2.5 文本文件可以按行也可以按字符进行复制,在使用中为保证能完整复制要注意哪些问题?2.6 文件的随机访问为什么总是用二进制文件,而不用文本文件?2.7 怎样使用istream和ostream的成员函数来实现随机访问文件?3.选择题3.1要进行文件的输出,除了包含头文件iostream外,还要包含头文件(C )。
C++的输入和输出与标准输出流
* 掌握:输入输出的含意;文件流以及输入/输出的格式控制;标准输出在C++程序中的应用。
* 理解:C++类库中的常用流类。
* 了解:C++的I/O对C的发展。
重点、难点◆输入输出的含意;文件流以及输入/输出的格式控制;标准输出在C++程序中的应用。
一、C++ 输入输出的含义以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。
从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。
程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。
C++的输入与输出包括以下3方面的内容:1、对系统指定的标准设备的输入和输出。
简称标准I/O。
(设备)2、以外存磁盘(或光盘)文件为对象进行输入和输出。
简称文件I/0。
(文件)3、对内存中指定的空间进行输入和输出。
简称串I/O。
(内存)C++采取不同的方法来实现以上3种输人输出。
为了实现数据的有效流动,C++系统提供了庞大的I/O类库,调用不同的类去实现不同的功能。
二、C++的I/O对C的发展—类型安全和可扩展性C语言中I/O存在问题:1、在C语言中,用prinff和scanf进行输入输出,往往不能保证所输入输出的数据是可靠的、安全的。
学过C语言的读者可以分析下面的用法:想用格式符%d输出一个整数,但不小心错用了它输出单精度变量和字符串,会出现什么情况?假定所用的系统int型占两个字节。
printf("%d",i);//i为整型变量,正确,输出i的值printf("%d",f);//f为单精度变量,输出变量中前两个字节的内容printf("%d","C++");//输出字符串"C++”的起始地址编译系统认为以上语句都是合法的,而不对数据类型的合法性进行检查,显然所得到的结果不是人们所期望的。
2、在用scanf输入时,有时出现的问题是很隐蔽的。
C++——输入、输出和文件
C++——输⼊、输出和⽂件⼀、C++输⼊和输出概述 1.1、流和缓冲区 C++程序把输⼊和输出看作字节流。
输⼊时,程序从输⼊流中抽取字节;输出时,程序将字节插⼊到输出流中。
对于⾯相⽂本的程序,每个字节代表⼀个字符,更通俗地说,字节可以构成字符或数值数据的⼆进制表⽰。
输⼊流中的字节可能来⾃键盘,也可能来⾃存储设备(如硬盘)或其他程序。
输出流中的字节可以流向屏幕、打印机、存储设备或其他程序。
流充当了程序和流源或流⽬标之间的桥梁。
这使得C++程序可以以相同的⽅式对待来⾃键盘的输⼊和来⾃⽂件的输⼊。
C++程序只检查字节流,⽽不需要知道字节来⾃何⽅。
同理,通过使⽤流,C++程序处理输出的⽅式将独⽴于其去向。
因此管理输⼊将包含两步: *将流与输⼊去向的程序关联起来。
*将流与⽂件连接起来。
换句话说,输⼊流需要两个连接,每端各⼀个。
⽂件端部连接提供了流的来源,程序端连接将流的流出部分转储到程序中(⽂件端连接可以是⽂件,也可以是设备)。
同样,对输出的管理包括将输出流连接到程序以及将输出⽬标与流关联起来。
通常,通过使⽤缓冲区可以更⾼效地处理输⼊和输出。
缓冲区是⽤作中介的内存块,它是将信息从设备传输到程序或从程序传输给设备的临时存储⼯具。
1.2、流、缓冲区和iostream⽂件 管理流和缓冲区的⼯作有点复杂,但iostream(以前为iostream.h)⽂件中包含⼀些专门设计⽤来实现、管理流和缓冲区的类。
C++98版本C++I/O定义了⼀些类模板,以⽀持char和wchar_t数据;C++11添加了char16_t和char32_t具体化。
通过使⽤typedef⼯具,C++使得这些模板char具体化能够模仿传统的⾮模板I/O实现。
下⾯是其中的⼀些类: *streambuf类为缓冲区提供了内存,并提供了⽤于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类⽅法; *ios_base类表⽰流的⼀般特征,如是否可读取、是⼆进制流还是⽂本流等; *ios类基于ios_base,其中包含了⼀个指向streambuf对象的指针成员; *ostream类是从ios类派⽣⽽来的,提供了输出⽅法; *istream类也是从ios类派⽣⽽来的,提供了输⼊⽅法; *iostream类是基于istream和ostream类的,因此继承了输⼊⽅法和输出⽅法。
第7章输入输出流
(3) cout流在内存中对应开辟了一个缓冲区, 用来存放流中的数据,当向cout流插入一个 endl时,不论缓冲区是否已满,都立即输出 流中所有数据,然后插入一个换行符,并刷 新流(清空缓冲区)。 (4) 在iostream中只对“<<”和“>>”运算符 用于标准类型数据的输入输出进行了重载, 但未对用户声明的类型数据的输入输出进行 重载。
7.2 标准输出流
标准输出流是流向标准输出设备(显示器)的 数据。
7.2.1 cout,cerr和clog流
1. cout流对象 cout是console output的缩写,意为在控制 台(终端显示器)的输出。 (1) cout不是C++预定义的关键字,它是 ostream流类的对象,在iostream中定义。 (2) 用“cout<<”输出基本类型的数据时,可 以不必考虑数据是什么类型,系统会判断数 据的类型,并根据其类型选择调用与之匹配 的运算符重载函数。
2. cerr流对象 cerr流对象是标准错误流。cerr流已被指定 为与显示器关联。cerr的作用是向标准错误 设备(standard error device)输出有关出错 信息。cerr流中的信息只能在显示器输出。 当调试程序时,往往不希望程序运行时的出 错信息被送到其他文件,而要求在显示器上 及时输出,这时应该用cerr。cerr流中的信 息是用户根据需要指定的。
例7.5 通过测试cin的真值,判断流对象是否 处于正常状态。
#include <iostream> using namespace std; int main( ) {float grade; cout<<″enter grade:″; while(cin>>grade)//能从cin流读取数据 {if(grade>=85) cout<<grade<<″GOOD!″<<endl; if(grade<60) cout<<grade<<″fail!″<<endl; cout<<″enter grade:″; } cout<<″The end.″<<endl; return 0; }
io
就像C语言一样,C++语言中也没有输入/输出语句。
但C++编译系统带有一个面向对象的输入/输出软件包,它就是I/O流类库。
流是I/O流类的中心概念。
首先介绍流的概念,然后介绍流类库的结构和使用。
对于流类库中类的详细说明及类成员的描述,请读者查阅所使用的编译系统的运行库参考手册。
一、I/O流的概念使用VC++6.0在程序中实现I/O有几种方法:C运行库直接非缓冲的I/OANSI C运行库流I/O控制台和端口直接I/OMicrosoft Foundation类库Microsoft I/O流类库其中I/O流类库对于缓冲的、格式化文本I/O是很有用的,它是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。
我们简单介绍过,在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。
从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作,数据的输入与输出就是通过I/O流来实现的。
这里,我们进一步介绍流的概念操作系统是将键盘、屏幕、打印机和通信端口作为扩充文件来处理的,而这种处理是通过操作系统的设备驱动程序来实现的。
因此,从C++程序员的角度来看,这些设备与磁盘文件是等同的。
I/O流类就是用来与这些扩充文件进行交互。
当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。
流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。
由于流对象是程序中的对象与文件对象进行交换的界面,对程序对象而言,文件对象有的特性,流对象也有,所以程序将流对象看作是文件对象的化身。
流所涉及的范围还远不止于此,凡是数据从一个地方传输到另一个地方的操作都是流的操作。
像网络数据交换、进程数据交换等都是流操作。
因此,一般意义下的读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。
c++的IO流库
输入流操作
istream类的公有成员函数
函数 read get getline ignore peek 无格式输入指定字节数
功能
从流中提取字符,包括空格 从流中提取一行字符 提取并丢弃流中指定字符 返回流中下一个字符,但不从流中删除
gcount
eatwhite seekg
统计最后输入的字符个数
忽略前导空格 移动输入流指针
字符指针的地址值的输出格式为:(void
*)s或void *(s),此时仍为十六进制格式;
电子科技大学中山学院电子系
#include <iostream.h> int main( ) { cout<<"Hello World!\n"; cout<<"Here is 5:"<<5<<'\n'; cout<<"Here is a very big number:\t"<<7000<<endl; cout<<"Here is the sum of 8 and 5:\t"; cout<<8+5<<endl; cout<<"Here's a fraction:\t\t"<<(float)5/8<<endl; cout<<"And a very very big number:\t"<<(double)7000*7000<<endl; return 0; }
电子科技大学中山学院电子系
#include <iostream.h> #include <string.h> void main() 输 Input words: { const int SIZE=20; I love you everyone<ctrl+z 入 char buf[SIZE]; char *largest; int curLen,maxLen=-1,cnt=0; 输 ??请思考? cout<<"Input words:"<<endl; 出 while(cin>>buf) { curLen=strlen(buf); cnt++; 输入ctrl+z键后,cin>>buf if(curLen>maxLen) 的值为0,退出while循环; { maxLen=curLen; largest=buf; } } cout<<"\nCount of words:"<<cnt; cout<<"\nNumber of longest word:"<<maxLen; cout<<"\nThe word is:"<<largest<<endl; } 电子科技大学中山学院电子系
C++程序设计试题及答案1.
C++程序设计试题一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1.C++源程序文件扩展名为( A )A..cppB..hC..1ibD..obj2.在C++中使用流进行输入输出,其中专用于从键盘进行输入的流是( B )A.cerrB.cinC.coutD.cfile3.包含自定义头文件file.h的预处理指令是( D )A.#define<file.h>B.#include file.hC.#define file.hD.#include"file.h"4.用于标识十六进制前缀或后缀是( D )A.元B.后缀L或eC.前缀零D.前缀0x5.设存在整型变量int x,则下列句与其它三项含义不同的是( A )A.int* p=&x;B.int& p=x;C.int & p=x;D.int &p=x;6.在定义类成员时,为产生封装性,则需使用哪个关键字( D )A.publicB.publishC.protectedD.private7.设函数void swap(int&,int&)将交换两形参的值,如两整型变量int a=10;int b=15;则执行swap(a,b)后,a、b值分别为( C )A.10,10B.10,15C.15,10D.15,158.函数默认参数在函数原型中说明,默认参数必须放在参数序列的( C)A.前部B.中部C.后部D.两端9.设存在函数int min(int,int)返回两参数中较小值,若求15,26,47三者中最小值,下列表达式中错误的是( B )A.int m=min(min(15,26),min(15,47));B.int m=min(15,26,47);C.int m=min(15,min(47,26));D.int m =min(min(47,26),16);10.下列函数不能和函数void print(char)构成重载的是(C )A.int print(int);B.void print(char,char);C.int print(char);D.void print(int,int);11.在下列成对的表达式中,运算结果类型相同的一对是( D )A.7/2和7.0/2.0B.7/2.0和7/2C.7.0/2和7/2D.7.0/2.0和7.0/2l2.内联函数的特点是( D )A.减少代码量,加快访问速度B.减少代码量,减缓访问速度C.增加代码量,减缓访问速度D.增加代码量,加快访问速度13.类的私有成员可在何处被访问( A)A.本类的成员函数中B.本类及子类的成员函数中C.通过对象名在任何位置D.不可访问14.类的构造函数在以下什么情况下会被自动调用( B )A.定义成员函数时B.定义对象时C.定义数据成员时D.定义友元函数时15.下列关于析构函数描述正确的是( D )A.可以重载B.函数体中必须有delete语句C.返回类型必须是void类型D.不能指定返回类型16.设有函数T Sum(T x,T y){return x+y;},其中T为模板类型,则下列语句中对该函数错误的使用是( D )A.Sum(1,2);B.Sum(3.0,2.2);C.Sum(‘A’,‘C’);D.Sum("A","C");17.下列哪个编译指令属于条件编译指令( C )A.#includeB.#defineC.#elseD.#pragma18.关于类的静态成员函数描述错误的是( A )A.在创建对象前不存在B.不能说明为虚函数C.不能直接访问非静态函数D.不是对象的成员l9.如果类A被声明成类B的友元,则( D)A.类A的成员即类B的成员B.类B的成员即类A的成员C.类A的成员函数不得访问类B的成员D.类B不一定是类A的友元20.派生类的对象可以访问以下那种情况继承的基类成员( D )A.私有继承的私有成员B.公有继承的私有成员C.私有继承的保护成员D.公有继承的公有成员二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答案。
第23章 C++的输入输出类库
3
C/C++程序设计
ios istream
istrstream
istream_withassign
ostream
ifstream ofstream
ostream_withassign
ostrstream
iostream
strstream
stdiostream fstream
图
iotream类继承层次图
在vc6.0 ostream.h中ostream类的左移运算符函数存 在如下函数原型声明: ostream& operator<<(const char *); inline ostream&operator<<(const unsigned char*); inline ostream& operator<<(const signed char*); ostream& operator<<(unsigned char); inline ostream& operator<<(char); inline ostream& operator<<(signed char);
8
C/C++程序设计
进行上面两个改动之后,就可以与老版本相同的格式使 用新版本的类。 换言之本章的示例和语法可以延拓到新的类。但新的类 提供更多的格式标识符和I/O操作算子。 也可以采用标准名称空间分辨符 std::直接操作std名称 空间的对象和相关的成员函数: std::cout<<expre; std::cin>>Lexpre;
19
C/C++程序设计
面向对象第四次作业任务答案解析
面向对象程序设计技术作业四一、填空题1、在定义类对象的语句执行时,系统在建立每个对象的过程中将自动调用该类的构造函数使其初始化。
2、当一个类对象被撤消时将自动调用该类的析构函数。
3、对基类数据成员的初始化是通过执行派生类构造函数中的初始化表来实现的。
4、对一个类中的数据成员的初始化可以通过构造函数中的初始化表实现,也可以通过构造函数中的赋值语句实现。
5、在一个派生类中,对基类成员、类对象成员和非类对象成员的初始化次序是先基类成员,后类对象成员,最后为非对象成员。
6、当撤消一个含有基类和类对象成员的派生类对象时,将首先完成派生类本身的析构函数定义体的执行,接着完成类对象成员的析构函数定义体的执行,最后完成基类成员的析构函数定义体的执行。
7、设px是指向一个类动态对象的指针变量,则执行”delete px;”语句时,将自动调用该类的析构函数。
8、当一个类对象离开它的作用域时,系统将自动调用该类的析构函数。
9、假定一个类对象数组为A[N],当离开它的作用域时,系统自动调用该类析构函数的次数为N次。
10、假定AB为一个类,则执行”AB a[10];”语句时,系统自动调用该类构造函数的次数为10次。
11、假定用户没有给一个名为AB的类定义构造函数,则系统为其隐含定义的构造函数为空构造函数。
12、假定用户没有给一个名为AB的类定义析构函数,则系统为其隐含定义的析构函数为空构造函数。
13、若需要把一个函数”void F();”定义为一个类AB的友元函数,则应在类AB的定义中加入一条语句:friend void F();。
14、若需要把一个类AB定义为一个类CD的友元类,则应在类CD的定义中加入一条语句:feiend class AB;。
15、假定一个类AB中有一个静态整型成员bb,在类外为它进行定义并初始化为0时,所使用的语句为AB:bb=0;。
16、假定类AB中有一个公用属性的静态数据成员bb,在类外不通过对象名访问该成员bb 的写法为AB:bb 。
全国2022年10月自考04737《C++程序设计》真题
全国2022年10月自考04737《C++程序设计》真题全国2022年10月自考04737《C++程序设计》真题1.(单选题,1 分)下面对模板的声明正确的是()A、B、B.C、D、2.(单选题,1 分)()A、B、C、D、3.(单选题,1 分)以下不能正确创建输出文件对象并使其与磁盘文件相关联的语句是()A、B、C、D、4.(单选题,1 分)在C++中打开一个文件就是将指定的文件与下列哪个选项建立关联()A、流对象B、流类C、流函数D、流结构5.(单选题,1 分)()A、跳过输出流中的n个字符B、跳过delim及其之后的所有字符C、常用于跳过输出中的无效部分D、6.(单选题,1 分)下列流类中,可以用于输入/输出的是()A、iosB、fstreamC、iostreamD、strstream7.(单选题,1 分)关于纯虚函数和抽象类的描述中,错误的是()A、纯虚函数是一种特殊的虚函数,它没有具体实现B、抽象类一般作为基类使用,其纯虚函数的实现由派生类给出C、抽象类中一定具有一个或多个纯虚函数D、抽象类的派生类中一定不会再有纯虚函数8.(单选题,1 分)()A、B、C、D、9.(单选题,1 分)下面关于基类和派生类的描述中,正确的是()A、一个类不能被多次说明为某个派生类的直接类,可以不止一次地成为间接基类B、一个类可以被多次说明为某个派生类的直接类,可以不止一次地成为间接基类C、一个类不能被多次说明为某个派生类的直接类,但只能成为一次间接基类D、一个类可以被多次说明为某个派生类的直接类,但只能成为一次间接基类10.(单选题,1 分)下列关于派生类对象的初始化叙述中,正确的是()A、是由基类的构造函数实现的B、是由派生类的构造函数实现的C、是由基类和派生类的构造函数实现的D、是系统自动完成的不需程序设计者干预11.(单选题,1 分)当派生类私有继承基类时,基类中的公有成员和保护成员成为派生类的()A、public成员B、private成员C、protected成员D、友元12.(单选题,1 分)()A、自增运算符“++”可以被重载B、函数可以区分前置及后置情况C、D、13.(单选题,1 分)下列关于重载流插入和流提取运算符的描述中,正确的是()A、不可以对流插入运算符进行重载B、不可以对流提取运算符进行重载C、重载函数不能是流类库中的成员D、流是标准类库用户能继承也能修改14.(单选题,1 分)设类Test将其他类对象作为成员,则创建类Test 的对象时,下列描述正确的是()A、先执行类的构造函数B、先执行成员对象的构造函数C、先执行类的析构函数D、先执行成员对象的析构函数15.(单选题,1 分)()A、B、C、D、16.(单选题,1 分)()A、B、C、D、17.(单选题,1 分)下列关于访问范围说明符public、private、protected 的描述中,正确的是()A、每种关键字至少出现1次B、不加说明符默认为公有的C、3种关键字出现的先后次序没有限制D、成员的访问范围由它之后最近的说明符决定18.(单选题,1 分)下列关于封装特点的描述中,错误的是()A、隐藏对象的属性B、公开实现的细节C、提供使用的信息D、公开的信息是与外界交互的接口19.(单选题,1 分)下列关于++语言类库提供输入流类和输出流类的描述中,正确的是()A、输入流类ostreamB、输出流类istreamC、cin是istream类的对象D、cout是istream类的对象20.(单选题,1 分)下列选项中,能表现出C++语言的主要特点的是()A、继承于C#语言B、可以进行面向对象的程序设计C、不能进行结构化程序设计D、基于数据流的程序设计21.(填空题,1 分)()。
c语言输入输出的基本概念
c语言输入输出的基本概念
在C语言中,输入输出是以计算机主机为主体而言的,其中输入输出操作是程序中最基本的操作之一,没有输出的程序是没有意义的。
输入输出库函数主要通过scanf和printf两个函数来实现,它们都在头文件stdio.h中声明。
scanf函数是标准输入函数,其功能是按用户指定的格式从键盘读入数据并赋值给对应的变量;printf函数是标准输出函数,其功能是按用户指定的格式将数据输出到屏幕。
在进行输入输出操作时,需要注意格式控制和变量地址的问题。
例如,scanf中格式控制后面应当是变量地址,而不是变量名;在输入数据时,应与格式控制的格式完全对应。
此外,C语言中的输入输出还包括文件输入输出、网络输入输出等,这些都需要使用库函数来实现。
例如,文件输入输出可以使用fscanf和fprintf等函数实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<endl;
for(i=1;i<=i;i++)
{
cout<<i;
for(j=1;j<=9;j++)
cout<<i*j;
}
return 0;
}
【修改语句】
2、下面的程序用于统计文件xyz.txt中的字符个数,请填空完成程序。
#include<iostream>
#include<fstream>
《C++面向对象程序设计》实验报告
实验序号:6实验项目名称:C++的流类库与输入输出
学 号
姓 名
专业
实验地点
指导教师
吴芸
实验时间
一、实验目的及要求
(1)掌握C++格式化的输入输出方法;
(2)掌握重载“<<ቤተ መጻሕፍቲ ባይዱ和“>>”的方法;
(3)掌握磁盘文件的输入输出方法;
二、实验设备(环境)及要求
Micorsoft Visual C++ 6.0
{(2)
i++;
}
cout<<"文件字符个数:"<<i<<endl;
return 0;
}
【运行结果截图】:
3、重载运算符“<<”和“>>”,使其能够输入一件商品的信息和输出这件商品的信息。商品信息有编号,商品名和价格。
【商品类Merchandise框架】:
class Merchandise{
public:
Merchandise();
~Merchandise();
friend istream& operator>>(istream &in,Merchandise &s); //输入一件商品的信息
friend ostream& operator<<(ostream &out,Merchandise &s);//输出一件商品的信息
private:
int no; //编号
char *name; //商品名
double price; //价格
};
【要求】:实现该类,并编写一下的main函数对该类进行操作。
int main()
{ Merchandise mer;
cin>>mer;
cout>>mer;
return 0;
}
【运行结果截图】:
4、编写一个程序,将两个文本文件连接成一个文件,然后将此文件中所有小写字母转换成大写字母,并打印出来。
【运行结果截图】:
四、分析与讨论(记录实验过程中出现的主要问题和心得体会)
五、教师评语
签名:
日期:
成绩
附:程序源代码
1、
2、
3、
4、
using namespace std;
int main()
{
char ch;
int i=0;
ifstream file;
file.open("xyz.txt",ios::in);
if((1))
{ cout<<"xyz.txt cannot open"<<endl;
abort();
}
while(!file.eof())
三、实验内容与步骤(题目、算法和结果描述)
1、下面给出的程序是用于打印九九乘法表,但程序有错误,请调试,使得程序运行后,能够输出如下显示的九九乘法表
#include<iomanip>
using namespace std;
int main()
{
int i,j;
cout<<"*";
for(i=1;i<=9;i++)