Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading a file from stdin

It's been years since I programmed in C, and so I've been struggling a lot just to do a simply "get filename & path from stdin, read file, print file to stdout" task, which I know shouldn't be that hard but ya. Here is my code:

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

int main(void) {
    int c;
    FILE *file;
    //scanf("%s", filename);
    char *filename;
    filename = (char *)malloc(200 * sizeof(char));

    read(STDIN_FILENO, filename, 200);


    printf("%s", filename);

    file = fopen(filename, "r");

    if (file) {
        while ((c = getc(file)) != EOF)
            putchar(c);
        fclose(file);
    } else {
        printf("File not found.");
    }
    printf("\n");

    return(0);
}

I my code continues to simply print out File not found., when I know for a fact my file path and everything is correct (not only because I literally drop it and past it into terminal from my folder with Mac OSX El Capitan - what a lovely feature, but also) because I had a different version of this program using scanf which found the file and read it perfectly fine, (as you can see I have it commented out on my code).

There is another program I'm writing that just uses this one, and I got rid of the scanf because I think it was negatively affecting other things in that program, so I want to be able to use read()

If anyone has any advice on how I can fix this or why this isn't working, that would be greatly appreciated as I've been at this for hours already and would very much like to move on to my actual program that I need to code!

THANKS A BUNCH

like image 221
k1234 Avatar asked May 25 '16 02:05

k1234


People also ask

Can you read from stdin?

There are different functions used for reading the stdin. In this write-up, we have used different functions used to read a line. The built-in function in c programming is getline() which is used for reading the lines from the stdin. But we can also use other functions like getchar() and scanf() for reading the lines.

Does scanf read from stdin?

The scanf() function reads data from the standard input stream stdin into the locations given by each entry in argument-list. Each argument must be a pointer to a variable with a type that corresponds to a type specifier in format-string.

Is stdin a file in C?

Short for standard input, stdin is an input stream where data is sent to and read by a program. It is a file descriptor in Unix-like operating systems, and programming languages, such as C, Perl, and Java. Below, is an example of how STDIN could be used in Perl.


1 Answers

You must remove the '\n' new line character that is being read and stored into the filename buffer.

One of the many was to do it is include string.h and after reading the filename

char *newline = strchr(filename, '\n');
if (newline != NULL)
    *newline = '\0';

Also, use fgets() instead of read() because that way the program is more portable. And more importantly, read() will not add the null terminator which is very important in order to use the buffer as a string — to pass it to fopen() for example — correctly. If you want to use read try something like this

ssize_t length;
char filename[200];
length = read(STDIN_FILENO, filename, sizeof(filename) - 1);
if (length <= 0)
    return -1; // No input or input error
if (filename[length] == '\n')
    filename[--length] = '\0';
else
    filename[length] = '\0';

But otherwise, try this which is simpler

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

#include <string.h>

int main(void) 
{
    FILE *file;
    char filename[200];
    char *newline;   

    if (fgets(filename, sizeof(filename), stdin) == NULL)
        return -1; // Input error / EOF
    newline = strchr(filename, '\n');
    if (newline) // ? is a newline present?
        *newline = '\0';
    printf("**%s**\n", filename); // ** will help checking for
                                  //    the presence of white spaces.

    file = fopen(filename, "r");
    if (file) {
        int chr;
        while ((chr = fgetc(file)) != EOF)
            fputc(chr, stdout);
        fclose(file);
    } else {
        printf("File not found.");
    }
    printf("\n");

    return 0;
}
like image 183
Iharob Al Asimi Avatar answered Oct 17 '22 23:10

Iharob Al Asimi