700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用文件进行输入输出的两种方式(算法竞赛入门经典第2章)

使用文件进行输入输出的两种方式(算法竞赛入门经典第2章)

时间:2023-10-05 15:39:36

相关推荐

使用文件进行输入输出的两种方式(算法竞赛入门经典第2章)

使用文件进行输入输出的两种方式:

1, 重定向

freopen("input.txt", "r", stdin);

freopen("output.txt", "w", stdout);

上述语句将使得scanf从文件input.txt读入,printf写入文件output.txt。事实上,不只是scanf和printf,所有读键盘输入、写屏幕输出的函数都将改用文件。

2, fopen

文件输入输出:输入输出重定向;fopen。标准输入输出:(也称标准I/O,即直接读键盘、写屏幕)。

{算法竞赛入门经典}第二章 文件操作 重定向及fopen版本

1, 从代码上看,重定向方法写起来简单,fopen稍显复杂,但实际上两者都是固定的语句。

2, 从灵活性看,只要用重定向方法,就全部是用文件读写,不能再进行常规的标准输入输出。而fopen较灵活,可以同时读写文件、标准输入输出(只要分别用fscanf,fprintf和scanf,printf就能共存,灵活性更强)。

3, 从代码特点上看:

a) 重定向方法需要注意#ifdef与#endif符号定义,从而从文件读写转换为标准输入输出读写比较方便。

b) fopen则需要注意要定义FILE*文件指针,利用fopen打开文件,同时特别需要注意的是使用完毕后要使用fclose关闭文件指针,从文件读写改为标准输入输出需赋值fin=stdin;fout=stdout;同时将注释掉fopen和fclose,修改稍显复杂。

重定向版本并不算严格意义上的文件操作(没有定义文件指针及没有用文件操作函数)

1,重定向版:

#include<stdio.h>#define INF 1000000000#define LOCALint main(){#ifdef LOCALfreopen("data.in","r",stdin);freopen("data.out","w",stdout);#endifint x,n=0,min,max,s=0;while(scanf("%d",&x)==1){s+=x;if(x<min) min=x;if(x>max) max=x;n++;/*printf("x = %d, min = %d, max = %d\n", x, min, max);*/}printf("%d %d %.3f\n",min,max,(double)s/n);return 0;}

(1)重定向的部分被写在了#ifdef和#endif中。 其含义是:只有定义了符号LOCAL,才编译两条freopen语句。

(2)输出中间结果的printf语句写在了注释中——它在最后版本的程序中不应该出现,但是又舍不得删除它(万一发现了新的bug,需要再次用它输出中间信息)。 将其注释的好处是:一旦需要时,把注释符去掉即可。

上面的代码在程序首部就定义了符号LOCAL,因此在本机测试时使用重定向方式读写文件。

注意,注意啊,如果用重定向,一定要绝对路径!用VC6或者CodeBlocks调试的时候程序运行目录不是程序的生成目录!不写绝对路径,就没有输入,程序调试时就卡在输入上了!!!还有,是两条反斜杠,两条,不是一条!!!

#ifdef LOCAL

freopen("D://input.txt","r",stdin);

freopen("D://ouput.txt","w",stdout);

#endif

2,fopen版

#include<stdio.h>#define INF 1000000000int main(){FILE *fin, *fout;fin = fopen("data.in", "rb");fout = fopen("data.out", "wb");int x, n = 0, min = INF, max = -INF, s = 0;while(fscanf(fin, "%d", &x) == 1){s += x;if(x < min) min = x;if(x > max) max = x;n++;}fprintf(fout, "%d %d %.3f\n", min, max, (double)s/n);fclose(fin);fclose(fout);return 0;}

虽然新内容不少,但也很直观:先声明变量fin和fout(暂且不用考虑FILE*),把scanf改成fscanf,第一个参数为fin;把printf改成fprintf,第一个参数为fout,最后执行fclose,关闭两个文件。

如果不允许使用重定向方式读写数据,应使用fopen和fscanf/fprintf进行输入输出。

重定向和fopen两种方法各有优劣。 重定向的方法写起来简单、 自然,但是不能同时读写文件和标准输入输出;fopen的写法稍显繁琐,但是灵活性比较大(例如,可以反复打开并读写文件)。 顺便说一句,如果想把fopen版的程序改成读写标准输入输出,只需赋值“fin=stdin;fout=stdout;”即可,不要调用fopen和fclose(10)。

参考:/kongbai308416350/article/details/5504422

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。