Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51958
  • 博文数量: 78
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-12 10:57
个人简介

A fool sees not the same tree that a wise man sees。。。

文章分类

全部博文(78)

文章存档

2016年(78)

我的朋友

分类: C/C++

2016-06-12 11:13:42

原文地址:【总结】C++输入输出流 作者:zollty

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

#include

#include //利用控制符输出必须包含iomanip头文件

using namespace std;

int main()

{int a;

cout<<"input a:";

cin>>a;

cout<<"dec:"<  //以十进制输出

cout<<"hex:"<  //十六进制

cout<<"oct:"<八进制

char *pt="China";

cout<宽度为10China前补上5个空格

cout<前补上5*

double pi=22.0/7.0;

cout<科学记数法,8位小数

cout<<"pi="<       //输出pi

cout<<"pi="<              //改为4位小数

cout<<"pi="<去掉科学记数法

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)97aASCII

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

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

#include

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<

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

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 "<

       cout<<" for you, "<

       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函数

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

#include

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

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<

       return 0;

}

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

 

8. cin.ignore()函数

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

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

例如:

#include

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: "<

       cin.ignore(3);//忽略掉^后面的1233个字符

       cin.getline(c, 30, '^');

       cout<<"The second part is: "<

       return 0;

}

 

9.文件

(1)ASCII文件(类名ifstreamofstreamfstream,存入是out,读取是in

a. 存入文件

ofstream outfile

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

上面两行等价于:

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

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

              cin>>a[i];

              outfile<每读入一个整数就输出到磁盘文件

用完记得,关闭文件:

       outfile.close();

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

完整实例:

/*将键盘输入的数据存入文件中*/

#include

#include

using namespace std;

int main( )

{

       int a[10];

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

       if(!outfile)

       {

              cerr<<"open error!"<

              exit(1);

       }

       cout<<"enter 10 integer numbers:"<

       for(int i=0;i<10;i++)

       {

              cin>>a[i];

              outfile<每读入一个整数就输出到磁盘文件

       }

       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

#include

using namespace std;

int main( )

{

       int a[10],max,i,order;

       ifstream infile("f1.dat",ios::in);//打开磁盘文件

       if(!infile)

       {

              cerr<<"open error!"<

              exit(1);

       }

       for(i=0;i<10;i++)

       {

              infile>>a[i];//从文件中读入整数,存到a[i]

              cout<

       }

       cout<

       max=a[0];

       order=0;

       for(i=1; i<10; i++)//找出最大的数及下标

       {

              if(a[i]>max)

              {

                     max=a[i];

                     order=i;

              }

       }

       cout<<"max="<

       infile.close();//记住关闭文件

       return 0;

}

 

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

#include

#include

using namespace std;

void display_dat(char *filename)

{

       ifstream infile(filename, ios::in);

       if(!infile)

       {

              cerr<<"open error!"<

              exit(1);

       }

       char ch;

       while (infile.get(ch))

       {

              cout.put(ch);

       }

       cout<

       infile.close();

}

 

int main( )

{

       display_dat("f1.dat");//相对目录

       return 0;

}

 

(2)二进制文件(类名为ifstreamofstreamfstream,与ASCII用到的类相同)

成员函数readwrite,原型如下:

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);//gget的意思,代表输入。文件指针向前移动50个字节

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

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

完整实例:

/*将数据存入文件*/

#include

#include

using namespace std;

struct student

{

       char name[20];

       int num;

       int age;

       char ***;

};

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!"<

              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

#include

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!"<  

              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[0],stud[1]stud[2]各成员的值

       }

       cout<

       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<

       }

       iofile.close( );

       return 0;

}

 

附加一个C语言读写二进制文件的实例:

#include

#include

 

int main(int argc, char ** argv)

{

      const char * file_name = "out.dat";

      FILE * fp = fopen(file_name, "wb");

         int i, a[3]={5,3,1}, b[3];

 

      fwrite(&a, sizeof(int), 3, fp);

      fclose(fp);

 

      fp = fopen(file_name, "rb");

      fread(&b, sizeof(int), 3, fp);

     

         for(i=0; i<3; i++)

                printf("%d\n", b[i]);

 

      return 0;

}

详细用法参加fopenfwritefread这几个函数的说明。

 

阅读(263) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~