文件操作 & 重定向

实例:输入一些整数,求出它们的最小值、最大值和平均值(保留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的写法稍显繁琐,但是灵活性比较大(例如可以反复打开读写文件)。

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

时间: 2024-10-10 09:53:26

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

C语言中的文件操作---重定向操作文件

先说个题外话,文件操作以及字符串与字符深入处理(就是那些什么puts(), getchar()什么的)是本人深入认识C++最后的两座大山.而今天先把重定向文件操作解决掉. 输入输出重定向恐怕是文件I/O操作中最简单的方法了,具体用法是现在main函数的开头加入两条语句,例如: freopen("D:\\input.txt", "r", stdin); freopen("D:\\output.txt", "w", stdout)

linux程序设计——文件操作(第三章)

第三章    文件操作 3.1 linux文件结构 与UNIX一样,linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而一致的接口.在linux中,一切都是文件. 这意味着,通常程序可以像使用文件那样使用磁盘文件.串行口.打印机等等. 目录也是文件,但它是一种特殊类型的文件.在现代UNIX(包括linux)版本中,即使是超级用户可能也不再被允许直接对目录进行写左操作了.所有用户通常都使用上层的opendir/readdir接口来读取目录,而无需了解特定系统中目录

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

详见;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt103 文件操作和过滤 绝大多数命令行工作是针对文件的.我们会在本节中讨论如何观察及过滤文件内容,使用一条命令从文件中提取所需信息,以及对文件的内容进行排序. cat.tail.head.tee:文件打印命令这些命令的语法基本上相同的:命令名 [选项] [文件],而且您可以在管道中使用这些命令.这些命令的功能都是根据特定的条件选择文件内容进行打印. cat 工具会将文件的全部

linux C/C++:文件操作--open、read、write

linux C/C++:文件操作--open.create.close 文件描述符 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件.系统内核会为每一个进程维护一份文件描述符表.如下: 内核分配文件描述符规则是,永远分配未使用的并且是最小的.前三个文件描述符:0.1.2,在默认情况下已被占用.当然,可以先关闭.比如关闭1,再分配,可导致重定向.

文件夹重定向

通过文件夹重定向功能,可以将用户配置文件中的特定文件夹的位置重定向到新位置,如共享网络位置.在管理用户配置文件和漫游用户配置文件的过程中,将使用文件夹重定向功能.可以使用组策略管理控制台来配置文件夹重定向以重定向特定的用户配置文件文件夹,以及编辑文件夹重定向策略设置. 文件夹重定向的优势: 即使用户登录到网络上的不同计算机,其数据也始终是可用的.a.脱机文件技术(默认情况下处于打开状态)允许用户访问文件夹,即使他们没有连接到网络.对于使用便携式计算机的人来说,该技术尤其有用. b.存储在网络文件

python3_05.文件操作那些事

文件操作的学习笔记. >>> file = open('/tmp/test.txt','r') >>> file.read() 'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd

基于文件描述符的文件操作(非缓冲)

1.1. 文件描述符:内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0-1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作.常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权限).flock(加锁).fcnt

Java文件操作源码大全

1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 910.读取文件属性 911.写入属性 1012.枚举一个文件夹中的所有文件 1013.复制文件夹 1114.复制一个目录下所有的文件夹到另一个文件夹下 1215.移动文件夹 1316.移动一个目录下所有的文件夹到另一个目录下 1517.以一个文件夹的框架在另一个目录创建文件夹和空文件 1618.复制文件 1719.复制一个目

文件操作1创建文件

1.[[email protected] ]# vi list     #如果testfile不存在,则vi会自动创建一个名为testfile的文件,并在Vi打开该文件等待用户输入内容. 2.[[email protected] ]# ls -l >listfile #利用重定向,将ls -l 的执行结果输出到新文件listfile中,也可使用cat,more,less或其它命令结合重向运算符>来生成新文件 3.[[email protected] ]# cp file  file2   #复