重定向与文件,具体原理篇

重定向与文件具体原理(对具体实现中的知识点说明)

我们先创建一个eofDemo.cpp文件,用来读取数据、将数据打印在屏幕上

#include <stdio.h>
int main(void)
{
	int ch;
	while((ch=getcahr()) != EOF)
	{
		putchar(ch);
	}
}

1.单字符I/O:getchar()和putchar()

  • getchar() 和putchar()都是stdio.h中的函数
  • getchar() 和putchar()每次只处理一个字符
  • 我们通过while循环不断读取用户敲入的(或者文本文件中的)信息,直到遇到EOF才停下来。
  • EOF在stdio.h中定义,其数据类型为int,值为-1,在ASCII码中没有哪个键对应的是-1,所以不论单独敲入什么键都无法结束输入。
#define EOF (-1) //在stdio.h中定义
  • windows系统中可以通过阻塞式ctrl+Z来停止输入。(这个具体解释见下一部分2.结束键盘输入)

2.结束键盘输入

计算机操作系统要以某种方式判断文件的开始和结束,检测文件结尾的一种方法是,在文件末尾放一个特殊字符标记这个文件结尾。现在计算机操作系统可以使用内嵌的Ctrl+Z字符来标记文件结尾。这曾是操作系统使用的唯一标记,不过现在有一些其他的选择,例如记录文件的大小,所以现代的文本文件不一定有嵌入的Ctrl + Z 但是如果有,操作系统会将其视为一个文件结尾标记。(我们传入的文件有文件结尾标记,所以计算机直到什么时候读取文件结束)

3.0 重定向与文件

输入输出设计函数、数据和设备。考虑我们示例的 eofDemo.cpp 文件,该程序使用输入函数getchar()输入设备是键盘,输入数据流由字符组成。假设我们希望输入函数和数据类型不变,仅改变程序查找数据的位置。程序怎么去查找输入呢?

有两个方法:

  • 方法1,使用特定的函数打开关闭文件,读取写入文件。这个这里我们暂时不谈。
  • 方法2,设计能与键盘和屏幕互动的程序,通过不同的渠道重定向输入至文件和从文件输出。也就是把stdin流重新赋给文件。继续使用getchar()函数从输入流中获得数据。

3.1 重定向输入

文本文件(text file)是内含文本的文件,其中储存的数据是我们可以识别的字符。文件的内容可以是一篇散文一篇诗歌一段代码。内含机器语言指令的文件(如储存可执行程序的文件)不是文本文件。由于该程序的操作对象是字符,所以要使用文本文件。

<符号是UNIX和DOS/windows的重定向运算符(输入),>符号是输出运算符

示例的eofDemo.exe程序本身不知道(或者不关心)输入的内容来自文件还是键盘,它只知道这是需要导入的字符流,所以它读取这些内容,并且把字符逐个通过putchar()方法打印在屏幕上,直到读到文件结尾。 因为C把文件和I/O设备放在一个层面,所以文件就是现在的I/O设备。

在示例代码的exe所在的文件夹打开,假设我们的exe文件命名为eofDemo.exe,在这个文件夹中打开cmd(命令提示符)

Microsoft Visual Studio和Vc++默认设置是吧可执行文件放在项目文件夹的子文件夹,成为Debug。文件名和项目名的基本名相同,文件名的拓展名为exe

在这个文件夹中新建一个文本文件aTextDemo.txt
windows中在cmd(命令提示符)中,键入的格式如下

D:/test/study1022/Debug/eofDemo > aTextDemo.txt	//注意,如果这里不打txt,那么系统会新建一个aTextDemo的无后缀文件
the first line lalala
second line hahaha
bababalalala
^Z	//结束输入,敲入ctrl+Z,回显为^Z

3.2 重定向输出

这个时候输入的这几行文本就传入到了aTextDemo.txt文件中,我们可以通过<重定向运算符在cmd中查看该txt文件内容

D:/test/study1022/Debug/eofDemo < aTextDemo.txt
the first line lalala
second line hahaha
bababalalala

D:/test/study1022/Debug/_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值