vhbsouza 0 Denunciar post Postado Novembro 5, 2008 Oi... tenho um trabalho da faculdade pra fazer...que eu tenho que ler um nome contendo no maximo 30 caracteres e um numero de cpf contendo 11 digitos, que está em um arquivo já criado e tenho que ordenar os nomes de acordo com o numero de CPF do menor para o maior. E nesse arquivo pode ter até 100 linhas o conteúdo do arquivo é esse olhem... victor hugo sadsadsad dh dahss12345678914 dssorasddas ernarze addasouza12345678914 como eu faço para ler do arquivo para o struct o meu código até agora: #include <stdio.h> #include <stdlib.h> #include <conio.h> struct nomes { char nome[31]; char cpf[12]; }fichas[100]; int main() { FILE*arq; int i=0,j; if((arq=fopen("arq.txt","r+"))==NULL) { printf("Erro ao abrir o arquivo."); for(i=0;i<=2;i++) putch(7); } else { while(i<100 && !feof) { gotoxy(1,1); //fseek(,,); for(j=0;j<=30;j++) fichas[i].nome[j]=fgetc(arq); fgetc(arq); for(j=0;j<=11;j++) fichas[i].cpf[j]=fgetc(arq); gotoxy(1,1); printf("%s ",fichas[1].nome); i++; } getch(); } }ele está compilando e dá 2 Warnings mais não exibe nada na tela vocês podem me ajudar? Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Novembro 5, 2008 oq você pode fazer pra ter segurança, é ir lendo o arquivo até EOF.. use fgets, ai vai jogando esse conteudo pra uma variavel auxiliar, ai depois joga na struct algo assim: while (!feof(arq)){ fgets(linha,80,arq); //ai aki você divide a string e joga o conteudo certo pras respectivas variaveis.. } ñ sei c você chegou entender, + qlqr duvida posta ae; []'s Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Novembro 5, 2008 mais o fgets le oconteudo da linha inteira neh? como que eu faço para dividir essa string para as outras... Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Novembro 5, 2008 você pode fazer... enquanto (auxiliar != algo) outra_string = auxiliar; i++; fim_enquanto algo assim Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Novembro 5, 2008 você pode fazer... enquanto (auxiliar != algo) outra_string = auxiliar; i++; fim_enquanto algo assim naum entendi isso não.... você não pode me mostrar usando as variáveis que eu usei? fikaria mais claro Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Novembro 5, 2008 olha para melhor explicar você pode copiar para a outra string td q for letra, ai qnd for numero joga pra variavel q armazena o cpf.. veja sobre a biblioteca ctype []'s Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Novembro 5, 2008 Não estou conseguindo.... tentei de todos os jeitos que consegui. alguem pode me mostrar como q fica o codigo... o que consegui fazer até o momento é esse: #include <stdio.h> #include <ctype.h> #include <conio.h> #include <string.h> struct nomes { char nome[31]; char cpf[12]; }fichas[100]; int main() { FILE*arq; int i,j,k; char aux[40]; if((arq=fopen("arq.txt","r+"))==NULL) { printf("Erro ao abrir o arquivo."); for(i=0;i<=2;i++) putch(7); return 0; } rewind(arq); i=0; while(!feof(arq)) { fgets(aux,strlen(aux)+1,arq); j=0; while(!isdigit(aux[j])&& j<=29) { fichas[i].nome[j]=aux[j]; j++; } i++; } //Laço para testar o que já foi feito até o momento printf("%s\n",fichas[0].nome); fclose(arq); getch(); return 0; } Percebi que fichas.nome armazena apenas 3 caracteres da string por exemplo... se no arquivo tiver a string "victor hugo bernardes de souza"=30 caracteres fichas[0].nome="vic" fichas[1].nome="tor" fichas[2].nome=" hu" fichas[3].nome="go " fichas[4].nome="ber" ... assim em diante... não consigui corrigir esse erro.... alguem pome me mostrar cmo q eh? Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Novembro 5, 2008 troque isso: fgets(aux,strlen(aux)+1,arq);por isso: fgets(aux,40,arq); bom aki funfo. []'s ---- Bom to sem tempo para ver bem o código pq to em aula agora, + deu pra fazer algo rapido.. veja: #include <stdio.h> #include <ctype.h> #include <conio.h> #include <string.h> #include <stdlib.h> struct nomes { char nome[31]; char cpf[12]; }fichas[100]; int main() { FILE*arq; int i,j,k; char aux[41]; if((arq=fopen("arq.txt","r+"))==NULL) { printf("Erro ao abrir o arquivo."); exit(1); } rewind(arq); i=0; while(!feof(arq)) { fgets(aux,40,arq); j=0; while(!isdigit(aux[j]) && j<=29) { fichas[i].nome[j]=aux[j]; j++; } int x = 0; while(j<=39){ fichas[i].cpf[x]=aux[j]; j++; x++; } ++i; } //Laço para testar o que já foi feito até o momento printf("Nome: %s Cpf: %s\n",fichas[0].nome, fichas[0].cpf); printf("Nome: %s Cpf: %s\n",fichas[1].nome, fichas[1].cpf); // printf("Nome: %s Cpf: %s\n",fichas[2].nome, fichas[2].cpf); fclose(arq); getch(); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Novembro 8, 2008 Fiz umas alterações, vejam ai...tava tentando fazer algo pra tratar o nome no arquivo .txt, caso tivesse mais de 30 chars mas não obtive sucesso, consegui fazer essa máscara apenas na qtd de números do CPF. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef struct { char nome[31]; char cpf[12]; }nomes; nomes fichas[100]; void inic_lista(); int main() { FILE *fp; char aux[41]; int j,i,x,k; int cont; if((fp = fopen("teste.txt","r")) == NULL) { printf("O arquivo nao pode ser aberto!"); exit(1); } inic_lista(); i = 0; while(!feof(fp)) { fgets(aux,40,fp); j = 0; while(!isdigit(aux[j]) && j<=29) { fichas[i].nome[j] = aux[j]; j++; } x = 0; while((j<=39) && (x<=10) && (aux[j] != '\n') && (isdigit(aux[j]))) { fichas[i].cpf[x] = aux[j]; j++; x++; } i++; } //Mostra lista for(k=0;k<100;k++) { if(fichas[k].nome[0]) { printf("Nome: %s CPF: %s",fichas[k].nome,fichas[k].cpf); printf("\n"); } } fclose(fp); system("PAUSE"); return 0; } void inic_lista() { int i; for(i=0;i<100;i++) { fichas[i].nome[0] = '\0'; } } Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Novembro 11, 2008 Ow... vlw.. gRoOvE e quitZAUMMM eu juntei parte do código que vcs dois melhoraram...e fiz algumas alterações que se adequavam no meu problema...e deu certo... mais agora falta a parte da ordenação....dos nomes de acordo com o CPF... vocês podem me ajudar nessa parte tbm? tipo ... qq vcs acham que seria melhor... eu ordenar no msm struct... , alterar em outra struct .... ow alterar o indice das structs?... e só mais uma coisa... no Trabalho ... eu tenho que enfeitar o programa...sabe.. pra deixar uma aparência mais amigável para o usuário... ( nada de VISUAL ESPARTANO)....por isso q eu to usando a conio.h vocês tem algumas dicas pra eu melhorar a aparência do programa? t+...vlw.... Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Novembro 11, 2008 Aparencia amigavel em 2008 != enfeite Enfeite = cores,gotoxy,etc Aparencia amigavel em 2008 = caixa de texto, menu clicável, janela, botões. Se você ta programando p/ windows use a API do windows p/ fazer as coisas (provavelmente é mais fácil) e não os remendos da época do DOS. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Novembro 11, 2008 exite uma função pronta jah para ordenação.. veja sobre qsort []'s Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Novembro 14, 2008 Aparencia amigavel em 2008 != enfeite Enfeite = cores,gotoxy,etc Aparencia amigavel em 2008 = caixa de texto, menu clicável, janela, botões. Se você ta programando p/ windows use a API do windows p/ fazer as coisas (provavelmente é mais fácil) e não os remendos da época do DOS. Mais então ISIS.... como que eu faço pra usar a API... eu busquei muitas coisas sobre isso que você flou ... na Internet e tudo que eu encontrei eu não consegui fazer rodar nos meus programas.... você sab....como que eu faço pra redimensionar o tamanho da janela do console do DOS... tipo.. colocar em tela cheia... Mais não é com o ALT-Enter.. pq com ele o usuário precisa apertar essas duas teclas... eu queria que quando o usuário rodasse o programa .... ele já iniciasse em tela cheia.... aguardando sua resposta... flw.. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Novembro 14, 2008 P/ emular porcamente uma tela cheia execute esse comando: mode con cols=1024 lines=700 Detalhe: você tem que saber a resolucao do monitor p/ fazer isso. Ou use a API do windows pra ir modificando as propriedades. Sobre as teclas: um "listener" faz o trabalho. É igual você apertar Ctrl+D no Vim p/ rolar o texto... Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Novembro 14, 2008 P/ emular porcamente uma tela cheia execute esse comando: mode con cols=1024 lines=700 Detalhe: você tem que saber a resolucao do monitor p/ fazer isso. Ou use a API do windows pra ir modificando as propriedades. Sobre as teclas: um "listener" faz o trabalho. É igual você apertar Ctrl+D no Vim p/ rolar o texto... ..... ow vlw.. isso funcionou..... mais eu naum entendi essa parte aqui....... Sobre as teclas: um "listener" faz o trabalho. É igual você apertar Ctrl+D no Vim p/ rolar o texto... qq é esse listener.... t+ Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Novembro 14, 2008 você tem que pegar eventos do teclado... Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Novembro 15, 2008 No caso da biblioteca do Windows, se você já começou a estudar: No processo da janela, você adiciona um case no switch: case WM_KEYDOWN: Isso vai capturar as teclas digitadas pelo teclado; então para pegar qual tecla foi digitada, usa isso aqui: LOWORD(wParam) Exemplo prático, tirado do código fonte de um programinha de Windows que postei no laboratório de códigos fontes: case WM_KEYDOWN: switch(LOWORD(wParam)) { case VK_LEFT: movex = -5; break; case VK_RIGHT: movex = 5; break; case VK_UP: movey = -5; break; case VK_DOWN: movey = 5; } break; Quando quiser comparar com letras, você pode botar a letra maiúscula no case direto, exemplo: case WM_KEYDOWN: switch(LOWORD(wParam)) { case 'A': MessageBox(hwnd, "Você digitou A!", "Digitou", MB_OK); break; case 'B': MessageBox(hwnd, "Você digitou B!", "Digitou", MB_OK); break; } break; Você pode usar o código que eu postei no laboratório, e ler esse site aqui pra aprender mais sobre a biblioteca do Windows: http://www.winprog.org/tutorial/ (em inglês) Inclusive ensina como criar controles como combobox e text input que acho que é o que você quer! Agora, se você vai fazer em DOS não posso te ajudar porque não sei nada sobre eventos no DOS ^^ Compartilhar este post Link para o post Compartilhar em outros sites