配置环境:
QTcreater && cs106
(1)输入输出是指程序与外部设备交换信息。
(2)c++将输入输出看成是一个数据流。
(3)输入流:从外围设备流入内存。
输出流:从内存流向外围设备的数据、
(4)c++的输入输出分为:
·基于控制台(键盘,鼠标等)的IO。
·基于文件的IO。
·基于字符串的IO。
头文件 | 类型 |
iostream | istream 从流中读取; ostream写到流中去; iostream对流进行读写。(由以上两种继承而来) |
fstream | ifstream从文件中读取 ofstream写到文件中去 fstream对流进行读写 |
sstream | istringstream从string对象中读取 ostringstream写到string对象中去 stringstream对string对象进行读写 |
a. c++程序不能直接与输入输出设备交换信息。输入输出是通过一个对象(如键盘等)实现的。对象是输入输出设备在程序中的代理。
b. 每个IO对象管理一个缓冲区,用于存储程序读写的数据。
c. 外围设备与对象批量交换数据。(电脑的CPU处理数据的速度很快,不可能等待数据输入后一个个处理。故为输入一定量的数据后再批量处理。此期间数据就存储在缓冲区中)。
>>cin是类istream的对象,它与标准输入设备(键盘等)连在一起。
>>cout是类ostream的对象,它与标准输出设备(显示屏等)连在一起。
>>cerr是类ostream的对象,它与标准错误输出设备连在一起。
>>clog是类ostream的对象,也与标准错误输出设备连在一起。
>>c++的ostream类提供了格式化输出和无格式化输出的功能。
>>输出功能包括:
> 用<< (流插入符)输出标准类型数据。
> 用成员函数put输出字符。
> 成员函数write的无格式化输出(主要用于二进制数据的输出)。
> 输出特定形式数值。
>>指针输出的特例:
> 若输出的指针变量是一个指向字符的指针时,c++直接输出该指针指向的字符串。
> 若确实想输出该指针变量中保存的地址值时,可以用强制类型转换,将它转换为void* 类型。
例如:
#include
using namespace std;
int main()
{
char* ptr = "abcdef";
cout<
>>用成员函数put输出字符:
>cout.put ('A');将A显示在屏幕上,并返回该对象。
>连续调用put函数:
a. cout.put( 'A') . put( '/n'); 输出字符A后,再输出一个换行符。
b. cout. put(65); 用ASCII码表达式调用put函数,语句也会输出字符A
>>write的无格式输出:
>他有两个参数。一个是指向字符的指针,第二个参数是一个整数值。这个函数的作用是把一定量的字节从字符数组中输出,仅仅以原始数据形式输出。
如cout.write( “ABCDEFGHIJKLMN”, 5) 输出前5个字符。
1, 流读取运算符在读入EOF时返回0的特性使得它经常被用作循环的判定条件。
2,EOF在各个系统中有不同的表示。在windows中时ctrl + z ,Mac或Linux一般是control + d;
1,个体函数用于读入字符或字符串。
2,get函数有三种形式:
>不带参数
>带一个参数
>带三个参数
ba,不带参数的get从当前对象中读入一个字符,并将其返回。
如:while( (ch = cin.get() ) != EOF) cout< bb,带一个字符串类型的引用参数: 它将输入流中的下一个字符(包括空白字符)储存在参数中,它的返回值是当前对象的引用。 例如, 下面循环语句将输入一个字符串,存入字符数组ch,直到输入回车: bc,带三个参数的get函数: >> 参数分别是接受字符的字符数组,字符数组的大小,分隔符(默认为' \ n ') >> 函数在读取比指定的最大字符数少一个字符后结束,或者在遇到分隔符后结束。 c,成员函数getline(与带三个参数的get函数类似) · 输入输出流中的整型数默认十进制。 · 插入hex操作符可将基数设为十六进制。 · 插入oct操作符可设为八进制。 ·可以插入dec操作符重新设为十进制。 实例: 此外setbase(进制) 可以更为灵活的设置。 >>通过setprecision(有效位数)<< n; >>通过添加fixed,以cout< >>域宽指数据所占的字符数。 >>设置域宽可以用width 或 setw 函数。 >> 如:cout<< setw(5) << x<< setw(5) << y < 格式如下: ostream &操作符名(<<, >>,tab 。。。)(ostream & os); {需要执行的操作}; c++把每一个文件都看成一个有序的字节流(把文件看成n个字节) > 每一个文件以文件结束符结束。 > 打开一个文件时,该文件就和某个流关联起来。 程序如何解释字节序列: A,ASCII文件也被称为文本文件,它将文件中的每一个字节看成是一个字符的ASCII值。 B,二进制文件是指将文件中的每一个字节仅看成是一个二进制比特串。由程序解释比特串的含义。如c++将四个字节看成一个整型数。 C,ASCII文件可以直接显示在显示屏上,而直接显示二进制文件没有意义。 > 打开一个流对象 > 打开文件:将流对象与文件关联起来。 > 访问文件。 > 关闭文件:切断流对象与文件的关联。 > c++有三个文件流类型: >> ifstream :输入文件流 >> ofstream :输出文件流 >> fstream :输入输出文件流 操作实例:ifstream infile A,用流对象的成员函数open打开文件。 B,用流对象的构造函数打开文件。 C,以上两者均应有两个参数: > 打开的文件名 > 文件打开模式: 默认打开方式: ifstream流对象以in模式打开; ofstrea流对象以out模式打开; fstream流对象以in和out模式打开; D,若文件打开失败,返回0 实例: 打开输入文件: 1,用成员函数close 2,对于输出文件,close会将缓冲区中的内容写入文件。 3,main函数执行结束时,会关闭所有打开的文件。 >> c++中ASCII文件的读写和控制台读写一样,可以用 << 从文件读数据或者 >>将数据写入文件 。 >> 判断文件结束: 1,读:可以通过判断输入流对象是否为0 2,get 读: 可以通过判断读入字符是否为EOF 写入文件操作: · 文件定位指针是一个long类型的数据,指出当前读写的位置。 ·c++有两个定位指针:读指针和写指针。 ·文件以输入方式打开时,读指针指向文件中的第一个字节。 ·文件以输出方式打开时,写指针指向文件中的第一个字节。 ·文件以添加方式打开时,写指针指向文件尾。 1,指定文件定位指针的值,从任意位置开始读写。 2,获取文件定位指针的当前位置:成员函数tellg和tellp。 3,设置文章定位指针的位置:成员函数seekg和seekp: · 两者均有两个参数:第一个为long类型整数,表示偏移量;第二个参数表示指针制定移动的起始位置。 · 寻找方向: ios:: beg(默认):相对于流的开头。 ios:: cur :相对于流当前位置。 ios:: end: 相对于流结尾。 实例: 2,向前移动n个字节,先找到目前位置: 3,从结尾处向后移动y个字节: 4,ASCII文件的随机读写实例: char ch[10010];
cin.get(ch[0]);
int i;
for(i = 0; ch[i] != '\n'; ++i) cin.get(ch[i+1]);
ch[i] = '\0';
(4)格式化输入输出:
a.设置整型数的基数:
int n;
cin>>n;
cout<
b,设置浮点数精度:
c,设置域宽:
(5)用户还可以通过重载自己定义流操作:
基于文件的IO:
文件和流:
ASCII文件和二进制文件:
文件访问过程:
定义一个流对象:
打开文件:
文件打开模式名
含义
in
打开文件,做读操作
out(fout作用相同)
打开文件,做写操作
app
在每次写操作前,找到文件尾
ate
打开文件后,立即将文件定位在文件尾
trunc
打开文件时,清空文件
binary
以二进制模式进行输入输出操作
ifstream infile; //定义ifstream流对象
infile.open("file1 __目标文件名"); 或 infile.open("file1", ifstream:: in);
//也可以通过构造函数来打开:
ifstream infile("file1"); 或 ifstream infile("file1", ifstream:: in);
文件关闭:
文件的顺序访问:
文件访问实例:
#include "console.h"
#include
各种类型数据的文件操作:
#include "console.h"
#include
读取文件:
#include "console.h"
#include
文件的随机访问:
文件定位指针:
文件随机访问的实现:
//省略了assumes ios:: beg
file1.seekg(n);
file.seekg(n, ios::cur);
file.seekg(y, ios:: end);
int main()
{
fstream in("file");
int i;
if(!in){ cerr<<"error"; return 1;};
in.seekp(10);
in<<20; //将上一行定位的修改为20;
in.seekg(0);
while(in>>i) cout<