Re: Whats the C++ equivalent of reading from stdin or a file
On Oct 5, 6:59 pm, Adrian <n...@bluedreamer.com> wrote:
What is the best was to do this in c++. This is going to be used for
unix util that should be able to have input piped to it or file name
spec
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
int c;
if(argc==2)
{
fp=fopen(argv[1], "r");
}
else
{
fp=stdin;
}
while((c=fgetc(fp))!=EOF)
{
printf("%c",c);
}
return 0;
}
The standard Unix convention allows for more than one filename.
What I usually do is something like:
int
main( int argc, char** argv )
{
Gabi::MultipleFileIStream source( argv + 1, argv + argc ) ;
process( source, std::cout ) ;
return EXIT_SUCCESS ;
}
(The MultipleFileIStream class is available at my site:
kanze.james.neuf.fr. It's actually one of the rare classes
there which hasn't undergone much modification since I put it
there.)
Otherwise, the standard Unix idiom is:
int
main( int argc, char** argv )
{
if ( argc <= 1 ) {
process( std::cin, std::cout ) ;
} else {
for ( int i = 1 ; i < argc ; ++ i ) {
std::ifstream source( argv[ i ] ) ;
if ( ! source ) {
std::cerr << argv[ 0 ] << ": cannot open "
<< argv[ i ] << std::endl ;
} else {
process( source, std::cout ) ;
}
}
}
return EXIT_SUCCESS ;
}
(There's also a singleton class, ProgramStatus, at my site which
can be used to manage the exit status. MultipleFileIStream is
in the IO subsystem, ProgramStatus in the Process subsystem.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34