c++的输入输出与文件

配置环境:

QTcreater && cs106

c++输入输出的基本定义:

(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处理数据的速度很快,不可能等待数据输入后一个个处理。故为输入一定量的数据后再批量处理。此期间数据就存储在缓冲区中)。

基于控制台的IO:

(1)标准输入输出的对象:

>>cin是类istream的对象,它与标准输入设备(键盘等)连在一起。

>>cout是类ostream的对象,它与标准输出设备(显示屏等)连在一起。

>>cerr是类ostream的对象,它与标准错误输出设备连在一起。

>>clog是类ostream的对象,也与标准错误输出设备连在一起。

(2)输出流:

>>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个字符。

(3)输入流:

a.流读取运算符 >> :

   1, 流读取运算符在读入EOF时返回0的特性使得它经常被用作循环的判定条件。

   2,EOF在各个系统中有不同的表示。在windows中时ctrl + z ,Mac或Linux一般是control + d;

b.成员函数get:

1,个体函数用于读入字符或字符串。

2,get函数有三种形式:

     >不带参数

     >带一个参数

     >带三个参数

ba,不带参数的get从当前对象中读入一个字符,并将其返回。

       如:while( (ch = cin.get() ) != EOF) cout<

bb,带一个字符串类型的引用参数:

     它将输入流中的下一个字符(包括空白字符)储存在参数中,它的返回值是当前对象的引用。

    例如, 下面循环语句将输入一个字符串,存入字符数组ch,直到输入回车:

char ch[10010];
  cin.get(ch[0]);
  int i;
  for(i = 0; ch[i] != '\n'; ++i) cin.get(ch[i+1]);
  ch[i] = '\0';

    bc,带三个参数的get函数:

   >> 参数分别是接受字符的字符数组,字符数组的大小,分隔符(默认为' \ n ')

  >> 函数在读取比指定的最大字符数少一个字符后结束,或者在遇到分隔符后结束。

   c,成员函数getline(与带三个参数的get函数类似)

(4)格式化输入输出:

a.设置整型数的基数:

   · 输入输出流中的整型数默认十进制。

   · 插入hex操作符可将基数设为十六进制。

   · 插入oct操作符可设为八进制。

   ·可以插入dec操作符重新设为十进制。

实例:

int n;
  cin>>n;
  cout<

此外setbase(进制) 可以更为灵活的设置。

b,设置浮点数精度:

>>通过setprecision(有效位数)<< n;

>>通过添加fixed,以cout<

c,设置域宽:

>>域宽指数据所占的字符数。

>>设置域宽可以用width 或 setw 函数。

>> 如:cout<< setw(5) << x<< setw(5) << y <

(5)用户还可以通过重载自己定义流操作:

格式如下:

ostream &操作符名(<<,  >>,tab 。。。)(ostream & os);

{需要执行的操作};

基于文件的IO:

文件和流:

c++把每一个文件都看成一个有序的字节流(把文件看成n个字节)

> 每一个文件以文件结束符结束。

> 打开一个文件时,该文件就和某个流关联起来。

ASCII文件和二进制文件:

程序如何解释字节序列:

A,ASCII文件也被称为文本文件,它将文件中的每一个字节看成是一个字符的ASCII值。

B,二进制文件是指将文件中的每一个字节仅看成是一个二进制比特串。由程序解释比特串的含义。如c++将四个字节看成一个整型数。

C,ASCII文件可以直接显示在显示屏上,而直接显示二进制文件没有意义。

文件访问过程:

> 打开一个流对象

> 打开文件:将流对象与文件关联起来。

> 访问文件。

> 关闭文件:切断流对象与文件的关联。

定义一个流对象:

> c++有三个文件流类型:

   >> ifstream :输入文件流

   >> ofstream :输出文件流

   >> fstream :输入输出文件流

操作实例:ifstream infile

打开文件:

A,用流对象的成员函数open打开文件。

B,用流对象的构造函数打开文件。

C,以上两者均应有两个参数:

      > 打开的文件名

      > 文件打开模式:

文件打开模式名 含义
in 打开文件,做读操作
out(fout作用相同) 打开文件,做写操作
app 在每次写操作前,找到文件尾
ate 打开文件后,立即将文件定位在文件尾
trunc 打开文件时,清空文件
binary 以二进制模式进行输入输出操作

默认打开方式:

ifstream流对象以in模式打开;

ofstrea流对象以out模式打开;

fstream流对象以in和out模式打开;

D,若文件打开失败,返回0

实例:

打开输入文件:

ifstream infile;  //定义ifstream流对象
    infile.open("file1 __目标文件名"); 或 infile.open("file1", ifstream:: in);
    //也可以通过构造函数来打开:
    ifstream infile("file1"); 或 ifstream infile("file1", ifstream:: in);

文件关闭:

1,用成员函数close

2,对于输出文件,close会将缓冲区中的内容写入文件。

3,main函数执行结束时,会关闭所有打开的文件。

文件的顺序访问:

>> c++中ASCII文件的读写和控制台读写一样,可以用 << 从文件读数据或者 >>将数据写入文件

>> 判断文件结束:

1,读:可以通过判断输入流对象是否为0

2,get 读: 可以通过判断读入字符是否为EOF

 文件访问实例:

#include "console.h"
#include
#include
#include "simpio.h"
using namespace std;


int main()
{
    ofstream out("file1"); //用ostream的out函数打开一个可写的数据流文件,若没有该文件则自动创建
    ifstream in;  //定义一个可读数据流文件为 in
    int i;
    if(!out){cerr << "create file error \n"; return 1;}   //打开或创建失败时的写法
    for(int i = 1; i <= 10 ; ++i) out<>i) cout<

各种类型数据的文件操作:

写入文件操作:

#include "console.h"
#include
#include
#include "simpio.h"
using namespace std;


int main()
{
    ofstream fout("test");
    if(!fout){ cerr<<"cannot open this file \n"; return 1;}
    fout<<10<<" "<<123.456<<"This is a file \n"; //写入操作
    fout.close();
    return 0;
}

读取文件:

#include "console.h"
#include
#include
#include "simpio.h"
using namespace std;


int main()
{
    ifstream in("file1");
    int i;
    if(!in) {cerr<<"open file error \n"; return 1;}  //固定格式
    while(in >> i){  //循环输出文件中数据的表示方法。记忆
        cout<

文件的随机访问:

文件定位指针:

· 文件定位指针是一个long类型的数据,指出当前读写的位置。

·c++有两个定位指针:读指针和写指针。

·文件以输入方式打开时,读指针指向文件中的第一个字节。

·文件以输出方式打开时,写指针指向文件中的第一个字节。

·文件以添加方式打开时,写指针指向文件尾。

文件随机访问的实现:

1,指定文件定位指针的值,从任意位置开始读写。

2,获取文件定位指针的当前位置:成员函数tellg和tellp。

3,设置文章定位指针的位置:成员函数seekg和seekp:

      · 两者均有两个参数:第一个为long类型整数,表示偏移量;第二个参数表示指针制定移动的起始位置。

      · 寻找方向:

        ios:: beg(默认):相对于流的开头。

        ios:: cur :相对于流当前位置。

        ios:: end: 相对于流结尾。

        实例:

  1.          移向file1的第n个字节:
    //省略了assumes ios:: beg
    file1.seekg(n);

     2,向前移动n个字节,先找到目前位置:

file.seekg(n, ios::cur);

     3,从结尾处向后移动y个字节:

file.seekg(y, ios:: end);

     4,ASCII文件的随机读写实例:

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<

          

你可能感兴趣的:(c++,开发语言)