【发布时间】:2010-09-24 23:41:16
【问题描述】:
cin和文件输入有通用接口吗?
我想做一个有可选参数的程序
prog [input-file]
如果指定了输入文件,则应从该文件中读取,否则应从 cin 中读取。
据我所知,它们都实现了istream。您将如何设置它以便我可以执行类似in >> var 的操作,其中in 是istream。
【问题讨论】:
cin和文件输入有通用接口吗?
我想做一个有可选参数的程序
prog [input-file]
如果指定了输入文件,则应从该文件中读取,否则应从 cin 中读取。
据我所知,它们都实现了istream。您将如何设置它以便我可以执行类似in >> var 的操作,其中in 是istream。
【问题讨论】:
#include <iostream>
#include <fstream>
int main(int argc, char **argv)
{
std::ifstream f;
if (argc >= 2) {
f.open(argv[1]);
}
std::istream &in = (argc >= 2) ? f : std::cin;
// use in here
}
您可以将其中的一些工作转移到一个辅助类中,以便更清楚地了解正在发生的事情(请注意,在无法打开文件的情况下,其行为略有不同):
#include <iostream>
#include <fstream>
class ifstream_or_cin_t {
std::ifstream f;
public:
ifstream_or_cin_t(const char *filename)
{
if (filename) {
f.open(filename);
}
}
operator std::istream &() { return f.is_open() ? f : std::cin; }
};
static void do_input(std::istream &in)
{
// use in...
}
int main(int argc, char **argv)
{
do_input(
ifstream_or_cin_t((argc >= 2) ? argv[1] : NULL));
}
【讨论】:
您可以编写一个引用std::istream 的函数:
void do_input(std::istream& the_istream)
{
int my_awesome_variable;
the_istream >> my_awesome_variable;
}
使用示例:
int main()
{
// reading from stdin:
do_input(std::cin);
// reading from a file:
std::ifstream fs("test.txt");
do_input(fs);
}
【讨论】:
我的 2P 价值:
#include <iostream>
#include <fstream>
#include <string>
extern char const* findFlag(int,char*[],char const*);
int main(int argc,char* argv[])
{
std::string isFile = findFlag(argc,argv,"-f");
std::ifstream file;
if (isFile != "")
{ file.open(isFile.c_str());
}
std::istream& data = isFile != "" ? file : std::cin;
}
【讨论】:
!isFile.empty() 不是更好吗?
istream& input = cin;
或
inputFileStream ifstream(fileName);
istream& input = inputFileStream;
但是我认为这不是一个很好的方法,因为 cin 没有 close() 而 ifstream 有。
【讨论】:
input = inputFileStream 也无法工作。关于close(),通常你不必打电话给close();你只需让析构函数处理它。