The simplest way is to read a character, and print it right after reading:
int c; FILE *file; file = fopen("test.txt", "r"); if (file) { while ((c = getc(file)) != EOF) putchar(c); fclose(file); }
c
is int
above, since EOF
is a negative number, and a plain char
may be unsigned
.
If you want to read the file in chunks, but without dynamic memory allocation, you can do:
#define CHUNK 1024 /* read 1024 bytes at a time */ char buf[CHUNK]; FILE *file; size_t nread; file = fopen("test.txt", "r"); if (file) { while ((nread = fread(buf, 1, sizeof buf, file)) > 0) fwrite(buf, 1, nread, stdout); if (ferror(file)) { /* deal with error */ } fclose(file); }
The second method above is essentially how you will read a file with a dynamically allocated array:
char *buf = malloc(chunk); if (buf == NULL) { /* deal with malloc() failure */ } /* otherwise do this. Note 'chunk' instead of 'sizeof buf' */ while ((nread = fread(buf, 1, chunk, file)) > 0) { /* as above */ }
Your method of fscanf()
with %s
as format loses information about whitespace in the file, so it is not exactly copying a file to stdout
.