【Educoder作业】C&C++文件实训
拖了很久了,主要是当时没有完全理解
整个文件实训和之前的区别就在于,处理问题的时候我们的数据是存到了文件里或者我们希望把输出放到文件里。所以只需要解决文件输入和文件输出的问题即可。四个关卡相当于不同的手段,大同小异。
T1 使用FILE结构操作文本文件
这个题貌似会被奇奇怪怪的方式卡掉
我们希望写一个 G e t c h a r Getchar Getchar函数来表示从文件里读出来一个有效字符,这样的话后续处理就很简单。需要注意的是,文件的末尾是 E O F EOF EOF。
#include <stdio.h>
// 函数extractDigit的功能:从文件a.txt中提取数值写入文件b.txt中
void extractDigit();
// 请在此添加代码,实现extractDigit函数
/********** Begin *********/
char Getchar(FILE *f) {
char c = fgetc(f);
if (c == EOF) return EOF;
while (c < '0' || c > '9') {
c = fgetc(f);
if (c == EOF) return EOF;
}
return c;
}
void extractDigit() {
FILE *fi = fopen("a.txt", "r");
FILE *fo = fopen("b.txt", "w");
if (fi == NULL || fo == NULL) return;
char c = Getchar(fi);
int mdl = 0, cnt = 0;
while (c != EOF) {
(mdl *= 10) += (c - '0');
cnt ++ ;
if (cnt == 3) {
// printf("%d\n", mdl);
fprintf(fo, "%d ", mdl);
mdl = 0, cnt = 0;
}
c = Getchar(fi);
}
if (cnt) fprintf(fo, "%d ", mdl);
fclose(fi);
fclose(fo);
}
/********** End **********/
T2 使用FILE结构操作二进制文件
这就是新的读取方式,用二进制打开文件,这样就可以根据位数用 f r e a d fread fread读取了。
#include <stdio.h>
// 结构clothing
struct clothing {
char label[12]; // 编号
float price; // 价格
};
/*
函数readClothing:从文件fp中读取服装信息到cloth中
参数fp:指向打开的二进制文件,cloth:存放读出的服装信息
返回值:服装信息数量
说明:文件中首先以二进制方式存入了一个整数(服装信息数n),然后以二进制方式存入n种服装信息(clothing类型)
*/
int readClothing(FILE *fp, clothing cloth[])
{
// 请在此添加代码,补全函数readClothing
/********** Begin *********/
int n;
fread(&n, sizeof(n), 1, fp);
fread(cloth, sizeof(clothing), n, fp);
return n;
/********** End **********/
}
T3 使用文件流操作文本文件
这关给我们介绍了流的方式,很简单很便捷。
注意一下 w h i l e while while的判断条件就行。
#include <iostream>
#include <fstream>
using namespace std;
/*
函数count:统计文件fin中每种服装的销售总额,并写入文件fout中
参数fin:文件每种服装的销售情况,fout:每种服装销售总额的写入文件
返回值:无
说明:文件fin中,每种服装信息占一行,分别为服装编号,销售件数,每件的销售价格(整型)。
文件fout:每种服装统计信息占一行,分别为服装编号,销售总额(整型),中间用一个空格隔开。
*/
void count(ifstream & fin, ofstream & fout)
{
// 请在此添加代码,补全函数count
/********** Begin *********/
char s[12];
fin >> s;
while (!fin.eof()) {
int m, sum = 0;
fin >> m ;
for (int j = 0; j < m; j ++ ) {
int x; fin >> x ; sum += x;
}
fout << s << ' ' << sum << endl ;
fin >> s ;
}
/********** End **********/
}
T4 使用文件流操作二进制文件
第四关之于第三关,就像第二关之于第一关。相当于在一种输入方式的基础上给二进制的方式。可以做到按位输入,在某些特定的题里会有用的。
#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)
{
// 请在此添加代码,补全函数getNumber
/********** Begin *********/
clothing a;
ifile.read((char*)&a, sizeof(clothing));
while (!ifile.eof()) {
if (strcmp(label, a.label) == 0) return a.numberRemaining;
ifile.read((char*)&a, sizeof(clothing));
}
return 0;
/********** End **********/
}