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

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 LOCAL
int 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 1000000000
int 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)。

参考:https://blog.csdn.net/kongbai308416350/article/details/5504422

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

  1. 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...

  2. 用CSV文件读写数据的两种方式(转)

    导读:有时候我们需要对收集的数据做统计,并在页面提供显示以及下载.除了对传统的excel存取之外,对CSV文件的存取也很重要.本文列出了这两种操作的详细代码. 代码: <?php $file = ...

  3. python实现selenium文件上传的两种方式

    方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情 ...

  4. Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  5. vue前端上传文件给后端的两种方式

    <a-uploadv-model:file-list="fileList":show-upload-list="false":multiple=" ...

  6. java 文件压缩zip【两种方式】

    一.普通方式 package com.hebta.source.code.util;import java.io.*; import java.util.zip.ZipEntry; import ja ...

  7. android文件追加,Android 写文件 复写和追加 两种方式

    /** * 此方法为android程序写入sd文件文件,用到了android-annotation的支持库@ * * @param buffer 写入文件的内容 * @param folder 保存文 ...

  8. Python页面自动化文件上传两种方式

    Python页面自动化测试之文件上传的两种方式 --广州_vivi 最近教学过程,学员项目出现测试上传文件无法执行的情况,分析发现学员项目的上传按钮并不是input按钮,导致无法使用直接定位元素方式进 ...

  9. 设置ZIP文件打开密码的两种方法

    使用WinRAR缩包ZIP文件时,有两种方式来设置打开密码,我们可以根据不同需要选择不同的方法. 方法一: 在压缩文件的时候同时设置打开密码,只设置当下压缩的ZIP文件. 首先,鼠标选择需要压缩的文件 ...

  10. SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)

    P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...

最新文章

  1. 妈呀!GitChat 发布 1.9 版本更新公告,这个红色简直亮瞎了我的眼...
  2. 推荐一些顶级的Android开发书籍(转)
  3. Ubuntu被曝严重漏洞:切换系统语言+输入几行命令,就能获取root权限
  4. 怎么讲d 盘里的软件弄到桌面_教大家电脑怎么把e盘文件移到d位置
  5. 抛开flash,自己开发实现C++ RTMP直播流播放器
  6. 方案接口服务器问题记录
  7. ubuntu apt-get install xxx命令,下载的路径及清除方式
  8. Spring Boot中使用Ribbon软负载
  9. Redis源码分析(零)学习路径笔记
  10. CSS z-index属性
  11. 数学竞赛辅导陈启浩pdf_高中数学一题多解经典题型汇编(一)
  12. matlab imrotate中心,MATLAB imrotate函数的用法
  13. FPGA零基础学习:UART协议驱动设计
  14. 华为digix算法大赛2020机器学习赛道-搜索相关性初赛A/B榜rank1
  15. 启动tomcat报错:Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhos
  16. 现代软件工程 怎么教好课 (读书笔记)
  17. TI毫米波雷达开发常见问题总结
  18. 你能在泰坦尼克号上活下来吗?Kaggle的经典挑战
  19. 一文读懂遗传算法工作原理(附Python实现)
  20. linux 挂载3t硬盘分区,Ubuntu挂载3T硬盘或大于2T磁盘的方法

热门文章

  1. 如何为自定义的控件在工具箱中自定义个性化的图标
  2. LaTeX(WinEdt)编译错误时,快速定位源文件中出错位置
  3. sharelatex 编辑论文
  4. NASA-TLX (Task Load Index)量表学习总结
  5. unity打开htc vive 的前置摄像头 和 实现增强现实效果
  6. Atitit 圣爱提拉克斯在会议上 2019年10月中旬的一天,有过这样的事。 这天,地方上风大。出乎人们意料之外,到东海岸一个地方访问的亲爱的领导者圣爱提拉克斯要同人们一道开会。主持人着了慌,
  7. Atitit 项目管理优化体系图 第4章 项目整合管理 开始 计划 执行 监控 变更 结束 第5章 项目范围管理  SOW工作说明书 成员通讯录 wbs大概模块级别 第6章 项目时间
  8. Atitit 六种知识表示法 目录 1. 知识的静态描述和动态描述 1 1.状态空间表示 以状态和运算符(operator) 1 2.问题归约表示(函数式?? 1 (1)一个初始问题描述; 2 (2)
  9. Atitit 图像处理—图像形态学(膨胀与腐蚀)
  10. paip.基于urlrewrite的反向代理以及内容改写