• C++输入输出流


    输入输出流

    1. 用控制符输出格式,例:

    #include <iostream>
    #include <iomanip>//利用控制符输出必须包含iomanip头文件
    using namespace std;
    int main()
    {int a;
    cout<<"input a:";
    cin>>a;
    cout<<"dec:"<<dec<<a<<endl;  //以十进制输出
    cout<<"hex:"<<hex<<a<<endl;  //十六进制
    cout<<"oct:"<<setbase(8)<<a<<endl; //八进制
    char *pt="China";
    cout<<setw(10)<<pt<<endl; //宽度为10,China前补上5个空格
    cout<<setfill('*')<<setw(10)<<pt<<endl; //China前补上5个*
    double pi=22.0/7.0;
    cout<<setiosflags(ios::scientific)<<setprecision(8);//科学记数法,8位小数
    cout<<"pi="<<pi<<endl;	//输出pi
    cout<<"pi="<<setprecision(4)<<pi<<endl;              //改为4位小数
    cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//去掉科学记数法
    return 0;
    }

    控制符用法列表如下:

    2. 用流对象cout中用于控制输出格式的成员函数来控制输出格式

    例如:

    cout.setf(iso::showbase)

    cout.setf(ios::oct)

    cout.width(10)

    cout.setf(ios::internal | ios::showpos)

    等等,其中参数iso::showbase属于格式标志,是在类ios中定义的枚举值。因为用流控制成员函数没有控制符使用方便,所以一般不常用。

     

    3. put函数(cout对象的成员函数)

    作用:输出单个字符,例如:

    cout.put(‘a’); //等价于cout.put(97),97为a的ASCII码

    cout.put(71).put(79).put(79).put(68).put(‘\n’);//连续输出字符GOOD

    将字符串“BASIC”反序输出:

    #include <iostream>
    using namespace std;
    int main( )
    {
    	char *a="BASIC";
    	for(int i=4;i>=0;i--)
    		cout.put(*(a+i));
    	cout.put('\n');
    	return 0;
    }

    也可以用C语言的格式:将上面的cout.put()改成putchar()

     

    4. cin.get()提取一个字符,类似于C语言中的getchar(),但是它可以有3个参数:

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

    例如:cin.get(ch, 10, ‘\n’); cout<<ch<<endl;

    get函数中第三个参数可以省略,此时默认为’\n’。下面两行等价:

    cin.get(ch, 10, ‘\n’);

    cin.get(ch, 10);

    终止字符也可以用其他字符,例如:

    cin.get(ch,10,’x’);

    5. cin.getline用于输入一个字符串

    用法:cin.getline(char*,int,char),ENTER来结束输入,例如:

    #include<iostream>
    using namespace std;
    int main()
    {
    	const int ArSize = 20;
    	char name[ArSize];
    	char dessert[ArSize];
    
    	cout<<"Enter your name:\n";
    	cin.getline(name,ArSize);
    	cout<<"Enter your favorite dessert:\n";
    	cin.getline(dessert,ArSize);
    	cout<<"I have some delicious "<<dessert;
    	cout<<" for you, "<<name<<".\n";
    	return 0;
    }

    cin<<与cin.getline()的区别:用“cin<<”读数据时以空白字符(空格、tab、回车)作为终止标志,而用cin.getline()可以读入一系列字符,包括空格。例如:

    char c[30];//输入I’m a good boy !

    cin>>c;// c只能得到第一个空格前的I’m

    cin.getline(c);//c可以得到整句I’m a good boy !

     

    6. eof函数

    eof是end of file的缩写,表示“文件结束”,eof函数值为非零表示真,否则为0表示假。例如:

    #include <iostream>
    using namespace std;
    int main( )
    {
    	char c;
    
    	while (!cin.eof())
    	{
    		if( (c=cin.get()) != ' ')
    			cout.put(c);
    	}
    	return 0;
    }

    当输入Ctrl+Z时,cin.eof()就为真,!cin.eof()则为假,所以结束while循环。

     

    7. cin.peek()函数和cin.putback()函数

    用法见下面程序的注释:

    #include <iostream>
    using namespace std;
    int main( )
    {
    	char c[30];
    	char w;
    	cin.getline(c, 30, '^');//输入I am a cool boy !^'m bad girl.^
    	w=cin.peek();//获取当前指针(指向^)的下一个字符(即’)
    	cout.put(w).put('\n');
    	cin.putback(c[0]);//获取前面get或者getline中的一个字符,插入到当前字符前(即w前)
    	cin.getline(c, 30, '^');
    	cout<<c<<endl;
    	return 0;
    }

    即,我们可以用cin.peek()函数来获取当前输入流指针的当前指向;可以用cin.putback()来获取前面get或getline函数输入的内容中的一个字符,并插入到当前流指针的前面。

     

    8. cin.ignore()函数

    用法cin.ignore(5, ‘A’); //从当前指针位置(不包括当前指针)开始,忽略后面cin输入的5个字符,或者遇到字符’A’就不再往后跳了(‘A’会被跳过)。

    默认写作:cin.ignore(),相当于cin.ignore(1, EOF),EOF代表文件结束符

    例如: 

    #include <iostream>
    using namespace std;
    int main( )
    {
    	char c[30];
    	cin.getline(c, 30, '^');//输入I am a cool boy !^123I'm bad girl.^I’m smart.
    	cout<<"The first part is: "<<c<<endl;
    	cin.ignore(3);//忽略掉^后面的1233个字符
    	cin.getline(c, 30, '^');
    	cout<<"The second part is: "<<c<<endl;
    	return 0;
    }


    9.文件

    (1)ASCII文件(类名ifstream、ofstream和fstream,存入是out,读取是in)

    a. 存入文件

    ofstream outfile;

    outfile.open("f1.dat",ios::out); // ios::out(格式标志)是默认的,故也可以省略

    上面两行等价于:

    ofstream outfile("f1.dat",ios::out);

    现在可以用outfile对象来存入数据了:

                  cin>>a[i];

                  outfile<<a[i]<<" ";//每读入一个整数就输出到磁盘文件

    用完记得,关闭文件:

           outfile.close();

    文件输入输出格式标志如下:

    完整实例:

    /*将键盘输入的数据存入文件中*/
    #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<<"enter 10 integer numbers:"<<endl;
    	for(int i=0;i<10;i++)
    	{
    		cin>>a[i];
    		outfile<<a[i]<<" ";//每读入一个整数就输出到磁盘文件
    	}
    	outfile.close();//记住关闭文件
    	return 0;
    }

    生产的f1.dat文件可以用记事本打开,也可以在DOS下用TYPE命令打开:

    C:\Documents and Settings>D:     //直接输入盘符,切换到D盘

    D:\>cd 001\mycpp                //用cd命令切换到文件目录

    D:\ 001\mycpp>type f1.dat    //用TYPE命令查看dat文件

    2 5 6 8 7 9 5 6 4 10

     

    b. 读取文件,例:

    和存入文件差不多:infile("f1.dat",ios::in),infile>>a[i],infile.close()

    实例如下:

    /*将文件中的数据在屏幕中显示*/
    #include <fstream>
    #include <iostream>
    using namespace std;
    int main( )
    {
    	int a[10],max,i,order;
    	ifstream infile("f1.dat",ios::in);//打开磁盘文件
    	if(!infile)
    	{
    		cerr<<"open error!"<<endl;
    		exit(1);
    	}
    	for(i=0;i<10;i++)
    	{
    		infile>>a[i];//从文件中读入整数,存到a[i]中
    		cout<<a[i]<<" ";
    	}
    	cout<<endl;
    	max=a[0];
    	order=0;
    	for(i=1; i<10; i++)//找出最大的数及下标
    	{
    		if(a[i]>max)
    		{
    			max=a[i];
    			order=i;
    		}
    	}
    	cout<<"max="<<max<<endl<<"order="<<order<<endl;
    	infile.close();//记住关闭文件
    	return 0;
    }


    编一个专门读取dat文件内容的程序:

    #include <fstream>
    #include <iostream>
    using namespace std;
    void display_dat(char *filename)
    {
    	ifstream infile(filename, ios::in);
    	if(!infile)
    	{
    		cerr<<"open error!"<<endl;
    		exit(1);
    	}
    	char ch;
    	while (infile.get(ch))
    	{
    		cout.put(ch);
    	}
    	cout<<endl;
    	infile.close();
    }
    
    int main( )
    {
    	display_dat("f1.dat");//相对目录
    	return 0;
    }


    (2)二进制文件(类名为ifstream、ofstream和fstream,与ASCII用到的类相同)

    成员函数read和write,原型如下:

    istream & read(char * buffer, int len);//读取

    ostream & write(const char * buffer, int len);//存入

    两个参数:char指针指向要读写的对象,len代表读写的字节数。用法如下:

    outfile.write((char *)&stud[i], sizeof(stud[0]));

    iofile.read((char *)&stud[i], sizeof(stud[0]));

    注意原型声明中类型为字符指针型,传递时必须用字符指针(p)或者字符类型数据的地址(&s),只能将相同类型的指针或者地址赋值给指针。

    其他成员函数,例如:

    infile.seekg(100);//g是get的意思,代表输入。文件指针向前移动50个字节

    infile.seekg(-50,ios::cur);//输入文件指针从当前位置后移50字节

    outfile.seekp(-70,ios::end);//输出文件指针从文件尾倒退70字节

    完整实例:

    /*将数据存入文件*/
    #include <fstream>
    #include <iostream>
    using namespace std;
    struct student
    {
    	char name[20];
    	int num;
    	int age;
    	char sex;
    };
    int main( )
    {
    	student stud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'}; 
    	ofstream outfile("stud.dat",ios::binary);//以二进制形式输入数据到文件
    	if(!outfile)
        {
    		cerr<<"open error!"<<endl;
    		abort( );
        }
    	for(int i=0;i<3;i++)
    	{
    		outfile.write((char*)&stud[i], sizeof(stud[i]));//强制数据类型转换
    	}
       	outfile.close( );
    	return 0;
    }


    例子:访问文件中的任何一个位置,并频繁读写

    要求:有5个学生的数据,把它们存到磁盘文件中,将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来;将第3个学生的数据修改后存回磁盘文件中的原有位置;从磁盘文件读入修改后的5个学生的数据并显示出来。程序如下:

    #include <fstream>
    #include <iostream>
    using namespace std;
    struct student
    {
    	int num;
    	char name[20];
    	float score;
    };
    
    int main( )
    {
    	student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,
    		1006,"Tan",76.5,1010,"ling",96};
    	fstream iofile("stud.dat",ios::in|ios::out|ios::binary);
    	//用fstream类定义输入输出二进制文件流对象iofile,注意名字iofile是自定义的
    	if(!iofile)
    	{	
    		cerr<<"open error!"<<endl;	
    		abort( );
    	}
    	for(int i=0;i<5;i++)//向磁盘文件输出5个学生的数据
    	{
    		iofile.write((char *)&stud[i], sizeof(stud[i]));
    	}
    	student stud1[5];                  //用来存放从磁盘文件读入的数据
    	for(i=0; i<5; i=i+2)
    	{
    		iofile.seekg(i*sizeof(stud[i]),ios::beg);  //定位于第0,2,4学生数据开头
    		iofile.read((char *)&stud1[i/2], sizeof(stud1[0])); 
    		//先后读入3个学生的数据,存放在stud1[0],stud[1]和stud[2]中
    		cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;
    		//输出stud1[0],stud[1]和stud[2]各成员的值
    	}
    	cout<<endl;
    	stud[2].num=1012;                         //修改第3个学生(序号为2)的数据
    	strcpy(stud[2].name,"Wu");
    	stud[2].score=60;
    	iofile.seekp(2*sizeof(stud[0]),ios::beg);   //定位于第3个学生数据的开头
    	iofile.write((char *)&stud[2],sizeof(stud[2])); //更新第3个学生数据
    	iofile.seekg(0,ios::beg);                       //重新定位于文件开头
    	for(i=0;i<5;i++)
    	{
    		iofile.read((char *)&stud[i],sizeof(stud[i]));  //读入5个学生的数据
    		cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<endl;
    	}
    	iofile.close( );
    	return 0;
    }


     

  • 相关阅读:
    不安装oracle客户端也可以使用pl/sql developer
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    c语言第一次作业1
    C语言I博客作业04
    C语言I博客作业03
    C语言I博客作业02,
    ASP.NET url重写与图片防盗链 I
  • 原文地址:https://www.cnblogs.com/zollty/p/2879287.html
Copyright © 2020-2023  润新知