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/