I am having difficulty making getopt operation optional. Here's a part of my code. It takes in an argument file, which if it is there, it counts the number of characters. If not it counts the stdinput characters.
My question is what optarg gets set to once it is undeclared? And how do I go about making my option -c optional and making this work.
Currently it always read from stdin.
while( (option = getopt(argc, argv, "c::") ) != -1 ) {
switch(option) {
case 'c':
if (optarg == NULL) {
file = stdin;
}
else {
file = fopen(optarg, "r");
}
while( (ch = fgetc(file)) != EOF ) {
count++;
}
printf("%d %s\n", count, optarg);
fclose(file);
break;
Optional arguments to options are not supported by "Standard" (POSIX) getopt()
. The use of a double colon "::"
is a GNU getopt()
extension.
To have getopt()
set optarg
to an option's "optional" argument use the option on calling the program like this:
program -coptional_argument_to_option_c
However alternatively you might like to take one of the the following approaches:
Define -c filename
with filename being mandatory. And if -c filename
misses just count what is read from stdin
.
Or define -c
with no argument to tell your program what to do (to count here) and additionally define an option to tell your program where to read from like -f filename
. If the latter misses read from stdin
.