C++对数据文件的操作与文件流

 一、基本知识

1、文件      

      文件是程序设计中一个重要的概念,“文件”一般指存储在外部介质上的数据集合。常用的文件有两大类,一类是程序文件,另一类是数据文件。根据文件中数据的组织形式,可以分为ASCII文件和二进制文件。ASCII文件又称为文本文件或字符文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称内部格式文件或字节文件,是把内存中的数据按其在内存中存储形式原样输出到磁盘中存储。

2、ASCII和二进制文件存储的区别

     对于字符信息,在内存中是以ASCII代码的形式存放的,因此,无论是用ASCII文件输出和用二进制文件输出,其数据形式是一样的。

    对于数值数据,两种存储方式不同,如整数100000,在内存中占用4个字节,按照内部格式(二进制文件),在磁盘文件中占用4个字节;如果按照ASCII存储,6个字符占用6个字节。

  • ASCII存储比较易于阅读,但是占用空间多,需要花费转换的时间
  • 二进制形式,不需要转换时间,但是不能直接显示文件中的内容。

3、文件流

       文件流是外存文件为输入输出对象的数据流,输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。文件流本身不是文件,而是以文件为输入输出对象的流。

4、与流类库有关的头文件

流类库中不同的类的声明被放在不同的头文件中,用户在自己程序中要用#include 指令包含有关的头文件。

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

strstream:用于字符串流IO。

3个用于文件操作的文件类:

ifstream类:从istream类派生的,用于支持从磁盘文件的输入。

ofstream类:从ostream类派生的,用于支持向磁盘文件的输出。

fstream类;从iostream类派生的,用于支持对磁盘文件的输入输出。

二、基本操作

1、文件的打开与关闭

打开文件是指在文件读写之前做必要的准备工作:

  • 为文件流对象和指定的磁盘文件建立关联
  • 指定文件的工作方式,如该文件是输入还是输出,是ASCII文件还是二进制文件。
#include <iostream>

ifstream file;//定义输出文件流类对象
//读文件
file.open("OriginalData2019-05-04-3.txt", ios::in);//以输入的方式打开文件
//写文件
file.open("OriginalData2019-05-04-3.txt", ios::out);//txt是一个输出文件,接收从内存输出的数据
file.open("OriginalData2019-05-04-3.txt", ios::app);//以输出的方式打开文件,写入的数据添加到文件末尾
file.open("OriginalData2019-05-04-3.txt", ios::binary);//以二进制方式打开文件,不指定则默认用ASCII方式打开
file.open("OriginalData2019-05-04-3.txt", ios::in|ios::out);//以输入和输出的方式打开文件
file.open("OriginalData2019-05-04-3.txt", ios::in|ios::binary);//以二进制的方式打开一个输入文件

关闭文件,关闭实际上是解除该磁盘文件与文件流的关联

file.close();

2、iostream头文件

iostream头文件包含了对输入输出流进行操作的基本信息。

(1)iostream头文件中的重载运算符

iostream头文件中有istream和ostream两种类,分别对<<和>>进行重载,称为流插入符。

cin >>a;//表示把输入流cin中的数据放入a中
cout << a;//表示从a中拿出数据放到输出流中

(2)标准输出流

标准输出流是流向标准输出设备(显示器)的数据,与读写文本文件无关。

ostream类定义了三个输出流对象,即cout,cerr,clog。

cout流对象(console output的缩写)

  • cout不是C++预定义的关键字,它是ostream流派生类的对象,在iostream头文件中定义。
  • 用cout和“<<”输出标准类型的数据时,由于系统已经定义,可以不必考虑数据是什么类型,系统会判断数据的类型并根据数据类型选择调用与之匹配的运算符重载函数。
  • cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不管缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流。如果只插入一个换行符“\n”则只是换行不刷新流。
cout<<'I'<<10<<'C++'<<f;

(3)标准输入流

cin是istream类的派生类的对象,它从标准输入设备中获取数据,程序中的变量通过流提取符“>>”从流中获取数据。

当流输入错误是输出0

3、对ASCII文件的操作

     对ASCII文件的读写操作有两种方法:

      (1)用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。

      (2)用put、get、getline等成员行数进行字符串的输入输出。

应用举例1:从键盘上输入10个整数,并将这10个整数存放到磁盘文件中。

#include <fstream> //fstream库包含了cout cin 
using namespace std;
int main()
{
  int a[10];
  ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件f1.dat
  if(!outfile) //文件打开失败
    {
        cerr<<"open error!"<<endl
    }
  cout<<"enter 10 integer number:"<<endl
  for(int i=0;i<10;i++)
    {
      cin>>a[i];//获取键盘上输入的数据
      outfile<<a[i]<<" ";//向磁盘文件输入数据,注意数据之间要有空格
    }
   outfile.close();//关闭磁盘文件
   return 0;
}

从磁盘文件中读取10个整数

#include <fstream>
using namespace std;
int main()
{
  int a[10];
  ifstream infile("f1.dat",ios::in|ios::nocreate);//ios::nocreate表示打开一个已有的文件,如果不存在则表示打开失败
  if(!infile)//打开文件失败
  {
    cerr<<"open error!"<<endl;
    exit(1);
  }
  for(i=0;i<10;i++)
  {
     infile>>a[i];//从文件中读取10个整数到数组中,注意此时不用考虑空格问题
     cout<<a[i]<<" ";//显示器上显示10个数
   }
   cout<<endl;
   infile.close();
   return 0;
}

4、对二进制文件的操作

对二进制文件的读写主要用istream类的成员函数read和write来实现的。

举例:将一批数据以二进制的形式存放到磁盘中。

#include <fstream>
using namespace std;
struct student
  {
   char name[20];
   int num;
   int age;
   char sex;
}
int main()
{
  student stud[3]={"li",1000,18,'m',"wang",1001,19,'m',"zhang",1002,18,'m',};
  ofsream 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]));//stud结构体数值中第一个元素是char型要进行强制转换成char型,第二个参数为输出字节数
  }
   outfile.close();//关闭文件
   return 0;
}

举例:读取上面的文件内容

#include <fstream>
using namespace std;
struct student
  {
   char name[20];
   int num;
   int age;
   char sex;
}
int main()
{
  student stud[3];
  ifsream infile("stud.dat",ios::binary);//以二进制的形式打开文件
  if(!outfile)
  {
    cerr<<"open error!"<<endl;
    abort();//文件打开失败,退出程序
  }
  for(int i=0;i<3;i++)
   {
     infile.read((char*)&stud[i],sizeof(stud[i]));
  }
   infile.close();//关闭文件
   return 0;
}

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值