C++, how to provide the input filename from the command line, without hardcoding it in the program?
Solution 1
You can access the command line arguments passed to your program in the main
function:
int main(int argc, char *argv[]) { }
argc
is the number of arguments passed to your program and argv
contains pointers to C-strings holding the arguments passed to your program. So using this array you can access the arguments passed to your program.
But you have to pay attention: the program itself is always passed to the program as first argument. So argc is always at least one and argv[0]
contains the program name.
If you want to access the input.txt
from your post you could write:
int main(int argc, char *argv[]) {
if (argc > 1) {
// This will print the first argument passed to your program
std::cout << argv[1] << std::endl;
}
}
Solution 2
Just to addon to all the answers - You can use 'standard input and output' of C/C++ like printf() & scanf()
$ ./a.out < input.file // input file
$ ./a.out > output.file // output file
$ ./a.out < input.file > output.file // merging above two commands.
For more info: REFER THIS
And ofcourse, clean way is to use argc/argv as answered by fellow gentlemen.
Related videos on Youtube
user2917559
Updated on September 15, 2022Comments
-
user2917559 almost 2 years
This is the continuation of my previous question, In C++, how to read the contents of a text file, and put it in another text file?
In that, I was able to able to open an input file
input.txt
and read it contents successfully, but now i don't want to hardcode or give the input filename beforehand,ifstream myfile ("input.txt"); if (myfile.is_open())
but i want to give the input file name later after compiling the program and generating an executable file named
test
in the command line, as shown below./test input.txt
Any suggestions on how to do this ?
-
Dan over 10 yearsAlso,
std::vector<std::string> args(argv, argv + argc);
is a convenient way to access arguments. -
sleepy1771 over 10 yearsAnd if you use
argv+1
instead ofargv
you omit the program name if you don't need it. @Dan That's really a very nice way to access the arguments... -
user2917559 over 10 yearsThanks, what is 'a.out' here ? is it the executable file generated after compiling, or is it something else ?
-
iankits over 10 yearsYes, when you compile your C++ in Unix environment like 'g++ sample.cpp' will output binary executable file with default name a.out else you can specify name of your output file as 'sample_exec' like 'g++ sample.cpp -o sample_exec'. Then similarly you can run './sample_exec < file.input' as described above
-
user2917559 over 10 yearsOk, thanks, i am working on windows and it is generating .exe file as the executable file
-
iankits over 10 yearsDoesn't matter, redirection also works in Windows but not sure. This link tells something like that (microsoft.com/resources/documentation/windows/xp/all/proddocs/…). So, in principle you can do 'sample.exe < input.file'. Give it a shot and let me know as I never had the chance try this on windows