使用文件流操作二进制文件(文件实训)

编写一个在文件中查找某种服装的数量并返回的函数。

相关知识

文件流操作二进制文件的读写

写二进制文件

以文件流的方式操作文件一样可以支持二进制方式的块读写。
例如:

ofstream cl("c.dat", ios::binary);
int n = 10;
cl.write((char*)&t,sizeof(t));

第一行程序申明了 ofstream 的对象 cl,并以二进制方式( ios::binary )打开文件c.dat(如果文件c.dat不存在,会先创建)用于输出( fstream 的对象的对象都是用于文件输出)。
第三行则将整数 t 以块写入的方式写入文件c.dat。函数 write 的第一个参数是要写入文件的数据首地址,必须是char*类型,要写入的数据是 t,所以该实参为&t,并进行了类型转换。第二个参数是要写入文件的字节数,t 整型变量,所占字节数可以用sizeof(t)求得。

读二进制文件

二进制的块读出方式和块写入方式类似。
例如下面的程序可以将写到文件c.dat中的整数读出:

ifstream fl("c.dat", ios::binary);
int n;
fl.read((char*)&n,sizeof(n));

第一行程序申明 ifstream 的对象 fl ,并以二进制方式打开文件c.dat用于读。
第三行从文件中读出一个整数。read 函数的第一个参数是读出的数据要放到内存中的位置,类型为char*。读出的整数要赋值给 n,所以该实参为&n,并进行了类型转换。第二个参数是读出的字节数,一个整数的字节数可以用sizeof(n)求得。

//test.cpp
#include <iostream>
#include <fstream>
using namespace std;
//结构clothing
struct clothing 
{
 char label[12]; //编号
 int numberRemaining; //剩余件数
};
//声明外部函数,函数getNumber在其它源文件中实现
extern int getNumber(ifstream &ifile, char *label);
int main()
{
 int n,i;
 char le[100];
 clothing t;
 //准备文件
 //打开文件,二进制方式
 ofstream cloth("cloth.dat", ios::binary);
 cin>>n; //输入服装种类数量
 for(i=0;i<n;i++)
 {
  cin>>t.label; //输入服装编号
  cin>>t.numberRemaining; //输入服装剩余数量
  //写入文件
  cloth.write((char*)&t,sizeof(t));
 }
 //关闭文件
 cloth.close();
 //打开文件用于读,二进制方式
 ifstream fin("cloth.dat",ios::binary);
 //输入要查找的服装标签
 cin>>le;
 //调用函数getNumber
 n = getNumber(fin,le);
 //输出服装件数
 cout<<n<<endl;
 //关闭文件
 fin.close();
 return 0;
}
//streambin.cpp
#include <fstream>
#include <string.h>
#include <iostream>
using namespace std;
// 结构clothing
struct clothing 
{
    char label[12];  // 编号
    int numberRemaining;  // 剩余件数
};
/*
  函数getNumber:在文件ifile中查找标签为lable的服装数量
  参数ifile:存放服装信息的文件,label:要查找的服装标签
  返回值:标签为label的服装数量
  说明:文件中ifile中存放着服装信息,服装信息为以二进制写入的一个个clothing结构变量
*/
int getNumber(ifstream &ifile, char *label)
{
    clothing  t;
    // 读出种服装信息到t中
    ifile.read((char*)&t,sizeof(clothing));
    while(!ifile.eof())
    {
        if(strcmp(label, t.label)==0)
        {
            return t.numberRemaining;
  	}
        ifile.read((char*)&t,sizeof(clothing));
    }
    return 0;
}
原创文章 290 获赞 255 访问量 2万+

猜你喜欢

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