alphasil Posted April 22, 2012 at 05:19 PM Report #450546 Posted April 22, 2012 at 05:19 PM 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
alphasil Posted April 22, 2012 at 09:38 PM Author Report #450601 Posted April 22, 2012 at 09:38 PM 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
pmg Posted April 22, 2012 at 10:45 PM Report #450626 Posted April 22, 2012 at 10:45 PM 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!
Kleves zenn Posted April 23, 2012 at 12:09 PM Report #450699 Posted April 23, 2012 at 12:09 PM 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.
alphasil Posted April 23, 2012 at 02:14 PM Author Report #450724 Posted April 23, 2012 at 02:14 PM 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
pmg Posted April 23, 2012 at 02:32 PM Report #450734 Posted April 23, 2012 at 02:32 PM 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!
alphasil Posted April 23, 2012 at 02:57 PM Author Report #450753 Posted April 23, 2012 at 02:57 PM 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
alphasil Posted April 23, 2012 at 03:02 PM Author Report #450756 Posted April 23, 2012 at 03:02 PM Se tiver espaços faz isso.. Estranho... Se puser Clube? faz bem Se puser O teu Clube? não dá... gmc11
pmg Posted April 23, 2012 at 03:08 PM Report #450758 Posted April 23, 2012 at 03:08 PM 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!
alphasil Posted April 23, 2012 at 03:43 PM Author Report #450778 Posted April 23, 2012 at 03:43 PM 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
HappyHippyHippo Posted April 23, 2012 at 03:52 PM Report #450780 Posted April 23, 2012 at 03:52 PM scanf("%d",&per[n].id); o caracter '\n' ainda se encontra no stdin o pmg disse para usares o fgets .... fgets(buffer, buffer_size, stdin); sscanf("%d", &per[n].id); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted April 23, 2012 at 04:09 PM Author Report #450785 Posted April 23, 2012 at 04:09 PM 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
HappyHippyHippo Posted April 23, 2012 at 04:25 PM Report #450788 Posted April 23, 2012 at 04:25 PM e salta-me logo duas perguntas Introduza ID para a pergunta:Introduza a pergunta: no código que apresentas-te anteriormente é essa a ordem das perguntas : - Introduza ID - Introduza a pergunta não estou a ver onde está o erro ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted April 23, 2012 at 04:44 PM Author Report #450799 Posted April 23, 2012 at 04:44 PM Aparecem-me as duas de seguida só podendo escrever algo na segunda... gmc11
pmg Posted April 23, 2012 at 05:16 PM Report #450816 Posted April 23, 2012 at 05:16 PM 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!
alphasil Posted April 23, 2012 at 05:57 PM Author Report #450858 Posted April 23, 2012 at 05:57 PM 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!" gmc11
HappyHippyHippo Posted April 23, 2012 at 06:21 PM Report #450878 Posted April 23, 2012 at 06:21 PM 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 Portugol Plus
alphasil Posted April 23, 2012 at 06:37 PM Author Report #450884 Posted April 23, 2012 at 06:37 PM 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
pmg Posted April 23, 2012 at 06:52 PM Report #450893 Posted April 23, 2012 at 06:52 PM 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!
HappyHippyHippo Posted April 23, 2012 at 07:01 PM Report #450897 Posted April 23, 2012 at 07:01 PM Se tirar os & só tenho warnings nos dois inteiros.... desculpa ... foi do copy-paste IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now