krad99 0 Denunciar post Postado Junho 5, 2008 Segue o codigo abaixo instavel, ninguem sabe por que, 3 professores da minha faculdade olharam e nao sabem por que se alguem conseguir resolver eu vou fik bastante agredecido.funciona e nao funciona...ou seja funciona qdo quer...esse programa parte do principio q um aviao sai de recife e vai para algum canto...porem você deve cadastrar um passageiro e uma poltrona mas antes de inserir alguem na poltrona você deve checar se a poltrona jah esta ocupada...logo qdo eu coloco um if para o resultado da poltrona isso qdo pega por q as vezes ele nem roda[abre e fecha]...enfim já tentei de tdo mas nao consigo nda =p...totamente instavel o programa... CODE #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define tagpoa "<poltrona>" #define tagpof "</poltrona>" #define tagpaa "<passageiro>" #define tagpaf "</passageiro>" int continuar; int flag; FILE *parquivo; //ponteiro para arquivo void abre_arquivo() { if ((parquivo = fopen("aviao.txt","r+b"))== NULL) parquivo = fopen("aviao.txt","w+b"); } int procura(char p[20]){ int i,x; char textoArquivo[100]; char linha; char val[10]; char poltrona[2]; char aux[1]; char aux2[2]; x = 10; for(i = 0; !feof(parquivo);i++){ //incrementa 'i' enquando não for fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteres while(textoArquivo[x] != '<'){ fflush(stdin); aux[1] = textoArquivo[x]; strcat(poltrona,aux); strcat(aux2,poltrona); ++x; } if(strstr(aux2,p)){ return 1; } continue; //volta ao inicio do loop sem executar o resto } return 0; } void cadastrar(){ int ie; char entrada[30]; char entrada2[30]; printf("\n Cadastrar Novo Aluno\n\n"); printf("\n\tNome do Aluno.....: "); gets(entrada); printf("\n\tNome do Aluno.....: "); gets(entrada2); ie = procura(entrada2); printf("%d",ie); char aux_tagpoa[60] = tagpoa; char aux_tagpaa[60] = tagpaa; strcat(aux_tagpoa,entrada2); strcat(aux_tagpaa,entrada); strcat(aux_tagpoa,aux_tagpaa); strcat(aux_tagpoa,tagpaf); strcat(aux_tagpoa,tagpof); char *xml = aux_tagpoa; printf("%-20s",xml); fseek(parquivo,0,SEEK_END); fwrite(xml,strlen(xml),1, parquivo); getch();} main(){ abre_arquivo(); cadastrar(); getch(); } Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Junho 5, 2008 Peça para seus professores se aposentarem! Erros: char poltrona[2];Tu tá entupindo a string de caracteres com strcat. Se ficar com dois caracteres, depois da segunda passada no loop de leitura, já estourou e tchau.Tente assim: char poltrona[100];aux2 também: char aux2[100];Aliás, você tem que inicializar as strings, senão vai pegar lixo depois:Aliás, quanto ao aux[1], cadê o espaço pro caractere nulo??? char poltrona[100] = ""; char aux[2] = " "; char aux2[100] = ""; for(i = 0; !feof(parquivo);i++)while(!feof(parquivo)) nunca faça isso!!!feof só retorna que acho o EOF DEPOIS que já leu o dito cujo!!! for(i = 0;;i++) fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteresAlém de fazermos uma comparação com NULL para determinar o fim do loop nessa parte, ainda tem um problema: lê só 99 caracteres!!!!! O último tem que ser o caractere null que termina a string!! if(fgets(textoArquivo, 100, parquivo) == NULL) //PEGA 99!!!!!!! O ULTIMO TEM QUE SER USADO COMO CARACTERE NULL!!!!! { break; } while(textoArquivo[x] != '<') { fflush(stdin); aux[1] = textoArquivo[x]; strcat(poltrona,aux); strcat(aux2,poltrona); ++x; } Pra que fflush(stdin)? aux[1] não, array começa em 0!!!! while(textoArquivo[x] != '<') { aux[0] = textoArquivo[x]; strcat(poltrona, aux); strcat(aux2,poltrona); ++x; } if ((parquivo = fopen("aviao.txt","r+b"))== NULL) parquivo = fopen("aviao.txt","w+b");Você não está escrevendo dados binários porque você abre os arquivos com b?Não precisa insistir no arquivo, se der NULL basta retornar a função e nas outras verificar se o arquivo foi carregado ou não. if ((parquivo = fopen("aviao.txt","r+b")) == NULL) return; gets(entrada); gets(entrada2);Não use gets, use fgets ao invés disso, é mais confiável: fgets(entrada, 30, stdin); gets(entrada2, 30, stdin); Acho que isso é tudo. Compartilhar este post Link para o post Compartilhar em outros sites
krad99 0 Denunciar post Postado Junho 5, 2008 http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif vlw cara...assim q eu sair do trabalho eu vo tentar...eu nao tenho mtos conhecimentos em c nao infelizmente...ai nem meus professores souberam ajudar mas você ajudou mto...faz mto sentido oq você falou...alias faz tdo sentido...mto obrigado tenho so mais duvidasinha? for(i = 0;;i++) esse `for` vai rodar ateh o fim do arquivo pois ele vai rodar ateh q a linha seja nula nao eh isso? for(i = 0; !feof(parquivo);i++) while(!feof(parquivo)) nunca faça isso!!! for(i = 0;;i++) fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteres Além de fazermos uma comparação com NULL para determinar o fim do loop nessa parte, ainda tem um problema: lê só 99 caracteres!!!!! O último tem que ser o caractere null que termina a string!! CODE if(fgets(textoArquivo, 100, parquivo) == NULL) //PEGA 99!!!!!!! O ULTIMO TEM QUE SER USADO COMO CARACTERE NULL!!!!! { break; } MTO OBRIGADO MSMO CARA VOCE ME SALVOU eu vo dizer pra eles se aposentarem skUHSUK Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Junho 5, 2008 Isso mesmo, o loop não tem condição de parada, porém tem no fgets ali um break pra quando ler EOF, parar! (o break sai do loop) Compartilhar este post Link para o post Compartilhar em outros sites
Cerrito 0 Denunciar post Postado Junho 5, 2008 Cara só por curiosidade, qual a faculdade que você faz e onde :) só pra saber, fiquei com medo dos seus professores, isso é preocupante, você como aluno tem todo direito de cometer esses e outros erros que por ventura venha a comenter, mas agora professores universitários não de depararem com erros como esse, isso sim é preocupante... cara abraços e tomara que seu programa rode depois das dicas do nosso colega :) abraços Marcio Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Junho 6, 2008 assim num vo falar q é 'facil' fazer esse algoritmo, + seus professores naum sabarem explicar certos tipos de coisas basicas como um loop sem condição de parada ow algo assim é d+! []'s Compartilhar este post Link para o post Compartilhar em outros sites
krad99 0 Denunciar post Postado Junho 7, 2008 eu definitivamente nao tenho talento pra c++...preciso de ajuda mais uma vez...talvez seja algo pikeno...e eu nao estou vendo pq tow de cabeça quente...enfim desde jah eu pesso desculpas por gastar o tempo de vcs e vamo ao problema...ele roda tdo certo agora o char vem limpo....mas o char P q eh o parametro da funcao vai sujo tem mais como eu tow montando nao taw passando a linha...se tiver mais de 1 registro no arquivo o programa indoida..enfim se puderem me ajudar fikrei mto grato novamente...segue o codigo: CODE #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define tagpoa "<poltrona>" #define tagpof "</poltrona>" #define tagpaa "<passageiro>" #define tagpaf "</passageiro>" int continuar; int flag; FILE *parquivo; //ponteiro para arquivo void abre_arquivo() { if ((parquivo = fopen("aviao.txt","r+b"))== NULL) parquivo = fopen("aviao.txt","w+b"); } int procura(char p[20]){ int i,x; char textoArquivo[100]; char poltrona[100] = ""; char aux[2] = " "; char aux2[100] = ""; x = 10; for(i = 0;;i++){ if(fgets(textoArquivo, 100, parquivo) == NULL){ break; }else{ fgets(textoArquivo, 100, parquivo); //pega uma string de 100 caracteres while(textoArquivo[x] != '<'){ puts(textoArquivo); aux[0] = textoArquivo[x]; strcat(poltrona,aux); ++x; } if(strstr(poltrona,p)){ return 1; }else{ continue; } } return 0; } } void cadastrar(){ int ie; char entrada[30]; char entrada2[30]; printf("\n Cadastrar Novo Aluno\n\n"); printf("\n\tNome do Aluno.....: "); fgets(entrada, 30, stdin); printf("\n\tNome do Aluno.....: "); fgets(entrada2, 30, stdin); ie = procura(entrada2); printf("%d",ie); char aux_tagpoa[60] = tagpoa; char aux_tagpaa[60] = tagpaa; strcat(aux_tagpoa,entrada2); strcat(aux_tagpaa,entrada); strcat(aux_tagpoa,aux_tagpaa); strcat(aux_tagpoa,tagpaf); strcat(aux_tagpoa,tagpof); char *xml = aux_tagpoa; //printf("%-20s",xml); fseek(parquivo,0,SEEK_END); fwrite(xml,strlen(xml),1, parquivo); getch();} main(){ abre_arquivo(); cadastrar(); getch(); } Compartilhar este post Link para o post Compartilhar em outros sites