Mel Moore
Mel Moore

Reputation: 89

C How to take multiple files for arguments?

How would you ask for the user to input files as arguments to be used (as many as they would like)? Also How would you print to a file?

scanf("%s", user_filename);

    FILE *fp;
    fp = fopen (user_filename, "r");

I have tried doing various things to it but I can only get it to take one file.

Upvotes: 2

Views: 12440

Answers (1)

lurker
lurker

Reputation: 58244

The easiest way to pass some file names to your C program is to pass them as arguments to your C program.

Arguments are passed to a C program using the parameters to main:

int main( int argc, char *argv[] )
{
    ...
}

The value argc indicates how many parameters there are, and argv[] is an array of string pointers containing the arguments. Note that the first argument at index 0 (the string pointed to by argv[0]) is the command name itself. The rest of the arguments passed to the command are in argv[1], argv[2], and so on.

If you compile your program and call it like this:

my_prog foo.txt bar.txt bah.txt

Then the value of argc will be 4 (remember it includes the command) and the argv values will be:

argv[0] points to "my_prog"
argv[1] points to "foo.txt"
argv[2] points to "bar.txt"
argv[3] points to "bah.txt"

In your program then, you only need to check argc for how many parameters there are. If argc > 1, then you have at least one parameter starting at argv[1]:

int main( int argc, char *argv[] )
{
    int i;
    FILE *fp;

    // If there are no command line parameters, complain and exit
    //
    if ( argc < 2 )
    {
        fprintf( stderr, "Usage: %s some_file_names\n", argv[0] );
        return 1;  // This exits the program, but you might choose to continue processing
                   // the other files.
    }

    for ( i = 1; i < argc; i++ )
    {
        if ( (fp = fopen(argv[i], "r")) == NULL )
        {
            fprintf( stderr, "%s: Gah! I could not open file named %s!\n", argv[0], argv[i] );
            return 2;
        }

        // Do some stuff with file named argv[i], file pointer fp

        ...
        fclose( fp );
    }

    return 0;
}

This is just one of several different ways to do it (functionally and stylistically), depending upon how you need to process the files.

Upvotes: 3

Related Questions