I am trying to write a cat clone to exercise C, I have this code:
#include <stdio.h>
#define BLOCK_SIZE 512
int main(int argc, const char *argv[])
{
if (argc == 1) { // copy stdin to stdout
char buffer[BLOCK_SIZE];
while(!feof(stdin)) {
size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin);
fwrite(buffer, bytes, sizeof(char),stdout);
}
}
else printf("Not implemented.\n");
return 0;
}
I tried echo "1..2..3.." | ./cat
and ./cat < garbage.txt
but I don't see any output on terminal. What I am doing wrong here?
Edit: According to comments and answers, I ended up doing this:
void copy_stdin2stdout()
{
char buffer[BLOCK_SIZE];
for(;;) {
size_t bytes = fread(buffer, sizeof(char),BLOCK_SIZE,stdin);
fwrite(buffer, sizeof(char), bytes, stdout);
fflush(stdout);
if (bytes < BLOCK_SIZE)
if (feof(stdin))
break;
}
}
Ignore my comment about
fflush
; that's not the issue.Swap the order of the block size and the element size in the
fread
call. You want to read up to BLOCK_SIZE elements of size 1 (sizeof (char)
is 1 by definition); what you're doing is trying to read 1 element of size BLOCK_SIZE, so unless you type in at least BLOCK_SIZE characters,fread
will return 0. IOW, yourfread
call needs to beMake a similar change to the
fwrite
call.i can quote an answer by me: https://stackoverflow.com/a/296018/27800
Your problem appears to be the return value of fread. I modified your code to print out the value bytes, and I get 0 every time. The man page for fread makes it clear that the return value of fread is NOT the number of characters. If EOF is encountered the return value could be zero (which it is in this case). This is because you are attempting to read in 1 thing that is size BLOCK_SIZE rather than BLOCK_SIZE things that are size 1.
Try calling
fflush(stdout)
after thefwrite()