ciolow-level

Low level I/O in C


I am trying to solve a problem from the K&R C programming book that requires one to write a low level I/O program which reads text from a file and prints it on screen, if no input file is given in the command line, it must take input from STDIN and print on the screen. I think I have solved the problem and my code is as given below:

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

void llfilecopy (int, int);

int main(int argc, char *argv[])
{
    int ifd, i = 1;
    printf("buffer = %d", BUFSIZ);

    if (argc == 1)
        llfilecopy (0, 1);

    else
    {
        while (--argc > 0)
        {
            if ((ifd = open(argv[i++], O_RDONLY, 0)) == EOF)
            {
                printf("cat: cant open %s\n", *argv);
                return 1;
            }
            else
            {
                llfilecopy (ifd, 1);
                printf ("\n\n");
                close(ifd);
            }

        }
    }
    return 0;
}
void llfilecopy (int ifd, int ofd)
{
    char buff [BUFSIZ];
    int n;

    while ((n = read (ifd, buff, BUFSIZ)) > 0)
    {
        if (write (ofd, buff, n) != n)
            printf ("cat: write error on stdout");
    }
}

However, I am facing a funny problem which I cannot account for. Notice the printf statement in line 3 after main(). If I use the following

printf("buffer = %d", BUFSIZ);

this printf is executed after printing the file on screen. If however I add a '\n' i.e.

printf("buffer = %d\n", BUFSIZ);

the printf is executed before printing the file to screen. Perhaps its just a silly mistake of mine. Can you please point out whats going wrong here? Thank you so much. I am using the online GDB - GCC C compiler https://www.onlinegdb.com/online_c_compiler#


Solution

  • Your target seems to be line buffered, meaning it won't update a line until it gets a "flush" instruction to move everything in the buffer to the screen.

    Flushing can be done in 3 ways: