Как упомянуто выше в комментарии, переносимым способом является передача либо открытого файла, либо std::cin
в качестве ссылки istream
на функцию и выполнение там вашего ввода. В этом случае может быть передан либо файл, либо std::cin
. Э.Г.
#include <iostream>
#include <fstream>
#include <string>
void readinfo (std::istream& in)
{
std::string s;
while (in >> s)
std::cout << s << '\n';
}
int main (int argc, char **argv) {
if (argc > 1) { /* read from file if given as argument */
std::ifstream fin (argv[1]);
if (fin.is_open())
readinfo (fin);
else {
std::cerr << "error: file open failed.\n";
return 1;
}
}
else { /* read from stdin */
readinfo (std::cin);
}
return 0;
}
Непереносимая опция Linux only, считывающая /dev/stdin
, если файл не указан, просто требуется оператор троичный , например,
std::ifstream fin (argc > 1 ? argv[1] : "/dev/stdin");
if (!fin.is_open()) {
std::cerr << "error: file open failed.\n";
return 1;
}
/* read from fin here */
Ни один из них не является полностью элегантным, но оба поддерживают (в зависимости от ограничений ОС)
myprogram < input.txt
или
myprogram input.txt