c++语言的输入输出流库

1.c++语言标准输入输出流

<1>控制符的用法

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    int x=30,y=300,z=1024;
    cout<<"Decimal:"<<x<<" "<<y<<" "<<z<<endl;//按十进制输出
    cout<<"Octal:"<<oct<<x<<" "<<y<<" "<<z<<endl;//按八进制输出
    cout<<"Hexademical:"<<hex<<x<<" "<<y<<" "<<z<<endl;//按十六进制输出
    cout<<setiosflags(ios::uppercase);//设置数值中字母大写输出
    cout<<"Hexademical:"<<hex<<x<<" "<<y<<" "<<z<<endl;//
    cout<<resetiosflags(ios::uppercase);//设置数值中字母小写输出
    cout<<"Hexademical:"<<hex<<x<<" "<<y<<" "<<z<<endl;//
    cout<<"Decimal:"<<dec<<x<<" "<<y<<" "<<z<<endl;//恢复按十进制输出

    return 0;
}

  运行结果:

 

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    int a=10;
    int b=1000;
    cout<<setw(5)<<a<<endl;
    cout<<setw(2)<<b;
    return 0;
}

setw操作符主要用来输出预留空格数,若空间多余则向右对齐;若空间不够,按数据长度输出。

 

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    cout<<setfill('*')//设置填充符号为"*"
        <<setw(2)<<"OK"<<endl
        <<setw(3)<<"OK"<<endl
        <<setw(4)<<"OK"<<endl;
    cout<<setfill(' ');//恢复默认设置,填充空格
    return 0;
}

 

 

 

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    double test=22.0/7;//c++语言默认的流输出数值有效位为六位
    cout<<test<<endl;
    cout<<setprecision(0)<<test<<endl//c++语言最小有效位为1位,此处取1
        <<setprecision(1)<<test<<endl
        <<setprecision(2)<<test<<endl
        <<setprecision(3)<<test<<endl
        <<setprecision(4)<<test<<endl;
    cout<<setiosflags(ios::fixed);
    cout<<setprecision(8)<<test<<endl;
    //setiosflags(ios::fixed)与setprecision(8)合用,控制小数点右边的数字个数为八个
    cout<<setprecision(6);

    return 0;
}

 

 

 

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    double x=66,y=-8.246;
    cout<<x<<" "<<y<<endl;
    cout<<setiosflags(ios::showpoint);//设置强制显示小数点和无效0
    cout<<x<<" "<<y<<endl;

    return 0;
}

 

 

 

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    double x=66,y=-8.246;
    cout<<x<<" "<<y<<endl;
    cout<<setiosflags(ios::showpos);//设置强制显示正号
    cout<<x<<" "<<y<<endl;

    return 0;
}

 

<2>.使用ios类成员函数

#include <iostream>
using namespace std;
int main(){
    char str[250];
    cout<<"请输入一字符串:\n";
    cin.getline(str,sizeof(str),',');
    cout<<"输入的字符串为:"<<str<<endl;

    return 0;
}

从键盘读取一行文本,每遇到一个逗号就结束一次输入。

   运行结果:

 

2.文件输入输出流

文件分为ASCII文件和二进制文件

 文件的打开与关闭

ofstream、ifstream、fstream类

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
    ofstream myf("d:\\myabc.txt");
    char txt[255];
    while (1)
    {
        cin.getline(txt,255);
        if(strlen(txt)==0)
            break;
        myf<<txt<<endl;
    }
    return 0;
}

此程序可由用户输入任意一些字符串并按行保存到磁盘文件上。

 

#include <iostream.h>
#include <fstream.h>
#include <string.h>
int main(){
    ifstream myf("d:\\myabc.txt",ios::nocreate);
    if(myf.fail()){
        cout<<"file not exist!"<<endl;
        return 0;
    }
    char txt[255];
    myf>>txt;
    while(!myf.eof()){
        cout<<txt<<endl;
        myf>>txt;
    }
    return 0;
}

该程序将上面文件内容输出到屏幕上

 

 

先定义文件流对象,再与文件连接

ifstream file;

file.open("myfile.txt",ios::in);//打开文件

file.close();//关闭文件

 

 

<1>文件的读写

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
int main(){
    ifstream ifile;
    ofstream ofile;
    ifile.open("d:\\myabc.txt");
    ofile.open("d:\\213.txt");
    if(ifile.fail()||ofile.fail()){
        cerr<<"open file fail\n";
        return EXIT_FAILURE;//EXIT_FAILURE在cstdlib库中定义
                               //用于向操作系统报告终止不成功
    }
    char ch;
    ch=ifile.get();
    while(!ifile.eof()){
        ofile.put(ch);
        ch=ifile.get();
    }
    ifile.close();
    ofile.close();
    return 0;
}

