Jump to content

programa que imprime para um bloco txt


magnos
 Share

Recommended Posts

boas. Tenho este codigo que escreve os dados num bloco de texto, mas nao esta a funcionar direito, sabem como corrigilo.

Desde ja obrigado.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{

   FILE *out;
   char a[65], b[65];
   out = fopen( "dados.txt", "w" );
   if( out == NULL ) {
       printf("ERRO: não consigo abrir o ficheiro dados.txt\n");
       exit(1);
   }

   printf("Digite o seu nome\n");
   scanf("%s", &a );
   printf("Digite a sua morada\n");
   scanf("%s", &b );
   fprintf( out, "Estes sao os seus dados:\n" );
   fprintf( out, "Nome: %s \n", a);
   fprintf( out, "Morada: %s \n", b);

   fclose( out );
   system("pause");
}
Link to comment
Share on other sites

para guardar uma string não se usa &. O scanf também é um bocado manhoso quando se trata de guardar string, utiliza o fgets 😕 . Mas o teu programa, compila, e executa direito no meu computador

Boa Sorte 🙂

Link to comment
Share on other sites

Porque em C uma string, não é nada mais nada menos, que um monte de variáveis do tipo que quiseres na memoria, e o numero que tu lhe das é nada mais nada menos que um ponteiro para essas mesma variáveis

Link to comment
Share on other sites

Magnos como tu me conheces pensei que poderia ajudar 😄

Como todos sabemos para uma string usa-se %s no scanf e no printf certo?

mas.....

eu descobri uma maneira melhor porque o %s não da para escrever "espaços"

Vamos usar o seguinte operador "%[]"

Graças a esta sequência de controlo, podemos escolher o que queremos ler. Dentro dos parenteses escrevemos os caracteres permitidos (ex: %[aeiou]) ou negados (ex: %[^aeiou]). Para lermos uma string podemos usar, por exemplo, %[^\n], que vai ler todos os caracteres até encontrar o \n neste caso (o \n não é incluído na string).

Se quisermos limitar o tamanho da string, podemos limitá-la antes do conjunto de caracteres a ler. Neste exemplo, vamos ler uma string com 60 caracteres no máximo: %60[^\n].

/* Ler os dados */
scanf("%[^\n]", str);
/* Limpar o buffer */
scanf("%*[^\n]"); scanf("%*c");
/* Voltar ao passo 1. */

A resposta ao código que tu querias é este

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
FILE *out;
char a[65], b[65];
out = fopen( "dados.txt", "w" );
if( out == NULL ) {
	printf("ERRO: não consigo abrir o ficheiro dados.txt\n");
	exit(1);
}

printf("Digite o seu nome\n");
scanf("%[^\n]", &a);// Insere um conjunto de caracteres
scanf("%*[^\n]"); scanf("%*c");// Limpa o buffer
printf("Digite a sua morada\n");
scanf("%[^\n]", &b);
scanf("%*[^\n]"); scanf("%*c");
fprintf( out, "Estes sao os seus dados:\n" );
fprintf( out, "Nome: %s \n", a);
fprintf( out, "Morada: %s \n", b);

fclose( out );
system("pause");
}
Link to comment
Share on other sites

O scanf também é um bocado manhoso quando se trata de guardar string, utiliza o fgets 🙂 . Mas o teu programa, compila, e executa direito no meu computador

Anda aqui a rodar muita informação confusa sobre como funciona o scanf e variantes. O scanf não é manhoso, só é preciso perceber como funciona que a manha dele desaparece toda. Usar o gets não é sempre uma boa escolha porque em algumas situações pode dar erro e causar comportamento imprevisto no programa, e atenção que fgets e gets não é a mesma coisa, o primeiro é para ler de ficheiros e o segundo para ler do stdin.

Não se usa o & porque uma string em C já é um apontador para um array de caracteres. É mais ou menos isto. 🙂

Não é mais ou menos isso, é mesmo isso, o scanf recebe um ponteiro como segundo parâmentro e uma "string" (que no c não é mais que um vector de caracteres) é um ponteiro para caracter logo não usa o operador & que é o operador que permite obter o endereço na memória de uma variável.

/* Ler os dados */
scanf("%[^\n]", str);
/* Limpar o buffer */
scanf("%*[^\n]"); scanf("%*c");
/* Voltar ao passo 1. */

Apesar de explicação do "%[^\n]" ter sido uma excelente explicação e resolver o problema da leitura de strings a parte de limpar o buffer (neste caso o stdin) foi complicada sem necessidade. Para garantir que o scanf funciona sem problemas basta adicionar um espaço em branco antes da % e isso garante que qualquer "em branco" no buffer seja eliminado, o "%[^\n]" garante que todos os outros são lidos. Por exemplo, em vez de fazer "%[^\n]" faz " %[^\n]"...

Não que eu goste de muito de escrever o código pelos outros, mas este faz o mesmo que o anterior:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{

   FILE *out;
   char a[65], b[65];
   out = fopen( "dados.txt", "w" );
   if( out == NULL ) {
       printf("ERRO: não consigo abrir o ficheiro dados.txt\n");
       exit(1);
   }

   printf("Digite o seu nome\n");
   scanf(" %[^\n]", &a); // Especial atenção ao espaço antes do %
   printf("Digite a sua morada\n");
   scanf(" %[^\n]", &b);
   fprintf( out, "Estes sao os seus dados:\n" );
   fprintf( out, "Nome: %s \n", a);
   fprintf( out, "Morada: %s \n", b);

   fclose( out );
   system("pause");
}
Link to comment
Share on other sites

Se não estou em erro, se usares o fgets() e como argumento inserires o STDIN  [x=fgets(stdin);] lês do standard input á mesma. Não esquecer que no C quase tudo são ficheiros... STDIN, STDOUT, STDERR, etc... (isto tb significa que podes fazer fputs(stdout) para escrever no ecrã)

Para limpar o buffer podes sempre usar a função FFLUSH()... acho que se não inserires qual o ficheiro de stream que queres limpar, ele limpa todos, mas podes espicificar se queres o STDIN, STDOUT, ou outro.

Não aconselho usar o espaço antes do conjunto de caracteres a ser recebido, quando usam o scanf... é preferível usar o FFLUSH antes de cada Scanf, visto que há situações em que isso cria erros (pode variar com o compilador, nos usávamos o Bloodshed DevC++, e eu tinha vários colegas que se queixavam de problemas no scanf por causa disso).

Acho que é tudo o que tenho para dizer.

Atenciosamente,

LordFokas

Link to comment
Share on other sites

desculpem o atraso pela minha resposta desde já obrigado a todos os que responderam, ajudaram e muito nos meus estudos.

agradeço por todas as soluções apresentadas que ajudaram a mim e aos meu colas de turma do curso de sistemas a todos obrigado.

P.S. desculpe as perguntas tão básicas já sabem como é com os novatos lol

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.