zoukankan      html  css  js  c++  java
  • 文件操作 & 重定向

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

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

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

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

    一个好的方法就是用文件——把输入数据保存在文件中,输出数据也保存在文件中。如果有标准答案,还可以用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 = 0;
        int i = 0;
        int flag = 0; 
        double aver;
        
        while(scanf("%d", &n) == 1)
        {
            if(flag == 0)
            {
                max = n;
                min = n;
                flag = 1;
            }
            
            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 0;
    }
    

    由于程序中定义了符号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 = 0;
        int i = 0;
        int flag = 0; 
        double aver;
        
        while(fscanf(fin, "%d", &n) == 1) 
        {
            if(flag == 0)
            {
                max = n;
                min = n;
                flag = 1;
            }
            
            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 0;
    }

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

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

     

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

  • 相关阅读:
    expd,impd常用命令
    linux oracle 服务重启过程
    oracle 锁表查询及kill
    oracle 存储过程卡无法编辑
    oracle 各版本之间的导入导出
    与linux 病毒的一次接触
    一分钟读懂PDCA 循环
    5W2H分析法——你肯定听过的一种思维工具
    你真的懂如何进行用户调查么?
    精选互联网运营必读的 8 本书籍
  • 原文地址:https://www.cnblogs.com/xpjiang/p/4154323.html
Copyright © 2011-2022 走看看