Jump to content

Problema escrita de ficheiro - Vazio


Recommended Posts

Posted

Olá

Tenho uma estrutura

struct perg           /* Estrutura Questões */
{
  char ques[200];
  int id;
  char op1[200];
  char op2[200];
  char op3[200];
  char op4[200];
  int res;
}qe;

e uma função que vai usar esta estrutura

[code=c]
void ad_perguntas()
{
 FILE *perguntas;
 char c;

 perguntas=fopen("perguntas.txt","a+");
 if (!perguntas)
 {
	 printf("Ficheiro não encontrado  \n");
			 return 1;
 }
                      printf("ID da pergunta:-> ");
                      scanf("%d",&qe.id);
                      fflush(stdin);
                      printf("\nIntroduza a pergunta: ");
                      scanf("%s",qe.ques);
                      fflush(stdin);
                      printf("\nOPÇÃO 1 :");
                      scanf("%s",qe.op1);
                      fflush(stdin);
                      printf("\nOPÇÃO 2 :");
                      scanf("%s",qe.op2);
                      fflush(stdin);
                      printf("\nOPÇÃO 3 :");
                      scanf("%s",qe.op3);
                      fflush(stdin);
                      printf("\nOPÇÃO 4 :");
                      scanf("%s",qe.op4);
                      printf("\nIntroduza o número da resposta correta: ");
                      scanf("%d",qe.res);
                      fflush(stdin);
                      fwrite(&qe, sizeof(struct perg), 1, perguntas);
                      printf("Introduzir mais perguntas?(S/N)");
                      scanf("%c",&c);
                      if(c=='n' || c=='N')
                      {
                    	  menu_admin();
                      }
                      else
                      {
                    	  ad_perguntas();
                      }
                    fclose(perguntas);
                    }

Tenho dois problemas, o 1º é que não escreve nada no ficheiro 😄

O 2º é que a pergunta se quero voltar a introduzir mais não aparece..

Alguma dica?'

Obrigado

gmc11

 

Posted

Olá

A escrita já está resolvida só que os carateres aparecem-me assim no ficheiro.

\00\00\00clube?\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00madrid\00\00\00\00\00\00\00\00ancora\00\00\00\00\00\00\00\00\00laje\00\00\00\00\00\00\00\00\00\00\00afife\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00

Suponho que será por estar em arrays.

struct perg* per;
int quantos;
 printf("Quantos registos quer criar?: ");
    scanf("%i", &quantos);
    per = malloc(sizeof(struct perg) * quantos);
    int n;
    for (n = 0; n < quantos; n++)
    {
    	printf("Introduza ID para a pergunta: \n");
    		scanf("%d",&per[n].id);
    		printf("Introduza a pergunta: \n");
    		scanf("%s",per[n].ques);
    		fflush(stdin);
    		printf("Opção 1 : \n");
    		scanf("%s",per[n].op1);
    		fflush(stdin);
    		printf("Opção 2 :\n");
    		scanf("%s",per[n].op2);
    		fflush(stdin);
    		printf("Opção 3 : \n");
    		scanf("%s",per[n].op3);
    		fflush(stdin);
    		printf("Opção 4 : \n");
    		scanf("%s",per[n].op4);
    }
    FILE* data;
       if ( (data = fopen("data.txt", "wb")) == NULL )
       {
           printf("Erro \n");
           return 1;
       }

       fwrite(per, sizeof(struct perg) * quantos, 1, data);
       fclose(data);

       return 0;
   }

Como faço para aparecer tudo numa linha??

cumps

gmc11

 

Posted

Em vez de imprimires com o fwrite imprime com o fprintf

fprintf(data, "%s - %d - %s|%s|%s|%s|%d\n",
      per.ques, per.id, per.op1, per.op2, per.op3, per.op4, per.res);

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Olá

Numa estrutura “struct”, não precisa dar o nome no fim da estrutura. Apenas no início:

struct perg           /* Estrutura Questões */
{
  char ques[200];
  int id;
  char op1[200];
  char op2[200];
  char op3[200];
  char op4[200];
  int res;
}

A não ser no ”typedef struct”, é necessário que seja no fim: 

typedef struct           /* Estrutura Questões */
{
___________
___________
_____________
}NO;


Tinhas de declarar a estrutura :
como não sei o nome da estrutura, vai ser No

No  qe; // semelhante a int x;

[code=c]// Não entendi pra quê que serve ;
void ad_perguntas()
{
 FILE *perguntas;

              if((perguntas=fopen("perguntas.txt","a"))==NULL);
               printf("Erro======FIchero vazio"); // Sem necessidade de retornar;
else
    fprintf(perguntas," %d\t%s\t%s\t%s\t%s\t%s\t%d" ,qe.id,qe.ques,qe.op1,qe.op2,qe.op3,qe.op4,qe.res);//Para guardar no ficheiro;
    
  fclose(perguntas);
}

