Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

C read() function is reading in nothing

What I want this to do is get a char input which correlates to some menu options. If they enter o, they enter the filename to be opened.
My input is just ‘o’ followed by ctrl + d and it seems like the read() in getFileName is just reading in nothing. I thought it was reading in the eof marker but I tried setting the buffer to 2 and having menuOpt be an array of 2 chars but that didn’t work either so I don’t think it’s that.

int main(){
    char menuOpt;
    int readRes;
    char fileName[BUFF_FILENAME] = "";
    int fd;

    //displayMenu(0);
    
    while((readRes = read(STDIN_FILENO, &menuOpt, 1)) > 0){
        if(menuOpt == 'o'){
            fprintf(stdout, "Enter the file name: ");
            if(getFileName(fileName) > 0){
                readFile(&fd, fileName);
            }
        } 
        // else if(menuOpt == 'd'){
        //     fprintf(stdout, "do something");
        // } else {
        //     fprintf(stderr, "Invalid input\n");
        // }
    }

    printf("%d\n", readRes);

    return 0;
}

int getFileName(char fileName[BUFF_FILENAME]){
    int r = read(STDIN_FILENO, fileName, BUFF_FILENAME);
    printf("\nBytes read = %d\n", r);
    printf("and filename is %sx\n", fileName);
    if(r == 0){
        fprintf(stdout, "No file name entered\n");
    } else if(r < 0){
        fprintf(stderr, "There was an error reading the file name\n");
    } 

    return r;
}

if my input is JUST the char ‘o’ followed by ctrl + d I get this:

Current output mode: ASCII
ENTER:
"o" to enter a file name
"d" to select display mode
"x" to exit
oEnter the file name: 
Bytes read = 0
and filename is x
No file name entered

…and then it waits for some other input from the while loop in main().

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I am not entering anything after "Enter the file name:" it’s just reading what seems like nothing. Also the o just before "Enter the file name:" isn’t a typo, that’s just my input.

>Solution :

Here is example of how set the terminal to raw mode and read a byte.
You want to restore the previous mode before exit, say, using atexit().

#define _DEFAULT_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

static struct termios old;

void cleanup() {
    tcsetattr(STDIN_FILENO, 0, &old);
}

int main() {
    tcgetattr(STDIN_FILENO, &old);
    atexit(cleanup);

    struct termios new = old;
    cfmakeraw(&new);
    tcsetattr(STDIN_FILENO, 0, &new);
    char ch;
    read(STDIN_FILENO, &ch, 1);
    printf("%c\n", ch);
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading