重定向和文件
程序可以通过两种方式使用文件:
第一种方法是,显示使用特定的函数打开文件,关闭文件,读取文件,写入文件。
第二种方法是,设计能与键盘和品目互动的程序,通过不同的渠道重定向输入值文件和从文件输出。换言之,把stdin 流重新赋给文件。
重定向的一个主要问题是它与操作系统有关,与C无关。
1.重定向输入
重定向输入如操作的指令是 "<"
由于用的是VSCode运行程序时可在终端输入./ecoh_eof 指令
即可执行文件但是在那之前需要编译链接生成.exe文件。
看书本时重定向的输入上面写了words的文本文件,一开始以为是.txt的格式,但是在试了VScode本身的终端、git bash和系统自带的Powershell后始终显示不出来效果。
如上图所示。
后来发现原因所在的问题是因为有.txt文件的原因。于是删除了.txt的后缀运行程序后就有效果了。
在words文件中输入
aaaaaaaa
bbbbbbbb
cccccccc
C程序为:
#include <stdio.h>
int main(void)
{
int ch;
while((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
但是在VSCode上的终端运行结果还是会报错于是换成了在git bash上运行。
运行效果如下:
运行成功,这很好的证明了以上的输入问题就是操作系统的原因,因为git bash是类似Linux的。
2.重定向输出
重定向输出操作使用的指令是 ">"
同样在git bash中输入./ecoh_eof >savewords
即可将输入的字符保存到savewords文件上。但是不清楚git bash中编辑文本是怎么退出的了,书上写的是Ctrl+z(DOS)或Ctrl+D(UNIX),我试了两种方法回车后都不行,然后又换回了VSCode有趣的是VSCode的终端可以使用 ">"
于是显示结果如下:
3.组合重定向
组合重定向要注意一点就是一条命令中输入文件名和输出文件名不能相同。原因是输出文件在输入之前已导致原文件的长度被截断了类似的有以下命令:
./echo_eof < mywords > mywords
重定向的命令与重定向的运算符的顺序无关例如以下两条命令的执行效果是一样的。
./echo_eof < mywords > savewords
./echo_eof > savewords < mywords
两个执行的效果是一样的。
重定向使用时的注意点
1.重定向运算符连接一个可执行程序(包括标准操作系统命令)和一个数据文件,不能用于连接一个数据文件和另一个数据文件,也不能用于连接一个程序和另一个程序。
2.使用重定向运算符不能读取多个文件的输入,也不能把输出定向至多个文件。
3.通常,文件名和运算符之间的空格不是必须的,除非是偶尔在UNIX shell、Linux shell 或Windows。