In C, how should I read a text file and print all strings
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
.
There are plenty of good answers here about reading it in chunks, I'm just gonna show you a little trick that reads all the content at once to a buffer and prints it.
I'm not saying it's better. It's not, and as Ricardo sometimes it can be bad, but I find it's a nice solution for the simple cases.
I sprinkled it with comments because there's a lot going on.
#include <stdio.h>#include <stdlib.h>char* ReadFile(char *filename){ char *buffer = NULL; int string_size, read_size; FILE *handler = fopen(filename, "r"); if (handler) { // Seek the last byte of the file fseek(handler, 0, SEEK_END); // Offset from the first to the last byte, or in other words, filesize string_size = ftell(handler); // go back to the start of the file rewind(handler); // Allocate a string that can hold it all buffer = (char*) malloc(sizeof(char) * (string_size + 1) ); // Read it all in one operation read_size = fread(buffer, sizeof(char), string_size, handler); // fread doesn't set it so put a \0 in the last position // and buffer is now officially a string buffer[string_size] = '\0'; if (string_size != read_size) { // Something went wrong, throw away the memory and set // the buffer to NULL free(buffer); buffer = NULL; } // Always remember to close the file. fclose(handler); } return buffer;}int main(){ char *string = ReadFile("yourfile.txt"); if (string) { puts(string); free(string); } return 0;}
Let me know if it's useful or you could learn something from it :)
Instead just directly print the characters onto the console because the text file maybe very large and you may require a lot of memory.
#include <stdio.h>#include <stdlib.h>int main() { FILE *f; char c; f=fopen("test.txt","rt"); while((c=fgetc(f))!=EOF){ printf("%c",c); } fclose(f); return 0;}