“蓝桥杯”基础知识(三)——文件操作
1.文件操作
在程序中经常会遇到需要读取的数据量比较大的情况,如果用键盘输入,则输入时间较长,这时就需要用到文件操作了。
常用的文件操作分成以下四步:打开文件;判断文件是否打开成功;读取(写入)文件;关闭文件。例如:
/*打开文件C语言的操作 */
FILE *fp;
fp= fopen("D:\test.txt","r");
if ( fp== NULL)
printf("fail to open! \n");
例1:打开文件test.txt 按字符读出文本内容,并显示到屏幕。
#include <iostream>
using namespace std;
int main()
{
FILE *fp; //文件指针
char ch;
fp= fopen("test.txt","r"); //读文件
if ( fp== NULL) //文件不存在
printf("fail to open! \n");
//一个字符一个字符的读
while(!feof(fp)) //文件没有读完
printf("%c",fgetc(fp));
/*等价于以上代码
while((ch=fgetc(fp))!=EOF)
putchar(ch); */
fclose(fp);//关闭文件
return 0;
}
第二种方式:打开文件test.txt,每次读文本文件中的1行内容,并显示到屏幕。
#include <iostream>
using namespace std;
int main()
{
FILE *fp; //文件指针
char str[100];
fp= fopen("test.txt","r"); //读文件
if ( fp== NULL) //文件不存在
printf("fail to open! \n");
//一次读一行
while(!feof(fp)) //文件没有读完
{
fgets(str,100,fp);
printf("%s",str);
};
fclose(fp);//关闭文件
return 0;
}
/*打开文件C++语言的操作 */
例1的Cpp实现——打开文件test.txt 按字符读出文本内容,并显示到屏幕。
#include <iostream>
#include <fstream> //文件操作
using namespace std;
int main()
{
fstream infile; //文件流对象
infile.open("test.txt",ios::in); //读文件
if ( !infile) //打开文件失败
{
cout<<"test.txt can't open! \n";
abort();
}
char ch; //字符
while(infile.get(ch)) //文件没有读完
cout<<ch;
infile.close(); //关闭文件
return 0;
}
第二种方式:打开文件test.txt,每次读文本文件中的1行内容,并显示到屏幕。
#include <iostream>
#include <fstream> //文件操作
using namespace std;
int main()
{
fstream infile; //文件流对象
infile.open("test.txt",ios::in); //读文件
if ( !infile) //打开文件失败
{
cout<<"test.txt can't open! \n";
abort();
}
char str[50]; //字符串
while(!infile.eof()) //文件没有读完
{
infile.getline(str,sizeof(str)); //把1行读入字符数组str;
cout<<str<<endl;
};
infile.close();//关闭文件
return 0;
}
文件重定向技术
由于在竞赛中往往只需要从文件中读入程序数据即可、因此为了简化读入过程,读取文件数据最常用的方法就是文件重定向技术。常用的方式是使用fropen()函数.其声明为:
FILE * freopen(const char " filename,const char * mode,FIlE * stream);
文件重定向技术的使用方法如下:
//将输入重定向到文件
//后面的输入语句为直接到文件中读取数据
freopen("input.txt", "r", stdin);
//将输出重定向到文件
//后面的输出语句为直接将数据输出到文件中
freopen ("output.txt", "w", stdout);
//从文件中读取数据并存入变量
int a,b;
scanf("%d%d",&a, &b);
printf("%d\n",a+b);
//关闭文件
fclose(stdin) ;
fclose (stdout) ;
例如:score.txt是某班学生三门课的成绩,输出所有同学的总分。
文本内容如下:
95 96 90
100 80 67
60 80 89
67 90 78
78 99 56
78 90 97
66 100 50
44 100 98
90 60 78
56 76 94
代码如下:
#include <iostream>
using namespace std;
int main()
{
int score1,score2,score3;
freopen("score.txt","r",stdin);
while(cin>>score1>>score2>>score3)
{
cout<<score1+score2+score3<<endl;
}
return 0;
}
输出结果如图1所示:

3 真题案例——购物单(2017年试题A)(本次练习,答案下期见)
【题目描述】 小明刚刚找到工作,老板为人很好,只是老板夫人很爱购物。老板忙的时候,老板夫人经常让小明帮她到商场代为购物。小明很厌烦,但又不好推辞。
这不,XX大促销又来了!老板夫人开出了长长的购物单,上面都是有打折优惠的商品。
小明也有个怪癖:不到万不得已,他从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,他需要从取款机上取多少现金才能搞定这次购物。
取款机只提供100元面额的纸币。小明想尽可能少地取现金,够用就行了。
你的任务是计算出小明最少需要取多少现金。
以下是让人头疼的购物单,为了保护隐私,商品名称被隐藏了。180.90 88 折
10.25 65折
56.14 9折
104.65 9折
100.30 88折
297.15 半价
26.75 65折
130.62 半价
240.28 58折
270.62 8折
115.87 88折
247.34 95折
73.21 9折
101.00 半价
79.54 半价
278.44 7折
199.26 半价
12.97 9折
166.30 78折
125.50 58折
84.98 9折
113.35 68折
166.57 半价
42.56 9折
81.90 95折
131.78 8折
255.89 78折
109.17 9折
146.69 68折
139.33 65折
141.16 78折
154.74 8折
59.42 8折
85.44 68折
293.70 88折
261.79 65折
11.30 88折
268.27 58折
128.29 88折
251.03 8折
208.39 75折
128.88 75折
62.06 9折
225.87 75折
12.89 75折
34.28 75折
62.16 58折
129.12 半价
218.37 半价
289.69 8折
提示:这里利用了C++中的文件读取技术:文件重定向。
将上述商品单价及折扣做数据处理,存入total.txt文件中,文件内容如下:
180.90 88
10.25 65
56.14 9
104.65 9
100.30 88
297.15 5
26.75 65
130.62 5
240.28 58
270.62 8
115.87 88
247.34 95
73.21 9
101.00 5
79.54 5
278.44 7
199.26 5
12.97 9
166.30 78
125.50 58
84.98 9
113.35 68
166.57 5
42.56 9
81.90 95
131.78 8
255. 89 78
109.17 9
146.69 68
139.33 65
141.16 78
154.74 8
59.42 8
85.44 68
293.70 88
261.79 65
11.30 88
268.27 58
128.29 88
251.03 8
208.39 75
128.88 75
62.06 9
225.87 75
12.89 75
34.28 75
62.16 58
129.12 5
218.37 5
289.69 8
4.上篇文章中练习题目及参考答案:
[问题描述] 汉字的字形存在于字库中,即便是在今天,16点阵的字库也仍然使用广泛。
16点阵的字库把每个汉字看成16X16个像素信息,并把这些信息记录在字节中。
1字节可以存储8位信息,用32字节就可以存储一个汉字的字形了。
把每个字节转换为进制表示,1 表示墨迹,0表示底色,每行2字节,一 共16行,布局如下。
1 第1字节,第2字节 2 第3字节,第4字节
……
16第31字节,第32字节
这道题目给了考生一段由多个汉字组成的信息,每个汉字用32字节表示,这里给出了字节作为有符号整数的值。
题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,并根据要求填写答案。
这段信息是(一共10个汉字): 4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4
4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64
16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128 0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0
2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0 1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0
0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0
【参考程序1】 ——申茂生同学,通过给数组符初值
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<8> t[10][32]=
{
{4,0,4,0,4,0,4,32,-1,-16,4,32,4,32,4,32,4,32,4,32,8,32,8,32,16,34,16,34,32,30,-64,0},
{16,64,16,64,34,68,127,126,66,-124,67,4,66,4,66,-124,126,100,66,36,66,4,66,4,66,4,126,4,66,40,0,16},
{4,0,4,0,4,0,4,32,-1,-16,4,32,4,32,4,32,4,32,4,32,8,32,8,32,16,34,16,34,32,30,-64,0},
{0,-128,64,-128,48,-128,17,8,1,-4,2,8,8,80,16,64,32,64,-32,64,32,-96,32,-96,33,16,34,8,36,14,40,4},
{4,0,3,0,1,0,0,4,-1,-2,4,0,4,16,7,-8,4,16,4,16,4,16,8,16,8,16,16,16,32,-96,64,64},
{16,64,20,72,62,-4,73,32,5,16,1,0,63,-8,1,0,-1,-2,0,64,0,80,63,-8,8,64,4,64,1,64,0,-128},
{0,16,63,-8,1,0,1,0,1,0,1,4,-1,-2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,2,0},
{2,0,2,0,7,-16,8,32,24,64,37,-128,2,-128,12,-128,113,-4,2,8,12,16,18,32,33,-64,1,0,14,0,112,0},
{1,0,1,0,1,0,9,32,9,16,17,12,17,4,33,16,65,16,1,32,1,64,0,-128,1,0,2,0,12,0,112,0},
{0,0,0,0,7,-16,24,24,48,12,56,12,0,56,0,-32,0,-64,0,-128,0,0,0,0,1,-128,3,-64,1,-128,0,0}
};
for(int i=0;i<10;i++)
{
for(int j=0;j<32;j++)
{
cout<<t[i][j];
if(j%2)
cout<<endl;
}
cout<<endl;
}
int a=1;
for(int i=0;i<9;i++)
{
a*=9;
}
cout<<"九的九次方是"<<a;
}
【参考程序2】 ——吴炳毅同学,通过键盘输入数据(略有差异)
#include <iostream>
#include<bitset>
using namespace std;
int main() {
bitset<8> a[10][32];
int n; //临时变量用于存放从键盘输入的数据
for(int i=0;i<10;i++){
for(int j=0;j<32;j++){
cin>>n;
a[i][j]=n;
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<32;j++){
cout<<a[i][j];
if(j%2!=0)cout<<endl;
}
}
}

添加 家长论坛微信
全部 0条评论