C++输入输出重定向(3种方法)
《C++输入流和输出流》一节提到,cout 和 cerr、clog 的一个区别是,cout 允许被重定向,而 cerr 和 clog 都不支持。值得一提的是,cin 也允许被重定向。 那么,什么是重定向呢?在默认情况下,cin 只能接收从键盘输入的数据,cout 也只能将数据输出到屏幕上。但通过重定向,cin 可以将指定文件作为输入源,即接收文件中早已准备好的数据,同样 cout 可以将原本要输出到屏幕上的数据转而写到指定文件中。 C++ 中,实现重定向的常用方式有 3 种,本节将一一做详细讲解。 C++ freopen()函数实现重定向freopen() 定义在<stdio.h> 头文件中,是 C 语言标准库中的函数,专门用于重定向输入流(包括 scanf()、gets() 等)和输出流(包括 printf()、puts() 等)。值得一提的是,该函数也可以对 C++ 中的 cin 和 cout 进行重定向。举个例子: #include <iostream> //cin、cout #include <string> //string #include <stdio.h> //freopen using namespace std; int main() { string name,url; //将标准输入流重定向到 in.txt 文件 freopen("in.txt","r",stdin); cin >> name >> url; //将标准输出重定向到 out.txt文件 freopen("out.txt","w",stdout); cout << name << "n" << url; return 0; }执行此程序之前,我们需要找到当前程序文件所在的目录,并手动创建一个 in.txt 文件,其包含的内容如下:
C++ ??? <--控制台中,既不需要手动输入,也没有任何输出 与此同时,in.txt 文件所在目录下会自动生成一个 out.txt 文件,其包含的内容和 in.txt 文件相同:
C++ C++ rdbuf()函数实现重定向rdbuf() 函数定义在<ios> 头文件中,专门用于实现 C++ 输入输出流的重定向。值得一提的是,ios 作为 istream 和 ostream 类的基类,rdbuf() 函数也被继承,因此 cin 和 cout 可以直接调用该函数实现重定向。 rdbuf() 函数的语法格式有 2 种,分别为: streambuf * rdbuf() const; streambuf * rdbuf(streambuf * sb); 其中,第一种语法格式仅是返回一个指向当前流缓冲区的指针;第二种语法格式用于将 sb 指向的缓冲区设置为当前流的新缓冲区,并返回一个指向旧缓冲区的对象。 举个例子: #include <iostream> #include <fstream> using namespace std; int main() { //打开 in.txt 文件,等待读取 ifstream fin("in.txt"); //打开 out.txt 文件,等待写入 ofstream fout("out.txt"); streambuf *oldcin; streambuf *oldcout; char a[100]; //用 rdbuf() 重新定向,返回旧输入流缓冲区指针 oldcin = cin.rdbuf(fin.rdbuf()); //从input.txt文件读入 cin >> a; //用 rdbuf() 重新定向,返回旧输出流缓冲区指针 oldcout = cout.rdbuf(fout.rdbuf()); //写入 out.txt cout << a << endl; //还原标准输入输出流 cin.rdbuf(oldcin); // 恢复键盘输入 cout.rdbuf(oldcout); //恢复屏幕输出 //打开的文件,最终需要手动关闭 fin.close(); fout.close(); return 0; } 仍以前面创建好的 in.txt 文件为例,执行此程序后,控制台不会输出任何数据,而是会在该项目的目录下生成一个 out.txt 文件,其中就存有该程序的执行结果:
C++ C++通过控制台实现重定向以上 2 种方法,都是从代码层面实现输入输出流的重定向。除此之外,我们还可以通过控制台实现输入输出的重定向。举个例子,假设有如下代码(文件名为 demo.cpp): #include <iostream> #include <string> using namespace std; int main() { string name,url; cin >> name >> url; cout << name << 'n' << url; return 0; }通过编译、链接后,会生成一个 demo.exe 可执行文件,该执行文件可以双击执行,也可以在控制台上执行。例如,打开控制台(Windows 系统下指的是 CMD命令行窗口,Linux 系统下指的是 Shell 终端),并输入如下指令:
C:Usersmengma>D:demo.exe 在此基础上,继续在控制台执行如下指令: C:Usersmengma>D:demo.exe <in.txt >out.txt 执行后会发现,控制台没有任何输出。这是因为,我们使用了"<in.txt"对程序中的 cin 输入流做了重定向,同时还用 ">out.txt"对程序中的 cout 输出流做了重定向。 如果此时读者进入 C:Usersmengma 目录就会发现,当前目录生成了一个 out.txt 文件,其中就存储了 demo.ext 的执行结果。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |