C语言输入输出重定向与fopen函数使用详解
大多数情况下,我们所熟知的输入输出都是标准I/O(标准输入输出),也就是我们在写代码时会直接从键盘读取,从屏幕输出。但是当我们涉及到数据统计或者多组未定义内容输入时,我们的程序就会出现一些小问题
int n = 0;
while(scanf("%d",&n)==1)
按照常理来说,这里 scanf
的返回值是成功输入的数的个数,输入一但结束,scanf 函数就无法继续读取 n,返回0,我们测试一下,输入“1,2,3,4,5”看看,好家伙,根本没有结果显示。是代码问题还是运行太慢?其实是还在等待输入,虽然我们可能觉得一个回车就可以搞定,但程序不会。
记得 scanf 的输入格式上对于空格,Tab,Enter键都是一视同仁,那如何才能告诉 程序我们输入结束了呢?在Windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter才能结束输入。在Linux下,只需Ctrl+Z即可结束输入。
也就是说上面的程序不是很方便,每次测试需要手动输入很多数,如果面对多组输入并且需要大量验证的测试,数据也只能保存在命令行中,仍然不够方便。
输入输出重定向
以上场景我们有个好的方法就是用文件把输入输出的数据放在文件里面,也就是所谓的输入输出重定向,放入事先准备好的数据,就不必每次重复输入了,也可以太多的输出一卷屏跑出来,属实不方便,而且在文件中放好标准的答案,可以很方便的进行比对,无需我们再去逐一的排查。有个不争的事实就是几乎所有算法的输出数据和标准答案都是放在文件里的。
在使用输入输出重定向时,只需在main函数的入口处加入两条语句:
freopen("input.txt","r","stdin"); freopen("output.txt","w","stdout");
其作用很简单,就是使得scanf从文件 input.txt 读入,printf 再从output.txt输出。
我们给出一个代码:
#define Max
#include
int main()
{
#ifdefine Max
freopen("input.txt","r","stdin");
freopen("output.txt","w","stdout");
#endif
}
#ifdefine Max
,#endif
的特殊之处就是我们只有在Max被定义了情况下才可以编译这两条 freopen 语句。事实上不只scanf 和 printf,所用从键盘键入从屏幕输出的数据都会改用文件,这确实方便,但在很多算法竞赛中禁止访问文件,甚至允许访问文件却禁止使用 freopen 这样的重定向读写文件。这种特殊情况我们又该作何打算呢?没错,那就是 fopen 函数
fopen函数
fopen函数表达式为:
FILE *fopen(char *filename, *type);
这个表达式不细说,只作了解,又是一堆晦涩陌生的名词,有兴趣的可以自行搜索。
我们来看个代码:
FILE *fin,*fout; fin = fopen("test.in","r"); fout = fopen("test.out","w"); fclose(fin); fclose(fout);
这里先声明了变量fin 和 fout,后续如果要输入输出我们需要把printf改为fprintf ,把 scanf 改为 fscanf,最后fclose关闭两个文件。
fopen和 freopen长的差不多,起初我甚至觉得他们就是一个东西,freopen和fopen之间有各自的优劣,重定向的方法写起来简单自然,但不能同时读写文件与标准输入输出;fopen写法稍微繁琐一点,但灵活性更大,就可以反复打开和读写文件。
这里的fscanf,fprintf都是针对数据流的,而什么是数据流?
数据流是一组有序,有起点和终点的字节的数据序列,包括输入流和输出流。就像水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
“流是磁盘或其它外围设备中存储的数据的源点或终点。”
而对于fscanf 的使用难点在于以下几点:
- 对空白符的处理(空格、制表符、换行符);
- *的用法;
- [] 以及 [^] 的用法;
- EOF 的处理;
上述问题,网上的文章都语焉不详,具体内容参见 fscanf详谈
当我们想把fopen的程序改成标准输入输出,只需赋值"fin = stdin;fout = stdout",不用再调用fopen和fclose。
C语言输入输出重定向与fopen函数使用详解相关推荐
- C语言结构体中定义函数指针详解
C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...
- C语言中fopen函数用法详解
fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, "文件指针名"必须是被说明为FILE 类型的指针变量: " ...
- fopen函数的详解与fclose函数的详解
fopen() 功能:打开一个特定的文件,并把一个流和这个文件相关联 头文件:#include<stdio.h> 原型: FILE*fopen(const char *path,const ...
- 输入输出重定向与fopen函数——C语言进阶
目录 传统艺能
- c语言fopen函数的作用是,C语言 fopen函数 参数详解
文件打开函数fopenfopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,"文件指针名"必须是被说明为FILE 类型的指针变 ...
- C语言标量变向量的函数,GLSL 详解(基础篇)
上节在绘制三角形的时候,简单讲解了一些着色器,GLSL 的相关概念,可能看的云里雾里的.不要担心,在本节中,我将详细讲解着色语言 GL Shader Language(GLSL)的一些基本的概念. P ...
- 笔记:fopen函数用法详解
头文件:#include <stdio.h> 函数原型:FILE *fopen(char *filename, char *mode); filename为文件名(包括文件路径),mode ...
- C语言 printf源码详解,从头一起学c语言(六)————printf函数的详解
这段时间很忙,更新的晚了,见谅.当然同样有今天我们的主角十分复杂,之前介绍了这个手记并非是面对新手的,而是我的复习手记.所以我们会讲头文件,或许有错误,如果有大手子看到,希望能够提出我的错误. pri ...
- c语言 freopen txt_C语言文件操作函数freopen详解
C语言文件操作函数freopen详解 今天做USACO 用到了文件的操作. 之前做USACO只是格式化的.些 写 freopen("xxx.in","r",st ...
最新文章
- Buffer.isBuffer()详解
- matlab freqz函数使用
- BizTalk开发系列(三十一)配置和使用HTTP适配器
- 首次使用maven的配置过程
- CISSP的成长之路(九):复习信息安全管理(3)
- java 读取txt文件指定行_在Java中读取txt文件中的特定行
- 快速迭代的开发方式中的QA实践方法
- C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
- 数据库管理系统属于计算机应用,数据库管理系统属于应用软件吗?
- Mac版哔哩哔哩视频下载工具
- php三级分销思路 数据库设计_三级分销,
- 【精通内核】CPU控制并发原理CPU中断控制内核解析
- 如何用c语言word文件页数,word文件页码怎么设置
- Ps 快速更改头发颜色
- Libreoffice命令行实现office转pdf(Windows、Linux)
- 解决浏览器 Microsoft Edge主页被hao123恶意篡改
- 概率论与数理统计 浙江大学 第9-15讲单元测验
- 【安全架构】COBIT vs TOGAF:哪个对网络安全更有利?
- lnmp 配置nginx 实现内网/本地域名
- TKO 6-6 DP入门之村庄援助
热门文章
- Python:实现extended euclidean algorithm扩展欧几里得算法(附完整源码)
- 让IE6/IE7/IE8支持CSS3的8种方法
- Linux命令之解压缩gunzip
- STM32CubeMX 学习(5)输入捕获实验
- 一键生成PDF文档的书签和目录(书签,目录页带页码 都行)
- 申请icp和edi许可证
- 区块链到底是怎么运行的
- HTML西安旅游网页设计作业成品 大学生旅游风景区网页设计作业模板下载 静态HTML旅游景点网页制作下载 DW网页设计代码
- 微软EXCEL 右键新建 显示无效
- 智慧景区APP开发解决方案