复赛注意事项:关于文件读写的格式
无论小学复赛,还是初中、高中的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 }
又比如:
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 }
这样都是可以的。但是,是第一种最方便。
所以在开考之前,先默写以下代码在记事本中:
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分的。希望同学们注意这个格式问题。
那为什么不能写上路径?
因为在测试的时候,程序针对输入文件读取数据,再把输出文件中的数据与标准的答案数据进行比较,从而产生分数。
你如果写上路径,那程序就从具体路径中去读取文件数据,而这个具体路径中木有这个输入文件,那你就惨了。。。