欣乐

The eagles are coming!

导航

复赛注意事项:关于文件读写的格式

 

无论小学复赛,还是初中、高中的noip复赛,都必须注意这个问题。
如果在代码中,书写格式错误,或者写了具体的文件路径,测试成绩必为0分。
所以请参加复赛的同学,一定要注意这个问题。否则做对了,还0分,太冤了。

以一个题目为例。例子见:
http://cojs.tk/cogs/problem/problem.php?pid=1

加法问题
输入文件:aplusb.in   输出文件:aplusb.out
时间限制:1 s   内存限制:12 MB

这是一个经典的入门问题,通过此问题,你可以学会如何使用该评测系统。

【问题描述】
现在有两个实数,分别是A和B。请你从文件中读取A和B,计算它们的和A+B,并把它输出到文件中。(保留到整数)
【输入格式】
第一行:一个实数A
第二行:一个实数B
【输出格式】
第一行:一个整数C = A+B
【输入样例】
1
2
【输出样例】
3

一、Pascal
针对以上例子,提交的正确格式是:

 1 program aplusb(input,output);
 2 var a,b:real;
 3 begin
 4   Assign(input, 'aplusb.in'); Reset(input); //输入文件与标准输入流关联,并重定向
 5   Assign(output, 'aplusb.out'); Rewrite(output); //输出文件与标准输出流关联,并重定向
 6   //
 7   readln(a);
 8   readln(b);
 9   writeln(a+b:0:0);
10   //
11   Close(input); Close(output); //最后别忘了关闭关联(文件)。
12 end.


所以,在考试之前的半小时左右时间内,就可以默写如下代码在记事本中,准备应用:

 1 program xxx(input,output);
 2 var i,j:longint;
 3 begin
 4   //Assign(input, 'xxx.in'); Reset(input);
 5   //Assign(output, 'xxx.out'); Rewrite(output);
 6   //
 7   //...
 8   //
 9   //Close(input); Close(output);
10 end.


然后在考试时,编写代码时,进行调试的时候,还是键盘输入,屏幕输出。
编写代码,测试完成后,在提交时,把三处出现的“xxx”,修改为具体题目规定的名称。
特别注意:输入、输出的文件名之前,不能写上路径。否则就是0分。
再把begin后的第一、二行,及end前的一行,之前的注释符号“//”删除掉。
然后再把文件保存在指定的目录中。


二、C/C++
针对以上例子,提交的正确格式是:

 1 #include <stdio.h>
 2 int main()
 3 {  
 4     float i,j;
 5     freopen("aplusb.in", "r", stdin);   //输入文件直接与标准输入流关联
 6     freopen("aplusb.out", "w", stdout); //输出文件直接与标准输出流关联
 7     scanf("%f%f", &i, &j); //接下来,是对标准输入、输出流操作,就是说已经重定向
 8     //
 9     printf("%0.0lf\n", i+j); //所以不必对具体文件操作,不用在前面加f了
10     fclose(stdin); fclose(stdout);
11 } 


当然还有其它格式,比如:

 1 #include<stdio.h>
 2 int main()
 3 {
 4   float a,b;
 5   FILE *f;
 6 
 7   f=fopen("aplusb.in","r");
 8   fscanf(f,"%f%f",&a,&b);
 9   fclose(f);
10 
11   f=fopen("aplusb.out","wb");
12   fprintf(f,"%0.0lf",a+b,"\n");
13   fclose(f);
14   return 0;
15 }
View Code


又比如:

 1 #include <stdio.h>
 2 int main()
 3 {
 4   float i,j;
 5   FILE *fp1, *fp2; //FILE 在stdio.h中有声明
 6   fp1 = fopen("aplusb.in","r");  //打开输入文件,用来读
 7   fp2 = fopen("aplusb.out","w"); //打开输出文件,用来写
 8   fscanf(fp1,"%f%f", &i, &j); //前面加f,从输入文件中读取
 9   //
10   fprintf(fp2,"%0.0lf\n", i+j); //printf -> fprintf 在输出文件中写入
11   fclose(fp1); fclose(fp2); //这行据说省掉也没关系,不过最好不要省
12   return 0;
13 }
View Code


这样都是可以的。但是,是第一种最方便。

所以在开考之前,先默写以下代码在记事本中:

 1 #include <stdio.h>
 2 int main()
 3 {  
 4   int i,j;
 5   //freopen("xxx.in", "r", stdin);
 6   //freopen("xxx.out", "w", stdout);
 7  
 8   //...
 9  
10   //fclose(stdin); fclose(stdout);
11 }


然后调试代码时,一如我们平时做的那样,键盘输入,屏幕输出。
调试完成后,提交前,把两处“xxx”,修改为题目规定的文件名。
特别注意:输入、输出的文件名之前,不能写上路径。否则就是0分。
把相应的注释符号“//”删除掉。
再把文件保存到规定的目录下。


每年有菜鸟不清楚这个写法而得0分的。希望同学们注意这个格式问题。
那为什么不能写上路径?
因为在测试的时候,程序针对输入文件读取数据,再把输出文件中的数据与标准的答案数据进行比较,从而产生分数。
你如果写上路径,那程序就从具体路径中去读取文件数据,而这个具体路径中木有这个输入文件,那你就惨了。。。

 

 

 

 

 

 

 

Top


posted on 2014-10-23 17:10  欣乐  阅读(472)  评论(3编辑  收藏  举报