//Esta função e´ para atualizar o ficheiro. Pesquisa melhor para perceberes, principalmente a chaves de funcionamento de ficheiros://
Modo Significado 
"r" Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto. 
"w" Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído.  
"a" Abrir um arquivo texto para gravação. Os dados serão adicionados no fim do arquivo ("append"), se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente. 
"rb" Abre um arquivo bin•rio para leitura. Igual ao modo "r" anterior, só que o arquivo é bin•rio. 
"wb" Cria um arquivo bin•rio para escrita, como no modo "w" anterior, só que o arquivo é bin•rio. 
"ab"  Acrescenta dados bin•rios no fim do arquivo, como no modo "a" anterior, só que o arquivo é bin•rio. 
"r+" Abre um arquivo texto para leitura e  gravação. O arquivo deve existir e pode ser modificado. 
"w+" Cria um arquivo texto para leitura e  gravação. Se o arquivo existir, o conteúdo anterior será destruído. Se não existir, será criado. 
"a+" Abre um arquivo texto para gravação e leitura. Os dados serão adicionados no fim do arquivo se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente. 
"r+b" Abre um arquivo bin•rio para leitura e escrita. O mesmo que "r+" acima, só que o arquivo é bin•rio. 
"w+b" Cria um arquivo bin•rio para leitura e escrita. O mesmo que "w+" acima, só que o arquivo é bin•rio.
"a+b" Acrescenta dados ou cria uma arquivo bin•rio para leitura e escrita. O mesmo que
"a+" acima, só que o arquivo é bin•rio.

Manda-me o resultado.  




                      
Posted

Para PMG

mudando aquela linha que me disseste aparece assim no ficheiro

0 - A - ||Œ|Œ

e tive de mudar a linha para

f

printf(data, "%d - %s - %s|%s|%s|%s\n",per[n].id, per[n].ques, per[n].op1, per[n].op2, per[n].op3, per[n].op4);

senão dava erro

gmc11

 

Posted

Experimenta refazer o ciclo do n antes de imprimires

for (n = 0; n < quantos; n++) {
    fprintf(data, "...\n", per[n].id, ...);
]

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Olá

Assim já aparece o texto mas tou na mesma com um problema

Ao introduzir perguntas

Quantos registos quer criar?: 1

Introduza ID para a pergunta:

1

Introduza a pergunta:

Quem ganhou campeonato espanhol 2010/2011?

Opção 1 :

Opção 2 :

Opção 3 :

Opção 4 :

Introduza o número da resposta correta:

aparece-me tudo junto agora...já mudei o array da ques para 200 e mesmo assim aparece tudo

truct perg           /* Estrutura Questões */
{
  int id;
  char ques[200];
  char op1[15];
  char op2[15];
  char op3[15];
  char op4[15];
  int res;

//função para adcionar perguntas num ficheiro
void ad_perguntas()
{
struct perg* per;
int quantos;
 printf("Quantos registos quer criar?: ");
    scanf("%i", &quantos);
    per = malloc(sizeof(struct perg) * quantos);
    int n;
    for (n = 0; n < quantos; n++)
    {
    	printf("Introduza ID para a pergunta: \n");
    		scanf("%d",&per[n].id);
    		printf("Introduza a pergunta: \n");
    		scanf("%s",per[n].ques);
    		fflush(stdin);
    		printf("Opção 1 : \n");
    		scanf("%s",per[n].op1);
    		fflush(stdin);
    		printf("Opção 2 :\n");
    		scanf("%s",per[n].op2);
    		fflush(stdin);
    		printf("Opção 3 : \n");
    		scanf("%s",per[n].op3);
    		fflush(stdin);
    		printf("Opção 4 : \n");
    		scanf("%s",per[n].op4);
    		printf("Introduza o número da resposta correta: \n");
    		scanf("%d",per[n].res);
    }
    FILE* data;
       if ( (data = fopen("data.txt", "a")) == NULL )
       {
           printf("Erro \n");
       }
       for (n = 0; n < quantos; n++)
       {
       fprintf(data, "%d - %s - %s|%s|%s|%s | Resposta correta: %d \n",per[n].id, per[n].ques, per[n].op1, per[n].op2, per[n].op3, per[n].op4);
       fclose(data);
       menu_admin();
       }
   }


};

Não estou a perceber agora...se for pergunta pequena dá..

gmc11

 

Posted

