Самый простой способ - прочитать символ и распечатать его сразу после прочтения:
int c;
FILE *file;
file = fopen("test.txt", "r");
if (file) {
while ((c = getc(file)) != EOF)
putchar(c);
fclose(file);
}
c
- это int
выше, поскольку EOF
- отрицательное число, а обычное char
может быть unsigned
.
Если вы хотите прочитать файл порциями, но без динамического выделения памяти, вы можете сделать:
#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);
}
Второй метод, описанный выше, по сути, заключается в том, как вы будете читать файл с динамически размещенным массивом:
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 */
}
Ваш метод fscanf()
с форматом %s
теряет информацию о пробелах в файле, поэтому он не копирует файл точно в stdout
.