补充: 最近在看APUE,发现文件重定向是POSIX 系统(Unix,Linux) 的能力,而不是C++ 语言或C语言的能力
#include "apue.h"
#define BUFFSIZE 4096
int main()
{
int n;
char buf[BUFFSIZE];
while ( (n = read(STDIN_FILENO,buf,BUFFSIZE) ) > 0)
{
if ( write(STDOUT_FILENO,buf,n ) != n )
printf("write error");
}
if (n < 0)
printf("read error");
exit(0);
}
上面一段代码实现从标准输入读,并向标准输出写
编译: gcc copy.c -o copy
测试结果
一 直接执行,效果是输入什么就输出什么:
./copy
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
dsafasdf
dsafasdf
sadfasdfasdfasdf
sadfasdfasdfasdf
sadfasdfasdfasdfasdfasdfasdfasdf
sadfasdfasdfasdfasdfasdfasdfasdf
sadfasdfsdfsdafsdfsadfasdfasdfasdfasdf
sadfasdfsdfsdafsdfsadfasdfasdfasdfasdf
asdfasdfasdfasdfsdfasdfasdfsadfsdfdsafdsafasdf
asdfasdfasdfasdfsdfasdfasdfsadfsdfdsafdsafasdf
sadfsafasdfsdfasdfasdfsadfasdfsadfsdaf
sadfsafasdfsdfasdfasdfsadfasdfsadfsdaf
二. 将输出从标准输出(shell 终端)重定向为文件,效果为将输入写到文件
jethro@ubuntu:~/CppTest$ ./copy > data
sadfasdf
sadfasdf
sadfasdf
123
456
789
然后查看data 文件,发现新建了该文件,文件的内容为刚才输入的内容
三. 将标准输入重定向到文件,效果为读取文件
jethro@ubuntu:~/CppTest$ ./copy < data
sadfasdf
sadfasdf
sadfasdf
123
456
789
四. 将输入输出都重定向到文件,效果为复制文件,cp 命令的雏形
jethro@ubuntu:~/CppTest$ ./copy < data > datanew
jethro@ubuntu:~/CppTest$ cat datanew
sadfasdf
sadfasdf
sadfasdf
123
456
789
在重新看 C++ Primer 5th 时,注意到了一个以前忽视的细节(page 19):
当你测试程序时,反复从键盘输入数据是非常乏味的。
大多数操作系统支持文件重定向,这种机制允许我们将标准输入和标准输出与命令文件管理起来:
$ addItem < infile >outfilr
以上命令会将infile 内容作为程序的输入,输入写到outfile 文件中.
测试代码:
#include<iostream>
using std::cin;
using std::cout;
int main()
{
int n;
while(cin>>n)
{
cout << n << " ";
}
cout<<std::endl;
return 0;
}
Windows PowerShell 测试结果:
.\dailTest.exe <.\input.txt >.\output.txt
Redirection Not Surrported
Powershell 非常奇怪,当前目录非得使用.\,强制使用
Linux (ubuntu 14.4) 测试结果:
./dailyTest < input >output
Linux 支持文件重定向, cin 的内容从input 文件中读取, cout 的内容重定向到output 文件
从这个方面看,Linux 确实比windows 高效啊!