user5319150
user5319150

Reputation:

passing arguments in main in c

I'm struggling with accepting an argument name and passing it along to the program I have made. I made C code (copy.c) which takes in the file name and prints out in a Linux console terminal. To put it easily, it works when I do:

./copy filename.txt

This works fine, same as what cat would produce.

However, it doesn't when I put:

./copy < filename.txt

So I figured that "<" must be interrupting the copy to take in the next argument which is the actual file name. I was trying to get around it by first making the main to accept "< filename.txt" to the first argument as a whole and later modify it to "filename.txt"

Is there any way to get around this? If it is "123 filename.txt" this works.

Here is my copy.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//#include <string.h>
#define bufferSize 200

int main(int argc, char* argv[])
{
    char buffer[bufferSize];
    int fd;
    int argu_no = 1;

    printf("%s %s\n\n", argv[0], argv[1]); //check for the argument names
    return 0;
}

And when I do "./copy 123 filename.txt":

123 filename.txt

appears.

But when I do "./copy < filename.txt"

(null) XDG_SESSION_ID=2231

comes out. Please help me the program to accept the entire "< filename.txt" as the first argument or to get around this.

I'm using GNU library on linux for C programming.

Upvotes: 3

Views: 482

Answers (1)

Jonathan Leffler
Jonathan Leffler

Reputation: 753475

The shell interprets:

./copy < filename.txt

and treats the < and filename.txt as instructions to set standard input to the named file, and these are not passed as arguments to your program. So this invocation runs ./copy with no extra arguments (and with standard input coming from the file instead of your terminal).

If you want the < passed as an argument (and the file name too), quote it:

./copy '<' filename.txt
./copy "<" filename.txt
./copy \<  filename.txt

If there are spaces in the file name, you need to quote that, too.

Upvotes: 7

Related Questions