Em vez do scanf() usa fgets() (e apaga o ENTER que o fgets guarda).

Pesquisa no forum (e/ou na internet) que há certamente descrições mais detalhadas. Basicamente o fgets lê tudo, e o scanf() com o formato "%s" lê o que não é espaços em branco.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Olá

Já alterei e funciona parcialmente.

printf("Introduza ID para a pergunta: \n");
    	    scanf("%d",&per[n].id);
    		printf("Introduza a pergunta: \n");
    		fgets(per[n].ques, sizeof(struct perg), stdin);
    		fflush(stdin);
    		printf("Opção 1 : \n");
    		fgets(per[n].op1, sizeof(struct perg), stdin);
    		fflush(stdin);
    		printf("Opção 2 :\n");
    		fgets(per[n].op2, sizeof(struct perg), stdin);
    		fflush(stdin);
    		printf("Opção 3 : \n");
    		fgets(per[n].op3, sizeof(struct perg), stdin);
    		fflush(stdin);
    		printf("Opção 4 : \n");
    		fgets(per[n].op4, sizeof(struct perg), stdin);
    		printf("Introduza o número da resposta correta: \n");
    		scanf("%d",&per[n].res);
    }

Se escolher a opção para inserir perguntas faz-me isto

Quantos registos quer criar?: 1

Introduza ID para a pergunta:

1

Introduza a pergunta:

Opção 1 :

fffd

Ou seja, depois de introduzir o id da pergunta salta logo para a opção 1...

Que cena mais marada...

gmc11

 

Posted

Quer assim

fgets(&per[n].id, sizeof(struct perg), stdin);

quer assim

fgets(per[n].id, sizeof(struct perg), stdin);

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default]

e salta-me logo duas perguntas

Introduza ID para a pergunta:Introduza a pergunta:

gmc11

 

Posted

Substitui todos os scanf por fgets, mas todos mesmo!.

Deixa de usar o fflush(stdin) que ja nao é necessario (alem de invalido em todos os compiladores/sistemas operativos excepto no Windows).

Outra coisa... o tamanho do array a mandar para o fgets, nao é o tamanho da estrutura completa; é o tamanho de cada membro!

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Oi

ao mudar tudo dá-me nas duas variáveis de inteiros (id e res) este warning e não me funciona.

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default]

fgets(&per[n].res, sizeof(struct perg), stdin);

E não percebi a parte de:

"o tamanho do array a mandar para o fgets, nao é o tamanho da estrutura completa; é o tamanho de cada membro!"

:wallbash:

gmc11

 

Posted

se não percebes a função fgets, lê a documentação

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

printf("Introduza ID para a pergunta: \n");
fgets(&per[n].id, sizeof(int), stdin);
printf("Introduza a pergunta: \n");
fgets(&per[n].ques, 200, stdin);
printf("Opção 1 : \n");
fgets(&per[n].op1, 200, stdin);
printf("Opção 2 :\n");
fgets(&per[n].op2, 200, stdin);
printf("Opção 3 : \n");
fgets(&per[n].op3, 200, stdin);
printf("Opção 4 : \n");
fgets(&per[n].op4, 200, stdin);
printf("Introduza o número da resposta correta: \n");
fgets(&per[n].res, sizeof(int), stdin);
IRC : sim, é algo que ainda existe >> #p@p
Posted

Obrigado pela documentação

Estive a ler e segui o teu exemplo mas com o código que me mandaste dá-me os warnings na mesma

Description Resource Path Location Type

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default] Trabalho Final.c /Trabalho Final/src line 56 C/C++ Problem

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default] Trabalho Final.c /Trabalho Final/src line 58 C/C++ Problem

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default] Trabalho Final.c /Trabalho Final/src line 60 C/C++ Problem

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default] Trabalho Final.c /Trabalho Final/src line 62 C/C++ Problem

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default] Trabalho Final.c /Trabalho Final/src line 64 C/C++ Problem

passing argument 1 of ‘fgets’ from incompatible pointer type [enabled by default] Trabalho Final.c /Trabalho Final/src line 66 C/C++ Problem

Se tirar os  & só tenho warnings nos dois inteiros....

Há algo de mais estranho nisso??

😄

gmc11

 

Posted

Para os membros que sao strings (repara que o tamanho especifica o tamanho do array, nao o tamanho da estrutura toda):

fgets(per[n].id, sizeof per[n].id, stdin);

Para os membros que sao inteiros

fgets(tmp, sizeof tmp, stdin);
per[n].ques = strtol(tmp, NULL, 10);

Para ambos os casos falta validar se o resultado de fgets foi NULL.

No segundo caso falta validar o resultado de strtol.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

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
×
×
  • 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.