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
1 Answer 1
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.
3 Comments
NULL to realpath as second argument it does a malloc() for the return value. So, you have to free it, once you are done with it.fgetc() returns int, not char. The value of EOF does not fit into a char.
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.realpathadfopenmight fail, you need to check for that.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%sformat.realpath()to open files specified on the command line. Simply passargv[1]tofopen(). If you are not going to loop over all the command-line arguments, you should check forif (argc != 2). You should report errors on standard error, not standard output.