输入输出流知识总结

1 c++输入输出包含的三方面

(1)对系统指定的标准设备的输入和输出 标准 I/O

(2)以外存磁盘为对象的输入和输出 文件I/O

(3)内存中空间进行输入和输出 字符串I/O

当用cout和插入运算符向显示器输出数据时,先把数据送到输出缓冲区,直到满了或者遇到endl,将缓冲区的全部数据送到显示器显示出来

流:缓冲区的数据

注:

cout和cin并不是c++提供的语句,是iostream类的对象

2各种类库

ios 抽象基类

istream 输入流基类

ostream 输出流基类

iostream 输入和输出流基类

ifstream 输入文件流类

ofstream 输出文件流类

fstream 输入输出文件类

istrstream 输入字符串类

ostrstream 输出字符串类

strstream 输入输出字符串类

3 有关头文件

istream 输入输出的基本操作

fstream 用户管理的文件I/O操作

strstream 字符串流I/O

stdiostream 混合使用c和c++的I/O机制

iomanip 格式化的头文件

4 iostream 头文件中定义的流对象

cin 输入流 (键盘输入)

cout 输出流(显示器)

cerr 错误流(显示器)

clog 错误流(显示器)

5 iostream 头文件重载运算符

ostream operator<<(int);//用于输出流中插入Int数据

6标准输出流

ostream 定义了三个输出流对象 cout (不是c++的关键字)cerr clog

cout  如果出现 endl 则输出所有数据的同时刷新流,即为清空缓冲区,但是换行符只换行不刷新流

cerr  输出错误信息 

clog 在缓冲区中,缓冲区满后或者遇到endl时从显示器输出

7 格式输出

使用控制符或者流对象的成员函数

8 用流成员函数put 输出字符

cout.put(34);

put函数用于输出单个字符

9 标准输入流

cin流 只有输入完数据按回车键后,该行数据才被送到键盘缓冲区,形成输出流

如果遇到无效字符或者遇到文件结束符时,输入处于出错状态

10 用于字符输入的流函数

get 函数

(1)

cin .get();

//不带参数

文件结束标志  EOF

(2)有一个参数

cin .get(ch);

(3)有三个参数的get 函数

cin.get(字符数组,字符个数,终止字符)

getline 函数 用于输入一行字符

cin.getline(字符数组,字符个数,结束标志)

11 istream 类的其他成员函数

(1)

eof 函数

文件结束,函数非0为真否则为假

cin.eof()调用形式

(2)peek 函数

cin.peek();调用形式

观测函数

(3)putback函数

cin.putback();调用形式插入当前位置以供后面读取

(4)ignore 函数

cin.ignore(n,终止字符)跳过输入流中的n个字符遇到指定字符时不再跳跃

使用

12 文件操作与文件流范围

举例: get函数只能从键盘输入字符不能输入一行字符,也就是说遇到空格会终止读取,假如使用了ignore函数就可以解决这个问题

文件:储存在外部介质上数据的集合

文件按组织形式分类为 二进制文件和ASCII文件

对于字符,两者输出的数据形式是相同的,但是对于数值数据,两者是不同的

13 文件流与文件流对象

文件流是以外存文件为输入输出的数据流,文件流本身不是文件,只是以文件为输入输出对象的流

建立一个输出流对象

ofstream outfile;

14 文件的打开和关闭

(1)为文件流和指定的磁盘文件建立关联

(2)指定文件的工作方式

eg:

ofstream outfile;//定义对象

outfile.open("f1.dat",ios::out); 使文件与f1.dat文件建立关联

(3)输入输出方式设置

ios::in 以输入的方式打开文件

ios::out 以输出的方式打开文件

ios::app  以输出的方式打开文件,写入的数据增添在文件尾

ios::ate 打开一个已有的文件,文件指针指向文件末尾

ios::trunc  打开一个文件,如果文件存在,则删除所有数据,否则,建立新文件

ios::binary  以二进制的方式打开文件

ios::nocreate 打开已存在的文件,如果不存在,则打开失败,不建立新文件

ios::noreplace  如果文件不存在,建立新文件,存在则操作失败。noreplace 意思是不更新原有文件

ios::in|ios::out   以输入和输出的方式打开文件,文件可读写

ios::out|ios::binary  以二进制的形式打开输出文件

ios::in|ios::binar  以二进制的形式打开一个输入文件

可以进行组合操作

15 关闭磁盘文件

outfile.close()//将输出流所关联的磁盘文件关闭

实际就是解除该磁盘文件与文件流的关联

Outfile.open("f2.dat",ios::app|ios::nocreate);

此时文件流与f2.dat建立关联,并指定了它的工作方式

16对ASCII文件的操作

对ASCII文件的读写操作可以用以下两种方式

(1)

<<和>>输入输出标准类型的数据

(2)

用文件流等成员函数进行字符的输入和输出

eg 有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件中进行存放

#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    int a[10];
     ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件

