Я пишу в Microsoft Visual C++, и я хотел бы, чтобы моя программа либо читала стандартный ввод, либо файл, используя istream_iterator
. Googling the internets не показал, насколько просто я думаю, что это должно быть. Так, например, я могу написать это довольно легко и читать из стандартного ввода:Использование 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, и продолжать рассказывать о моем веселом пути?
Это попытка привязать значение r к неконстантной ссылке и является незаконной в C++. –
@Alex: Если один операнд может быть неявно преобразован в ссылку на другой тип, результатом будет lvalue. http://www.open-std.org/jtc1/sc22/wg21/docs/wp/html/nov97-2/expr.html#expr.cond –
Вы, кажется, правы - VC 2008 компилирует это без проблем , Похож на ошибку VC 2005. –