![](/img/trans.png)
[英]Something about reading portions of data from file using a C++ istream_iterator
[英]Using istream_iterator and reading from standard input or file
我正在用Microsoft Visual C ++编写,我希望我的程序能够使用istream_iterator
读取标准输入或文件。 谷歌搜索互联网并没有表明我认为它必须是多么简单。 例如,我可以很容易地编写这个并从标准输入中读取:
#include <iostream>
#include <string>
#include <iterator>
using namespace std;
int main()
{
istream_iterator<string> my_it(cin);
for (; my_it != istream_iterator<string>(); my_it++)
printf("%s\n", (*my_it).c_str());
}
或者我可以写这个并从文件中读取:
#include <iostream>
#include <string>
#include <iterator>
#include <fstream>
using namespace std;
int main(int argc, char** argv)
{
ifstream file(argv[1]);
istream_iterator<string> my_it(file);
for (; my_it != istream_iterator<string>(); my_it++)
printf("%s\n", (*my_it).c_str());
}
但是我如何组合这两个以便简单(argc == 2)
检查让我用文件流或stdin初始化我的输入流迭代器并继续我的快乐方式?
您可以在构造之后分配给迭代器:
int main(int argc, char** argv)
{
ifstream file;
istream_iterator<string> my_it;
if(argc == 2) {
file.open(argv[1]);
my_it = istream_iterator<string>(file);
} else {
my_it = istream_iterator<string>(cin);
}
}
这个小片段将为您提供一个istream input
,可以是文件或std :: cin。
std::ifstream filestream;
if ( use_file )
filestream.open( ... );
std::istream &input = use_file ? filestream : std::cin;
您现在可以使用input
而不必担心输入来自哪个源。
乍一看,最简单的解决方案是使用三元运算符?:
像这样:
istream_iterator<string> my_it( (argc == 2) ? ifstream(argv[1]) : cin );
但是,这不会很有效,因为它构造了一个临时的ifstream
对象,它将在语句结束时被销毁。 因此,您需要一种有条件地创建ifstream
,并在for
循环后有条件地销毁它。 std::auto_ptr<>
适合账单。 从而:
auto_ptr<ifstream> file((argc == 2) ? new ifstream(argv[1]) : NULL);
istream_iterator<string> my_it( (argc == 2) : *file : cin);
for (; my_it != istream_iterator<string>(); my_it++)
printf("%s\n", (*my_it).c_str());
一个不同的,可能更干净的解决方案是将迭代移动到一个带有istream&
的独立函数。
我在网上看到过这个问题,其中一个是C ++的优秀人员。 不幸的是,我不记得究竟在哪里,或由谁! 我认为这是关于DDJ,也许是Sutter或Alexandrescu?
你的意思是这样的:(使用指针)
#include <iostream>
#include <string>
#include <iterator>
#include <fstream>
using namespace std;
int main(int argc, char** argv)
{
istream_iterator<string>* my_it = NULL;
if (argc == 2)
{
ifstream file(argv[1]);
my_it = new istream_iterator<string>(file);
}
else
{
my_it = new istream_iterator<string>(cin);
}
...
delete my_it;
}
不过,我没有测试过这个。 那是你想要的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.