加粗部分的程序可写可不写,看情况
     if(!outfile) //如果打开失败
     {
         cerr<<"open error!" <<endl;
         exit(1);//结束函数运行
      } 
      cout<<"请输入10个数字"<<endl;
      for(int i=0;i<10;i++)
      {
          cin>>a[i];
          outfile<<a[i]<<" ";}//向磁盘中输出数据,加空格是为了分隔数据,否则,数字连成一片无法区别
          outfile.close() ;//关闭文件
           return 0; 
}

建立数据文件,从中读10个整数放在数组中,并找出10个数中的最大值和它的下标序号

#include <fstream>
int main()
{
    int a[10];
    int max,i,order;
    ifstream infile ("f1.dat",ios::in|ios::nocreate);//定义输入文件流对象,以输入的方式打开对象
    if(!infile) 
    {
        cerr<<"open error"<<endl;
        exit(1);

    }
    for(int i=0;i<10;i++)
    {
        infile>>a[i];//从磁盘读10个数字,顺序放在a数组后面 
        cout<<a[i];//在显示器上显示数字
        cout<<endl;
        max=a[0];//假设第一个数为最大数 
        order=0;
        for(int i=0;i<10;i++)
        {
            if(a[i]>max) 
            {
                max=a[i];
                order=i;//储存最大数的下标 
            }
         
        }
        cout<<max<<endl<<order<<endl;
    }
    infile.close();//文件关闭
    return 0; 
}

从键盘中读入一行数字,把字母字符放在磁盘文件中,再把它从磁盘文件读入程序,将其中的小写字母改为大写字母,再存入磁盘文件中

#include <fstream>
using namespace std;
void save_to_file()//从键盘读入一行数据区,将其存在磁盘文件中 
{
    ofstream outfile("f2.dat") ;
    //定义输出文件流,以输出方式打开磁盘文件
    
    if(!outfile) 
    {
        cerr<<"打开失败"<<endl;
        exit(1);//结束程序 
    }
    char c[80];
    cin.getline(c,80);//从键盘读入一行数据
    for(int i=0;c[i]!=0;i++) 
    {
        //对字符逐个处理,直到遇到结束标志为止
        if(c[i]>=65&&c[i]<=90||c[i]>=97&&c[i]<=122) //如果是字符
        {
            outfile.put(c[i]) ;//将字母字符存入磁盘文件
            cout<<c[i] ;
         } 
         cout<<endl;
         
     } 
     outfile.close();//关闭 
}
//从磁盘文件中读入字母字符,将小写字母改为大写字母
void get_from_file()
{
    char ch;
    ifstream infile("f2.dat",ios::in|ios::nocreate);
    if(!infile)
    {
        cerr<<"打开错误"<<endl;
        exit(1);
    }
    ofstream outfile("f3.dat");//定义输出文件流,以输出的方式打开
    if(!infile) 
    {
        cerr<<"打开错误" <<endl;
        exit(1) ;//终止程序 
    }
    while (infile.get(ch))
    {
        if (ch>=97&&ch<=122)//判断是否为小写字母
        ch=ch-32;//将小写变为打下
        outfile.put(ch) ;//将大写字母存到磁盘文件中 
        cout<<ch;//同时显示器输出 
     } 
     cout<<endl;
     infile.close();//关闭磁盘文件
     outfile.close();//关闭磁盘文件f3.dat 
 } 
 int main()
 {
     save_to_file();
     get_from_file();//函数调用
     return 0;} 

16 对二进制文件的操作

文件也要打开和关闭

打开  ios::binary

(1)用read 和write 读写二进制文件

将一批数据以二进制的形式存放在磁盘文件中

#include <fstream>
using namespace std;
struct student
{
    char name[20];
    int num;
    int age;
    char sex;
};
int main()
{
    student stud[3]={"li",1001,12,"f","fun",1002,12,"m","wang",1003,14,"f"};
     ofstream outfile("stud.dat",ios::binary);
     if(!outfile)
     {
         cerr<<"打开错误"<<endl;
         abort() ;//退出程序
          
     }
     for(int i=0;i<3;i++) 
     {
         outfile.write((char*)&stud[i],sizeof(stud[i]));
         outfile.close();
         return 0;
      } 
 } 

17 字符串流

文件流以外存文件为输入输出对象的数据流,而字符串是以用户自己定义的数组类型为对象

将数据输出到内存中的字符数组,或者从字符数组中将数据读入,也称为内存流

也有缓冲区

字符数组中可以存放字符,也可以存放整数,浮点数和其他类型的数,存入时,要先将数据从二进制转换ASCII代码,然后放在缓冲区,再从缓冲区送到字符数组

从字符数组中读取时,现将字符数组中的数据送到缓冲区,将ASCII码转换成二进制的形式

与文件流的三个不同

(1)输出时数据是流向内存的储存空间

(2)字符串流对象关联的不是文件,是内存中的字符数组

不需要打开和关闭文件

(3)用户需要自己定义一个特殊的字符作为结束标志

建立 字符串输出流对象

ostrstream strout(chl,20) ;

字符串对象与数组chl关联,缓冲区大小为20

建立 字符串输入流对象

ostrstream strin(chl,20) ;

字符串对象与数组chl关联,缓冲区大小为20

建立 字符串输出流对象

ostrstream   strio(ch3,sizeof(ch3),ios::in|iosout);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值