0

I want to pass an argument of a specific file location using realpath() (example: /var/log/message) and by using fprintf print the content of this file on the terminal. This is the code I have so far:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    if (argc < 2) {
        printf("Usage: %s <path>\n", argv[0]);
        return 1;
    }
    char *fullpath = realpath(argv[1], NULL);
    FILE *fptr;
    fptr = fopen(fullpath, "r");
    fprintf(fptr, "%s");
    return 0;
}

It doesn't throw errors, but it also doesn't do what I want it to do. When I run it e.g. ./test /var/log/message it will show me this on the terminal:

Segmentation fault (core dumped)

OS version

NAME="Fedora Linux"
VERSION="36

Compiler

gcc
tuatara
  • 23
  • 3
  • 2
    With `fprintf(fptr, "%s");` you attempt to write *to* the file, not read from it. There should be plenty of tutorials on how to read files all over the Internet, not to mention that any decent text-book should have chapters about it. – Some programmer dude Jul 10 '22 at 12:09
  • 2
    As for the problems, have you checked what the functions you call actually *returns*? Both `realpath` ad `fopen` might fail, you need to check for that. – Some programmer dude Jul 10 '22 at 12:26
  • Please clarify your specific problem or provide additional details to highlight exactly what you need. As it's currently written, it's hard to tell exactly what you're asking. – Community Jul 10 '22 at 12:51
  • 1
    Not only does `fprintf(fptr, "%s");` write, it's undefined behavior (That can but doesn't have to segfault) because you don't have a string argument for the `%s` format. – Shawn Jul 10 '22 at 12:51
  • 1
    You don't normally need to use `realpath()` to open files specified on the command line. Simply pass `argv[1]` to `fopen()`. If you are not going to loop over all the command-line arguments, you should check for `if (argc != 2)`. You should report errors on standard error, not standard output. – Jonathan Leffler Jul 10 '22 at 12:56
  • Not only is `fprintf(fptr, "%s");` writing to a file opened for reading only, it is writing a string, but not specifying which string to write. The code here is deeply flawed. Rethink from the ground up. Check that the function calls all work before using the results. – Jonathan Leffler Jul 10 '22 at 13:58
  • Will go back to read more documentation. Thanks all for your comments. – tuatara Jul 11 '22 at 05:51

1 Answers1

0

Got back to my function and added some more functionality and now it's working by adding argument for it. What I had to do is to declare that fptr is FILE and c is character type, running a while loop over the file and print its content and with using fgetc stream that content to the terminal.

Current code:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    FILE *fptr;
    char c;
    if (argc < 2) {
        printf("You need to grant an arg to %s <path>\n", argv[0]);
        return 1;
    }
    char *fullpath = realpath(argv[1], NULL);
    fptr = fopen(fullpath, "r");
    if (fptr == NULL)
    {
        printf("Cannot open file \n");
        free(fptr);
        exit(0);
    }
    c = fgetc(fptr);
    while (c != EOF)
    {
        printf ("%c", c);
        c = fgetc(fptr);
    }
    fclose(fptr);
    return 0;
}

Thanks all for your assistance.

tuatara
  • 23
  • 3