C++程序设计-大模型思维与实践课件 第04章 输入输出和文件-进阶内容_第1页
C++程序设计-大模型思维与实践课件 第04章 输入输出和文件-进阶内容_第2页
C++程序设计-大模型思维与实践课件 第04章 输入输出和文件-进阶内容_第3页
C++程序设计-大模型思维与实践课件 第04章 输入输出和文件-进阶内容_第4页
C++程序设计-大模型思维与实践课件 第04章 输入输出和文件-进阶内容_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章输入输出和文件进阶内容C++程序设计——大模型思维与实践2键盘输入缓存区综合举例cout输出格式4-2-14-3-1文件读写位置指针4-4-13【例1】当输入为“

123.4

5”,使用以下输入语句,读取到的a、c、d值分别为多少?charch;inta,b;doublec,d;cin>>a>>c>>d;cin.get(ch);程序运行后,各个变量读取到的值分别为:a=123:读入时,首先忽略一个空格,然后读入123。“123”之后的点号不属于整数的一部分,因此,点号不会被读掉,仍然留在缓冲区中。c=0.4:读入c时,缓冲区内容为“.45\n”,因为点号是浮点数的一部分,“.4”是一个合法的浮点数,读入后,c等于0.4。d=5.0:读入d时,缓冲区内容为“5\n”,首先忽略空格,然后读取5,而5之后是回车,所以d只能读入5,值为5.0ch=’\n’:读入ch时,缓冲区内容为“\n”,直接读入第1个字符,为字符’\n’。4-2-1键盘输入缓存区综合举例4【例2】编写程序,首先输入两个double型数,然后输入运算符“+-*/”中的一个,程序输出这两个数和运算符组成的表达式。键盘输入缓存区综合举例intmain(){charch;doublea,b;cout<<"inputaandb:\n";cin>>a>>b;//读取数字cout<<"Enteroperator:";ch=cin.get();//读取字符cout<<"Theexpressionis:\n"<<a<<ch<<b<<endl;return0;}运行结果:inputaandb:1.23.4Enteroperator:Theexpressionis:1.23.45从程序的运行结果可以看出,当仅输入两个数字后,程序并未等待输入运算符便结束了运行。原因在于:在输入数字并按下回车后,缓冲区中内容:cin>>a>>b将1.2和3.4两个数字读掉,输入缓冲区中留存了一个回车符。当执行ch=cin.get()时,由于缓冲区中存在该回车符,它便被立即读取(不需等待用户输入)并赋值给ch。键盘输入缓存区综合举例1.2

3.4\n输入缓冲区cin从这里开始读6若将cout语句修改,我们可以观察到读入变量ch所对应的ASCII码值:

cout<<"Theexpressionis:\n"<<a<<""<<(int)ch<<""<<b<<endl;换行符“\n”的ASCII码是10。键盘输入缓存区综合举例运行结果:inputaandb:1.23.4Enteroperator:Theexpressionis:1.2103.47解决方案(1):使用cin>>读取字符“cin>>”读取字符时,会忽略开头遇到的空白字符(空格、制表符、换行符等),直到遇到一个实质性的字符。键盘输入缓存区综合举例intmain(){charch;doublea,b;cout<<"inputaandb:\n";cin>>a>>b;//读取数字cout<<"Enteroperator:";cin>>ch;//读取字符cout<<"Theexpressionis:\n"<<a<<ch<<b<<endl;return0;}运行结果:inputaandb:1.23.4Enteroperator:+Theexpressionis:1.2+3.48解决方案(2):使用cin.ignore函数使用cin.ignore()函数可以清除掉输入缓冲区中的一个字符键盘输入缓存区综合举例intmain(){charch;doublea,b;cout<<"inputaandb:\n";cin>>a>>b;//读取数字cout<<"Enteroperator:";cin.ignore();//换成cin.get();也可以读掉一个字符ch=cin.get();//读取字符cout<<"Theexpressionis:\n"<<a<<ch<<b<<endl;return0;}运行结果:inputaandb:1.23.4Enteroperator:+Theexpressionis:1.2+3.4如果需要清除掉的不止一个字符,则可使用:cin.ignore(100,'\n');//可以清除换行符之前最多100个字符。9输出格式控制输出n位小数设置输出宽度设置输出对齐方式设置输出填充4-3-1cout输出格式10setprecision(n)控制有效数字浮点数默认输出6位有效数字,6位之后截断的部分四舍五入。

使用setprecision可以控制输出浮点数的有效位数。输出n位小数#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doubles=20.7843000;cout<<"1:"<<setprecision(1)<<s<<endl;cout<<"2:"<<setprecision(2)<<s<<endl;cout<<"3:"<<setprecision(3)<<s<<endl;cout<<"6:"<<setprecision(6)<<s<<endl;cout<<"7:"<<setprecision(7)<<s<<endl;cout<<"8:"<<setprecision(8)<<s<<endl;return0;}运行结果:1:2e+0012:213:20.86:20.78437:20.78438:20.784311说明:需要加头文件iomanip。小数部分末尾为0时,不能输出来。setprecision只对浮点数起作用,对整数不起作用。一经设置,对接下来输出的所有浮点数都起作用。比如:cout<<setprecision(5)<<20.7843000<<endl<<200<<endl<<1.835692;将输出20.7842001.8357输出n位小数12

setprecision与fixed结合控制小数位数输出n位小数#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doubles=20.7843000;

cout<<fixed<<123.2<<endl;cout<<"1:"<<setprecision(1)<<s<<endl;cout<<"2:"<<setprecision(2)<<s<<endl;cout<<"3:"<<setprecision(3)<<s<<endl;cout<<"6:"<<setprecision(6)<<s<<endl;cout<<"7:"<<setprecision(7)<<s<<endl;cout<<"8:"<<setprecision(8)<<s<<endl;return0;}运行结果:123.2000001:20.82:20.783:20.7846:20.7843007:20.78430008:20.78430000说明:如果仅使用fixed而不使用setprecision设置精度,则默认输出6位小数(小数末尾的0也输出)。13如果要输出九九乘法表?使用setw(n)在输出时分配n个字符的输出宽度,如果内容本身不够n个字符,默认右对齐输出。设置输出宽度#include<iostream>#include<iomanip>usingnamespacestd;intmain(){cout<<1<<"*"<<7<<"="<<setw(2)<<1*7<<"";cout<<8<<"*"<<1<<"="<<setw(2)<<1*8<<"";cout<<1<<"*"<<9<<"="<<setw(2)<<1*9<<endl;cout<<8<<"*"<<7<<"="<<setw(2)<<8*7<<"";cout<<8<<"*"<<8<<"="<<setw(2)<<8*8<<"";cout<<8<<"*"<<9<<"="<<setw(2)<<8*9<<endl;cout<<9<<"*"<<7<<"="<<setw(2)<<9*7<<"";cout<<9<<"*"<<8<<"="<<setw(2)<<9*8<<"";cout<<8<<"*"<<9<<"="<<setw(2)<<9*9<<endl;return0;}setw仅对紧随其后的一次输出有效。14使用cout<<left和cout<<right设置为左对齐及右对齐。设置输出对齐方式#include<iostream>#include<iomanip>usingnamespacestd;intmain(){

cout<<left;//增加这一行语句cout<<1<<"*"<<7<<"="<<setw(2)<<1*7<<"";cout<<8<<"*"<<1<<"="<<setw(2)<<1*8<<"";cout<<1<<"*"<<9<<"="<<setw(2)<<1*9<<endl;cout<<8<<"*"<<7<<"="<<setw(2)<<8*7<<"";cout<<8<<"*"<<8<<"="<<setw(2)<<8*8<<"";cout<<8<<"*"<<9<<"="<<setw(2)<<8*9<<endl;cout<<9<<"*"<<7<<"="<<setw(2)<<9*7<<"";cout<<9<<"*"<<8<<"="<<setw(2)<<9*8<<"";cout<<8<<"*"<<9<<"="<<setw(2)<<9*9<<endl;return0;}注意:不要使用cout<<setiosflags(ios::left)和cout<<setiosflags(ios::right)实现左对齐及右对齐,这种方式操控性有缺陷。15默认填充空格,使用setfill(char)可以改变填充的字符。设置输出填充#include<iostream>#include<iomanip>usingnamespacestd;intmain(){

cout<<setfill('0');//增加这一行语句cout<<1<<"*"<<7<<"="<<setw(2)<<1*7<<"";cout<<8<<"*"<<1<<"="<<setw(2)<<1*8<<"";cout<<1<<"*"<<9<<"="<<setw(2)<<1*9<<endl;cout<<8<<"*"<<7<<"="<<setw(2)<<8*7<<"";cout<<8<<"*"<<8<<"="<<setw(2)<<8*8<<"";cout<<8<<"*"<<9<<"="<<setw(2)<<8*9<<endl;cout<<9<<"*"<<7<<"="<<setw(2)<<9*7<<"";cout<<9<<"*"<<8<<"="<<setw(2)<<9*8<<"";cout<<8<<"*"<<9<<"="<<setw(2)<<9*9<<endl;return0;}16文件读写位置指针控制文件读写操作的具体位置输入位置指针:下一次读取操作的开始位置输出位置指针:下一次写入操作的开始位置随着读写操作自动改变输入位置指针:会随着读文件操作的进行自动改变。每读一个字符,位置指针往后移动一个字符,底层原理与键盘输入缓冲区原理一致。输出位置指针:通常情况下,使用ios::out模式打开文件时,该文件为空文件,输出位置指针位于文件的第1个字符处(也即文件的末尾)。每次执行写入操作时,输出位置指针都自动指向新的文件末尾。如果使用流对象的成员函数修改输出位置指针指向文件的中部某个位置,则新输出的内容将从该位置开始写入,并覆盖掉已有的内容。文件读写位置指针17文件读写位置指针假设某文件的内容包含两行,第一行为“123.45回车”,第二行为“6.78回车”。创建文件流对象fs并与该文件关联后,文件流内部的缓冲区内容为:“

123.4

5回车6.7

8回车”用ios::in模式打开文件后的初始输入位置指针p1,指向缓冲区中的第1个字符。如果有代码:doubled;fs>>d;在执行>>操作时,首先忽略开头的空白字符,然后读取123.4到double型变量d中,此时输入位置指针如图p2,指向空格字符。下次执行读操作时,将从该位置开始读取。p1p218文件读写位置指针该机制依赖于文件流对象的内容状态每个文件流对象都维护一个位置指针,用于跟踪当前的读写位置。ifstream类和fstream类有seekg函数,可以设置文件输入(读)指针的位置;ofstream类和fstream类有seekp函数,可以设置文件输出(写)指针的位置。ostream&seekp(intoffset,intmode);istream&seekg(intoffset,intmode);mode:定义文件读写指针的移动模式文件读写位置指针19

mode的三种模式选项ios::beg让文件读写指针指向从文件起始位置向后的offset字节处。offset等于0即代表文件开头,offset只能是非负数。ios::cur:从当前位置开始offset为负数:将指针朝文件开头方向移动|offset|字节。offset为正数:将指针朝文件尾部移动offset字节,为0则不移动。ios::end:让文件读写指针指向从文件末尾往前的|offset|字节处。offset只能是0或者负数。文件读写位置指针最好不要针对文本文件移动读写指针20获取读写指针的当前位置ifstream类和fstream类有tellg函数,能够返回文件读指针的位置;ofstream类和fstream类有tellp函数,能够返回文件写指针的位置。inttellg();inttellp();获取文件长度用seekg函数将文件读指针定位到文件尾部,再用tellg函数获取文件该指针的位置,此位置即为文件总长度。文件读写位置指针21【例3】在当前目录下生成文件example.txt,文件内容为“12a4”。文件读写位置指针#include<iostream>#include<fstream>usingnamespacestd;intmain(void){ofstreamfs("example.txt",ios::out);if(!fs)return-1;fs<<"1234";//写入4个字符"1234"到文件中,写入位置位于文件末尾

fs.seekp(2);//位置索引从0开始,因此本语句将写入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论