使用文件流操作文本文件(文件实训)

编写一个统计本月服装的销售情况的函数。

相关知识

文件流操作文件

C 还可以使用文件流的方式操作文件,使用文件流的方式操作文件需要包含头文件,代码如下:

#include <fstream>

头文件中定义了三个类:类 fstream、类 ifstream 和类 ofstream。

  1. 类 ifstream 实现文件的输入
  2. 类 ofstream 实现文件的输出
  3. 类 fstream 实现文件的输入输出

使用文件流操作文件依然可以分为三个步骤:打开文件读写文件关闭文件
打开文件
打开文件用于读时可以使用类 fstream 或者 ifstream 函数。

ifstream 函数
ifstream inFile("test.txt", ios::in);
  1. inFile 是声明的 ifstream 的一个对象(也可以叫变量,只是这个变量里面包含的东西较多,类似于结构变量),声明该对象时会自动执行一个特殊的函数(构造函数,学习面向对象部分的时候会了解)。
  2. test.txt和 ios::in 是传递给该函数的参数。test.txt是要打开的路径和文件名,ios::in 是文件打开的方式,表示打开文件用于输入。
  3. 执行该函数将会以读的方式打开当前目录下的文件test.txt。之后通过 inFile 调用一些函数就可以操作文件test.txt了。
fstream 函数

由于类 fstream 也可以打开文件用于输入,上面的语句也可以这样写:

fstream inFile("test.txt", ios::in);

类 fstream 的文件打开方式有:

打开方式 描述
ios::in 打开一个供读取的文件
ios::out 打开一个供写入的文件
ios::app 写入的所有数据将被追加到文件的末尾,此方式需要使用 ios::out
ios::ate 写入的数据将追加到文件的末尾,但也可写到其他地方,此方式不需要用 ios::out
ios::trunc 废弃当前文件内容
ios::nocreate 如果要打开的文件并不存在,那么以此参数调用 open 函数将无法进行
ios::noreplace 如果要打开的文件已存在,试图用 open 函数打开时将返回一个错误
ios::binary 以二进制的形式打开一个文件

其中适合于文件读的打开方式也可以用于类 ifstream ,适合于文件写的打开方式也可以用于 ofstream,ios::binary 两者都可以用。

读写文件

文件的读取
如果以文本的方式操作文件(没有属性 ios::binary ),则读文件的语法和用 cin 从键盘输入的语法很像。例如下面的语句可以从文件test.txt中读取一个整数和一个浮点数。

int n;
float f;
inFile >> n >> f;

文件的写入
文件的写入也和输出到屏幕的语法很像。
例如下面的程序将整数100浮点数3.14入文件a.txt。

// 声明对象ofile,以读的方式打开文件a.txt
ofstream ofile("a.txt", ios::out);
// 将100、空格、3.14、换行符写入文件a.txt
ofile << 100 << " " << 3.14 << endl;
// 关闭文件
ofile.close();

文件关闭
文件的关闭不管是 ifstream、ofstream 还是 fstream 的对象,都可以使用相同的语法关闭文件,即xx.close();。

//test.cpp
#include <iostream>
#include <fstream>
using namespace std;
//声明外部函数,函数count在其它源文件中实现
extern void count(ifstream & fin, ofstream & fout);
int main()
{
 char s[100];
 int n, i, num, p[100],k;
 //准备文件
 ofstream cloth("cloth.txt");
 cin>>n; //输入服装种类数量
 for(i=0;i<n;i++)
 {
  cin>>s; //输入服装编号
  cin>>num; //输入该服装销售数量
  for(k=0;k<num;k++)
  {
   cin>>p[k]; //输入每件服装的销售价格
  }
  //写入文件
  cloth<<s<<" "<<num;
  for(k=0;k<num;k++)
  {
   cloth<<" "<<p[k];
  }
 }
 //关闭文件
 cloth.close();
 //打开销售文件
 ifstream fin("cloth.txt");
 //打开统计文件
 ofstream fout("count.txt");
 //调用函数count
 count(fin,fout);
 //关闭文件
 fin.close();
 fout.close();
 //读出统计信息并输出
 ifstream f("count.txt");
 f>>s;
 while(!f.eof())
 {
  f>>n;
  cout<<s<<" "<<n<<endl;
  f>>s;
 }
 f.close();
 return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
/*
  函数count:统计文件fin中每种服装的销售总额,并写入文件fout中
  参数fin:文件每种服装的销售情况,fout:每种服装销售总额的写入文件
  返回值:无
  说明:文件fin中,每种服装信息占一行,分别为服装编号,销售件数,每件的销售价格(整型)。
  文件fout:每种服装统计信息占一行,分别为服装编号,销售总额(整型),中间用一个空格隔开。
*/
void count(ifstream & fin, ofstream & fout)
{
    char s[100];
    fin>>s;
    while(!fin.eof())
    {
        int i,n,c=0,t;
        fin>>n;
        for(i=0;i<n;i++)
        {
            fin>>t;
            c+=t;
        }
        fout<<s<<" "<<c<<endl;
        fin>>s;
    }
}
原创文章 291 获赞 256 访问量 2万+

猜你喜欢

转载自blog.csdn.net/huangziguang/article/details/105853220