实例:输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。

分析:需要注意的几点:数据个数不确定;数据大小不确定。简单分析后编程如下:

#include <stdio.h>
int main(void)
{
int n, max, min;
int sum = ;
int i = ;
int flag = ; // C99标准以前没有bool类型
double aver;
// scanf返回成功读取的变量个数
while(scanf("%d", &n) == ) // 输入完毕按Ctrl+Z键,然后按Enter键即可结束输入,注意不要键入Ctrl+C,这会终止程序
{
if(flag == )
{
max = n;
min = n;
flag = ;
} if(n > max)
max = n;
if(n < min)
min = n; i++;
sum += n;
} aver = 1.0 * sum / i;
printf("%d %d %.3lf", min, max, aver);
return ;
}

上面的程序不是很方便,因为每次测试都要手工输入很多数,尽管可以用这里提到的管道的方法,但是数据只是保存在命令行中,仍然比较麻烦。

一个好的方法就是用文件——把输入数据保存在文件中,输出数据也保存在文件中。如果有标准答案,还可以用windows下的fc命令比较文件。几乎所有的算法竞赛的输入数据和标准答案都保存在文件中。

使用文件最简单的方法是使用输入输出重定向,只需在main函数的入口处添加下面两条语句

    // 键盘输入从文件input.txt读入,屏幕输出到文件output.txt
freopen("E:\\Desktop\\input.txt", "r", stdin);
freopen("E:/Desktop/output.txt", "w", stdout);

这里"E:/Desktop"为我的桌面,当然也可以使用相对路径,这样文件会存在程序所在目录。

还有一个方法可以在本机测试时用文件重定向,但是提交代码时自动"删除"重定向,代码如下:

#include <stdio.h>
#define LOCAL
int main(void)
{
#ifdef LOCAL
freopen("E:\\Desktop\\input.txt", "r", stdin);
freopen("E:/Desktop/output.txt", "w", stdout);
#endif
int n, max, min;
int sum = ;
int i = ;
int flag = ;
double aver; while(scanf("%d", &n) == )
{
if(flag == )
{
max = n;
min = n;
flag = ;
} if(n > max)
max = n;
if(n < min)
min = n; i++;
sum += n;
} aver = 1.0 * sum / i;
printf("%d %d %.3lf", min, max, aver);
return ;
}

由于程序中定义了符号LOCAL,因此本机测试时使用重定向方式读写文件,如果要求读写标准输入输出,只需将#define LOCAL注释掉即可。当然我们也可以在编译选项中定义LOCAL符号(-DLOCAL,注意开头的符号D)。

如果要求用文件输入输出,但是禁止用重定向的方式,可以采用如下方案:

#include <stdio.h>
int main(void)
{
FILE *fin, *fout; fin = fopen("E:/Desktop/data.in", "rb");
fout = fopen("E:/Destop/data.out", "wb"); int n, max, min;
int sum = ;
int i = ;
int flag = ;
double aver; while(fscanf(fin, "%d", &n) == )
{
if(flag == )
{
max = n;
min = n;
flag = ;
} if(n > max)
max = n;
if(n < min)
min = n; i++;
sum += n;
} aver = 1.0 * sum / i;
fprintf(fout, "%d %d %.3lf", min, max, aver);
fclose(fin);
fclose(fout);
return ;
}

如果想把此程序改成读写标准输入输出,只需赋值fin = stdin; fout = stdout,并且删除最后的两条fclose语句即可。

重定向和fopen两种方法各有优势。重定向的方法写起来简单、自然,但是不能同时读写文件和标准输入输出;fopen的写法稍显繁琐,但是灵活性比较大(例如可以反复打开读写文件)。

参考资料:《算法竞赛入门经典》——刘汝佳

文件操作 & 重定向的更多相关文章

  1. (六)文件操作的主要接口API

    1.什么是操作系统API (1)API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用. (2)应用层程序通过调用API来调用操作系统中的各种功能,来干活. (3)学习一个操作系统 ...

  2. [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1

    主要是模仿robocopy的部分功能 (robocopy /L 参数可以列出本地目录和备份目录中的异同之处,主要是标记出:较新的.较旧的.多出的文件 ) 现在还不会写GUI,打算后面自己做目录树dif ...

  3. C语言 文件操作5--文件的常用函数

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //stdin:标准输入文件指针,系统 ...

  4. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  5. cat、tail、head、tee、grep、wc、sort文件操作和过滤

    详见;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt103 文件操作和过滤 绝大多数命令行工作是针对文件的.我们会在本节中讨论如何 ...

  6. sed命令针对文件操作具体解释

    Linux的简单shell脚本中改动文件操作 1.Sed简单介绍 sed 是一种在线编辑器,它一次处理一行内容.处理时.把当前处理的行存储在暂时缓冲区中,称为"模式空间"(patt ...

  7. C# 文件操作类大全

      C# 文件操作类大全 时间:2015-01-31 16:04:20      阅读:1724      评论:0      收藏:0      [点我收藏+] 标签: 1.创建文件夹 //usin ...

  8. JDK 7中的文件操作的新特性

    文件系统综述 一个文件系统在某种媒介(通常是一个或多个硬盘)上存储和组织文件.如今的大多数文件系统都是以树状结构来存储文件.在树的顶端是一个或多个根节点,在根节点一下,是文件和目录(在Windows系 ...

  9. Linux(C/C++)下的文件操作open、fopen与freopen

    open是linux下的底层系统调用函数, fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的 ...

随机推荐

  1. Ruby--正则

    1. 只取数字(用的是字符串替换) gsub(/[^0-9]/, “”)

  2. Oracle 语句常见错误

    Merge into的注意点之ORA-30926:无法在源表中获得一组稳定的行? merge into 的内部处理是将table_source 的每一条记录和table_target的每一条记录对比匹 ...

  3. w-BIG TABLE-view+where-small table

    w-BIG TABLE DROP PROCEDURE IF EXISTS truncate_insert_sales_rank_toparow_month; DELIMITER /w/ CREATE ...

  4. Delphi的并行计算

    有如下循环体: hits:=; do begin {perform some calculations dependent on random number generation to determi ...

  5. WIN10 ANDROIDSTUDIO1.2 安装完首次启动报错

    环境 ACER NOTEBOOK  WIN10 ANNDROID 1.2 解决方案: 在Android Studio安装目录下的 bin 目录下,找到 idea.properties 文件,在文件最后 ...

  6. 从cookie的setDomain方法可以得知localhost不是域名

    http://www.baidu.com 其中baidu.com是一个域名.那么http://localhost 中的localhost是不是域名呢?我百度过,发现有人说这是域名.于是我在自己的web ...

  7. 在Android Studio 中正确使用adil ”绝对经典“

    今天调用远程服务中遇到了一个问题,哎,调了2个小时,后来终于解决,总结来看还是对新的Android Studio 不够熟悉.那么....就可以睡觉啦!!! 在Android Studio中使用进程通信 ...

  8. Linux中的ps命令

    Linux中ps命令用来列出系统中当前运行的那些进程. 使用格式:ps 参数   如:ps -A 通过man ps可以获得ps的详细参数用法 -A 显示所有进程信息 c 列出程序时,显示每个程序真正的 ...

  9. ArcGIS Engine开发之旅10--空间参考及坐标转换

    原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...

  10. Caused by: java.lang.OutOfMemoryError: PermGen space.

    现在eclipse需要加载4个项目同时运行了,所以当服务启动的时候,出现Caused by: java.lang.OutOfMemoryError: PermGen space.空间不足错误,我说一下 ...