文件复制

 

 

 

有时,程序用户需要交互输入数据文件名,则可使用下面的程序代码:

ifstream ifile;

string fileName;

cout<<"Enter the input file name:";

cin>>fileName;

ifile.open(fileName.c_str());

 

 

 

<2>文本文件的读写

要求:输入一个学生的姓名、学号、年龄和住址存入文本文件中,然后读出该文件的内容。

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
class student{
public:
    char name[10];
    int num;
    int age;
    char addr[15];
    friend ostream & operator<<(ostream &out,student &s);
    friend istream & operator>>(istream &in,student &s);
};
ostream & operator<<(ostream &out,student &s){
    out<<s.name<<" "<<s.num<<" "<<s.age<<" "<<s.addr<<endl;
    return out;
}
istream & operator>>(istream &in,student &s){
    in>>s.name>>s.num>>s.age>>s.addr;
    return in;
}
int main(){
    ofstream ofile;
    ifstream ifile;
    ofile.open("d:\\s.txt");
    student s;
    for(int i=1;i<=3;i++){
        cout<<"请输入第"<<i<<"个学生的姓名 学号 年龄 住址"<<endl;
        cin>>s;
        ofile<<s;
    }
    ofile.close();
    cout<<"\n读出文件内容"<<endl;
    ifile.open("d:\\s.txt");
    ifile>>s;
    while(!ifile.eof()){
        cout<<s;
        ifile>>s;
    }
    ifile.close();

    return 0;
}

 

<3>二进制文件的读写

文本文件和二进制文件最根本的区别在于进行I/O操作时对"\n"字符的解释方式不同。

通过随机数产生函数rand()产生20个整数,逐个将这些数以二进制方式写入文件file.dat中,然后读出这些数,在内存中对它们进行升序排序,再将排序后的数以文本方式逐个写入file.out文件中。

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <fstream>
#include <iomanip>
using namespace std;
void sort(int[],int);
int main(){
    fstream dat,out;                                   //定义文件流对象
    int i,a[20],b[20];
    dat.open("file.dat",ios::binary|ios::out|ios::in);//为读写打开二进制文件
    if(!dat){
        cout<<("cannot open file\n");
        exit(0);
    }
    for(i=0;i<20;i++){
        a[i]=rand();
        dat.write((char*)&a[i],sizeof(int));           //将20个数读入文件
    }
    dat.seekg(0);                                      //将文件指针移至文件头
    for(i=0;i<20;i++)
        dat.read((char*)&b[i],sizeof(int));            //读出20个数
    sort(b,20);                                        //调用排序函数
    out.open("file.out",ios::out);                     //为输出打开文本文件
    if(!out){
        cout<<"cannot open file\n";
        exit(0);
    }
    for(i=0;i<20;i++){
        out<<b[i]<<" ";
    }
    out<<"\n";
    for(i=0;i<20;i++){                                  //将排序后数据写入文本文件
        cout<<setw(10)<<b[i];
        if((i+1)%5==0)
            cout<<endl;
    }
    out.close();                                         //文本文件
    dat.close();
    return 0;

}
void sort(int x[],int m){                                 //排序函数
    int i,j,k,t;
    for(i=0;i<m-1;i++){
        k=i;
        for(j=i+1;j<m;j++)
            if(x[j]<x[k]) k=j;
            if(k!=i){
                t=x[i];x[i]=x[k];x[k]=t;
            }
    }
}

运行结果:

 <4>文件的随机访问

#include <fstream>
#include <iostream>
using namespace std;
int main(){
    fstream f("DATA",ios::in|ios::out|ios::binary);
    int i;
    for(i=0;i<20;i++)//先向文件中写20个二进制位表示的整数,无格式
        f.write((char*)&i,sizeof(int));
    streampos pos=f.tellp();//记录下当前的写指针
    for(i=20;i<40;i++)//再向文件中写20个二进制位表示的整数,无格式
        f.write((char*)&i,sizeof(int));
    f.seekg(pos);//将读指针定位在pos所指的位置
    f.read((char*)&i,sizeof(int));
    cout<<"the data stored is"<<i<<endl;
    f.seekp(0,ios::beg);//移到文件开始
    for(i=100;i<140;i++)//重写文件中的内容
        f.write((char*)&i,sizeof(int));
    f.seekg(pos);
    f.read((char*)&i,sizeof(int));//将读指针定位在pos所指的位置
    cout<<"the data stored is"<<i<<endl;
    return 0;
}

运行结果:

  

 

posted on 2015-06-15 15:59  1163699877  阅读(690)  评论(0编辑  收藏  举报