编写一个在文件中查找某种服装的数量并返回的函数。
相关知识
文件流操作二进制文件的读写
写二进制文件
以文件流的方式操作文件一样可以支持二进制方式的块读写。
例如:
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;
}