J'écris dans Microsoft Visual C++ et j'aimerais que mon programme lise à partir de l'entrée standard ou un fichier en utilisant le istream_iterator
. Googler les internets n'a pas montré à quel point je pense qu'il doit être simple. Ainsi, par exemple, je peux écrire ce assez facilement et lire l'entrée standard:Utilisation de istream_iterator et lecture à partir de l'entrée ou du fichier standard
#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());
}
Ou je peux écrire cela et lire un fichier:
#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());
}
Mais comment puis-je combiner ces deux pour que une simple vérification (argc == 2)
me permet d'initialiser mon itérateur de flux d'entrée avec un flux de fichier ou un fichier stdin et de continuer mon chemin joyeux?
Ceci tente de lier une valeur r à une référence non-const, et est illégale en C++. –
@Alex: Si un opérande peut être implicitement converti en une référence à l'autre type, le résultat est un lvalue. http://www.open-std.org/jtc1/sc22/wg21/docs/wp/html/nov97-2/expr.html#expr.cond –
Vous semblez avoir raison - VC 2008 compile cela sans problème . On dirait un bug VC 2005. –