Como ler dados de um arquivo em C?

Olá. Eu estou praticando I/O de dados em arquivos, e fiz um programa com um método para escrever em um arquivo txt e outro para ler os dados desse arquivo.
Porém, não estou conseguindo entender porque o método para ler os dados do arquivo e imprimi-los na tela não funciona.
Na verdade, ele imprime os dados do arquivo, mas ele pára quando encontra um espaço entre as palavras. O que há de errado? Eis meu código:

#include <stdio.h>
#include <stdlib.h>
//Lê os dados do arquivo externo e imprime na tela
void ler() {
	FILE *input;
	char buffer[128];
	input = fopen("output.txt", "r"); //abre o arquivo para leitura
    printf("\nConteudo do arquivo:\n\n");
	while(! feof(input)) {
		fgets(buffer, 128, input);
		printf("%s", buffer);
	}
	fclose(input);
}
//Escreve o texto digitado em um arquivo externo
void escrever(char *frase) {
	FILE *output;
	output = fopen("output.txt", "w"); //abre o arquivo para escrita
	if(output == NULL) {
		printf("Não foi possivel abrir o arquivo\n");
	}
	fprintf(output, "%s", frase);
	fclose(output);
	ler();
}

int main(void) {
	char frase[128];
	printf("Escreva uma frase:\n");
	scanf("%s", &frase);
	escrever(frase);
	return 0;
}

Gostaria de saber também qual é a diferença entre passar o parâmetro char *frase e o char frase[ ] para o método escrever();

Obrigado pela ajuda.

E aí cara, faz um tempo que não lido com C, mas pelo que me lembro, tenta fazer a exibição dos dados da seguinte forma:

char c;

if( (output=fopen(nome,"r"))==NULL ) {
    printf("Arquivo não pode ser aberto\n");
    exit(1);
}

while( 1 ) {
    c = fgetc(output);
    if( feof(output) ){
        break;
    }

    putchar(c);
}

fclose(output);

O seu problema é que scanf ("%s") lê não uma string inteira, mas algo que termina em um espaço ou ENTER. Por exemplo, digamos que você digite:

Alo, mundo!

com scanf. Ele vai ler apenas “Alo,” e deixar no buffer do teclado o resto da linha.

[quote=entanglement]O seu problema é que scanf ("%s") lê não uma string inteira, mas algo que termina em um espaço ou ENTER. Por exemplo, digamos que você digite:

Alo, mundo!

com scanf. Ele vai ler apenas “Alo,” e deixar no buffer do teclado o resto da linha. [/quote]
Acabei de resolver o problema do scanf.
Eu usei o método fgets(frase, STRSIZE, stdin);
para armazenar o valor. Está funcionando. Porém, eu preciso de um método para escrever os dados na tela, visto que usar

while(! feof(input)) { está errado, conforme dizem nesse site: http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong. Ele entra no loop 2 vezes.
Qual técnica uso para imprimir os caracteres do arquivo? Meu código:

#include <stdio.h>
#include <stdlib.h>
#define STRSIZE 128
void ler() {
    FILE *input;
    char buffer[128];
    input = fopen("output.txt", "r"); //abre o arquivo para leitura
    if(input == NULL) {
		printf("Não foi possivel abrir o arquivo\n");
		return 1;
	}
    printf("\nConteudo do arquivo:\n\n");
    while(! feof(input)) { //Esse loop deve ser substituído
        fgets(buffer, 128, input);
        printf("%s", buffer);
    }
    fclose(input);
}

void escrever(char *frase) {
	FILE *output;
	output = fopen("output.txt", "w");
	fprintf(output, "%s", frase);
	fclose(output);
	ler();
}

int main(void) {
	char frase[STRSIZE];
	printf("Escreva uma frase:\n");
	//scanf("%s", &frase);
	fgets(frase, STRSIZE, stdin);
	escrever(frase);
	return 0;
}

Tradicionalmente, usa-se:

char buffer[1024];
while (fgets (buffer, sizeof(buffer), input)) {
     fputs (buffer, output);
}

http://www.cplusplus.com/reference/cstdio/fputs/