文件操作

文件操作

文件基本概念

根据文件数据的编码方式不同可以分为:

  1. 文本文件
  2. 二进制文件

根据存取方式不同分为:

  1. 顺序存取文件,访问第i个数据,首先要访问第i-1个数据,例如:磁带
  2. 随机存取文件,例如:磁盘

文件的基本操作:

  1. 读文件
  2. 写文件

C++ 文件流类

C++ 标准库中有3个流类可以用于文件操作,分别为:

  1. ifstream,读文件
  2. ofstream,写文件
  3. fstream,可读、可写

引入以上3个文件流时,需要引入 fstream 头文件,即:#include

程序中使用一个文件,必须包含3个基本步骤:

  1. 打开文件(open)
  2. 操作文件
  3. 关闭文件(close)

打开和关闭文件

先建立流对象,然后调用 open() 函数连接外部文件。格式如下:

流类名 对象名;
对象名.open(文件路径, 模式);

调用流类带参数的构造函数,再建立流对象的同时连接外部文件。格式如下:

流类名 对象名(文件路径, 模式);

打开、关闭文件

使用 open() 函数 打开文件

流类名 对象名;
对象名.open(文件路径, 模式);
模式标记 适用对象 作用
ios::in ifstream fstream 以读方式打开文件。文件不存在,则抛错
ios::out ofstream fstream 以写方式打开文件。文件不存在,则新建文件;文件存在,则打开并清空文件内容
ios::app ofstream 以追加方式打开文件,用于在文件尾部添加数据。如果文件不存在,则新建文件
ios::ate ofstream 打开一个已有的文件,并将文件读指针指向文件末尾。文件不存在,抛错
ios::trunc ofstream 删除文件现有内容
ios::binary ifstream ofstream fstream 以二进制模式打开文件
ios::in | ios::out fstream 打开已存在文件,可读可写,不清空文件内容。文件不存在,抛错
ios::in | ios::out ofstream 打开已存在文件,可写,不清空文件内容。文件不存在,抛错
ios::in | ios::out | ios::trunc fstream 打开已存在文件,可读可写,清空文件内容。文件不存在,抛错

使用 close() 函数 关闭文件

流类名 对象名;
对象名.open(文件路径, 模式);
对象名.close();

示例代码:

#include
#include
using namespace std;

void main
{
  ifstream inFile;
  // 打开当前目录下的 data.txt 文件
  inFile.open("data.txt", ios::in);
  if (inFile)
  {
    inFile.close();
  }

  ofstream outFile;
  // 打开指定路径的文件,这里的 newfile 没有尾缀,意味着为二进制文件
  outFile.open("c:\\c2019\\newfile", ios::out | ios::binary);
  if (outFile)
  {
    outFile.close();
  }
};

文件读写操作

写操作

#include
#include
using namespace std;

int main
{
  ofstream outFile;
  outFile.open("score.txt", ios::out);
  if (!outFile)
  {
    cout << "创建文件失败" << endl;
    return 0;
  }

  char id[11], name[21];
  int score;

  cout << "请输入:学号 姓名 成绩 (以 Ctrl + Z 结束输入)" << endl;

  while (cin >> id >> name >> score)
  {
    outFile << id << " " << name << " " << score << endl;
  }
  outFile.close();

  return 0;
};

读操作

#include
#include
#include
using namespace std;

int main
{
  ifstream inFile;
  inFile.open("score.txt", ios::in);
  if (!inFile)
  {
    cout << "打开文件失败" << endl;
    return 0;
  }

  char id[11], name[21];
  int score;

  while (inFile >> id >> name >> score)
  {
    cout << left << setw(10) << id << " " << setw(20) << name << " " << right << setw(3) << score << endl;
  }
  inFile.close();

  return 0;
};

写二进制文件(.dat)

该成员函数将村中中 buffer 所指向的 nCount 个字节的内容写入文件,格式如下:

ostream & write(char * buffer, int nCount)

示例代码:

#include
#include
using namespace std;

class CStudent
{
  public:
    char id[11];
    char name[21];
    int score;
}

int main()
{
  ofstream outFile("students.dat", ios::out | ios::brinary);
  if (!outFile)
  {
    cout << "创建文件失败" << endl;
    return 0;
  }

  CStudent stu;

  cout << "请输入:学号 姓名 成绩 (以 Ctrl + Z 结束输入)" << endl;

  while (cin >> stu.id >> stu.name >> stu.score)
  {
    outFile.write((char *)&stu, sizeof(stu));
  }
  outFile.close();
  return 0;
}

读二进制文件(.dat)

从文件中读取 nCount 个字节的内容,存放到 buffer 所指向的内存缓冲区中,格式如下:

ostream & read(char * buffer, int Count);

使用 ostream::gcount() 成员函数得到读取的字节数

成员函数 get() 读文件

int get()

不带参数的 get() 函数从指定的输入流中提取一个字符(包含空白字符)。

函数的返回值即为该字符。

当遇到文件结束符时,返回系统常量EOF。

istream & get(char & rch)

从指定输入流中提取一个字符(包含空白字符),将该字符作为 rch 引用的对象。

当遇到文件结束符时,函数返回0;否则返回对 istream 对象的引用。

istream & get(char * pch, int Count, char delim = ' \n')

从流的当前字符开始,读取 nCount-1 个字符,或遇到指定的分隔符 delim 结束。

函数把读取的字符(不包含分隔符)写入数组 pch 中,并在字符串后添加结束字符 '\0'。

成员函数 put() 写文件

向输出流中插入一个字节,格式如下:

ostream & put(char ch);

文本文件和二进制文件的异同

功能 文本文件 二进制文件
存储数据格式 文本 二进制
存储数据是否需要转换
是否支持随机访问

通过纯本文信息(如字符串)以文本形式存储,而将数值信息以二进制文件形式存储。

随机访问文件

顺序文件

文件只能进行顺序存取操作,例如:键盘、显示器、保存在磁带上的文件

随机文件

可以在文件的任意位置进行存取操作,例如:磁盘文件

移动读指针函数

将读指针设置为 pos,即将读指针移动到文件的 pos 字节处,格式如下:

istream & seekg(long pos);

将读指针按照 seek_dir 的指示(方向)移动 offset 个字节,其中 seek_dir 是在类 ios 中定义的一个枚举类型,格式如下:

istream & seekg(long offset, ios::seek_dir dir);

返回读指针当前的位置,格式如下:

long tellg();

移动写指针函数

将写指针设置为 pos,即将写指针移动到文件的 pos 字节处。格式如下:

istream & seekp(long pos);

将写指针按照 seek_dir 的指示(方向)移动 offset 个字节,其中 seek_dir 是在类 ios 中定义的一个枚举类型。格式如下:

istream & seekp(long offset, ios::seek_dir dir)

返回写指针当前的位置。格式如下:

long tellp();

你可能感兴趣的:(文件操作)