-
Posts
11 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Fabricantes
Livros
Cursos
Análises
Fórum
posts postados por sN4ke
-
-
4 minutos atrás, TYSQUARE89 disse:
Oke, eu acredito que seja melhor usa o fscanf assim:
char ch[2];
fscanf(arquivo,"%s", ch);
Cheguei a trocar, infelizmente ainda não é isso =/
-
2 minutos atrás, TYSQUARE89 disse:
@sN4ke Não se preocupe em incomodar, estou aqui voluntariamente, porém demoro um pouco para responder :S, enfim...
Você sabe se essas linhas:
fscanf(arquivo,"%d ",&narm);
fgets(arm,500,arquivo);
estão recebendo corretamente a quantidade e as armadilhas?...
Acabei de testar e sim!
O printf para o narm mostra 5 e o puts para o arm mostra as armadilhas exatamente como estão no .txt -
@TYSQUARE89 acho que tá quaaaseee lá, mas ainda tem algo apresentando problemas pra pegar os dados finais. É bizarro, porque para ver as posições das armadilhas eu basicamente tenho que fazer o mesmo que fiz para ler a posição dos monstros. Da mesma forma, para pegar a posição do chefe, o procedimento parece ser igual ao que eu fiz para pegar a posição do herói. No entanto, mesmo tentando seguir a mesma lógica, o programa apresenta problemas ao sair do for do número de armadilhas (narm). Eu já devo estar enchendo teu saco, mas se souber me dizer o que fiz de errado dessa vez, vai me ajudar bastante mesmo!
//while(!feof(arquivo)){ <- Removi isso porque não tem necessidade, já que eu percorro o código "manualmente"... fscanf(arquivo,"%s ",&ph); lin = convertlin(ph); col = convertcol(ph); tabuleiro[lin][col].classe = personagem.classe; printf("%s ",&ph); fscanf(arquivo,"%d ",&nmon); fgets(monstro,500,arquivo); puts(monstro); system("pause"); i = 0; for(m=0;m<nmon;m++){ lin = (int)(monstro[i]-48); col = convertcolM(monstro[i+1]); tabuleiro[lin][col].classe = inimigo.classe; printf("linha:%d - coluna: %d - classe: %c",lin,col,tabuleiro[lin][col].classe); system("pause"); i+=3;//pula linha em branco } fscanf(arquivo,"%d ",&narm); fgets(arm,500,arquivo); puts(arm); i=0; for(m=0;m<narm;m++){ lin = (int)(arm[i]-48); col = convertcolM(arm[i+1]); tabuleiro[lin][col].classe = armadilhaP.classe; printf("linha:%d - coluna: %d - classe: %c",lin,col,tabuleiro[lin][col].classe); system("pause"); i+=3; } fscanf(arquivo,"%s ",&ph); lin = convertlin(ph); col = convertcol(ph); tabuleiro[lin][col].classe = chefe.classe; printf("%s ",&ph);*/ } fclose(arquivo);
Sem esse segundo for o arquivo inclusive fecha bonitinho, porém aí eu fico sem as posições das armadilhas e do chefe...
edit:
Esse print deve ajudar com informações extras. Percebi q ele tá pegando números errados pra posição do chefe, mas não sei se isso seria motivo pra crashar...
- 1
-
19 minutos atrás, TYSQUARE89 disse:
@sN4ke Esse código: (int)monstro-48 só serve de 0 a 9, então antes do switch(c) verifique com um printf a letra e decimal do argumento c, para saber quais letras estão sendo usadas.
Em (int)monstro, troque por:
lin = (int)(monstro[i]-48);
Questão de prioridade.
Certo, fiz a troca e parece estar funcionando bem, o problema agora parece ser na hora de sair do loop. Aparentemente ele não está identificando um '\n' ou o strlen e começa a pegar lixo...
Aliás o professor disse que eu poderia adicionar a quantidade de monstros para facilitar, assim:
Citação1C
4 // número de monstros
1B 2D 3F 4H
5
2A 2E 3J 4C 5G
5JTentarei colocar esse número como condição pro while de alguma forma
-
@TYSQUARE89 Na primeira vez do loop o programa parece estar obtendo a linha e a coluna corretamente, porém na segunda a linha já torna-se um valor bizarro (-16).
Imprimi até onde ele chegou, a linha e a coluna já convertidos para sabermos o que tá rolando
Aliás, aqui não deveria chamar uma função?
lin = (int)monstro[i]-48;
Novamente, obrigado pela ajuda!
@TYSQUARE89 Fiz algumas edições e agora o programa vai até um pouquinho mais longe. Como não compreendi bem aquele -48, acabei retornando pro meu código e reaproveitando coisas que você fez.
Código atualizado:
void debug(criatura personagem){ int arg = 1; FILE *arquivo; criatura inimigo; criatura chefe; criatura armadilha; criatura tabuleiro[5][10]; armadilha.classe = 'x'; inimigo.classe = 'i'; chefe.classe = 'C'; char nome[100]; char txt[5] = ".txt"; char ph[2]; char monstro[500]; char arm[500]; int col,lin,i,narm,nmon; system("cls"); printf("\n\t\t-- MODO DEBUG --\n Digite o nome do arquivo que deseja abrir:\n >> "); scanf(" %s",nome); i = strlen(nome); if(nome[i-1]!='t'){ strcat(nome,txt); } arquivo = fopen(nome,"r"); if(arquivo==NULL){ perror("Arquivo nao encontrado! =(\n"); exit(-1); }else{ while(!feof(arquivo)){ fscanf(arquivo,"%s ",&ph); lin = convertlin(ph); col = convertcol(ph); tabuleiro[lin][col].classe = personagem.classe; printf("%s ",&ph); fflush(stdin); system("pause"); fgets(monstro,500,arquivo); fflush(stdin); puts(monstro); system("pause"); fscanf(arquivo,"%d ",&nmon); i = 0; while(monstro[i]!='\n' || strlen(monstro) < i){ lin = convertlinM(monstro[i]); col = convertcolM(monstro[i+1]); tabuleiro[lin][col].classe = inimigo.classe; printf("linha:%d - coluna: %d - classe: %c",lin,col,tabuleiro[lin][col].classe); system("pause"); i+=3;//pula linha em branco } } } fclose(arquivo); } int convertcolM(char c){ int saida = -1; switch(c){ case 'A': saida = 0; break; //coluna A retorna 0 case 'B': saida = 1; break; //coluna B retorna 1 case 'C': saida = 2; break; //coluna C retorna 2... case 'D': saida = 3; break; case 'E': saida = 4; break; case 'F': saida = 5; break; case 'G': saida = 6; break; case 'H': saida = 7; break; case 'I': saida = 8; break; case 'J': saida = 9; break; //nao encontrado default: break; } //saida < 0 se não encontrou a COL do monstro return saida; } int convertlinM(char c){ int saida=-1,i; switch(c){ case '1': saida = 0; break; case '2': saida = 1; break; case '3': saida = 2; break; case '4': saida = 3; break; case '5': saida = 4; break; } return saida; }
O problema agora parece ser na hora de sair do looping:
-
@TYSQUARE89 obrigado por responder!
Por algum motivo, o programa não está imprimindo a string monstro, creio que isso seja indicativo de algum erro. Além disso, não sei se chega a ser realmente um problema, mas apesar de compilar, o Dev acusa como erro a passagem de uma posição da string por valor. Estou pensando aqui e talvez as funções que fazem as conversões das linhas não estejam adequadas. De qualquer forma, o programa apresenta problemas logo quando deveria entrar no while. Segue um print:@edit o problema ao qual me refiro é de crashar mesmo
- edit 2: resolvi o problema da linha em branco.
Faltava um espaço nesse scanf:
fscanf(arquivo,"%s",&ph);
O correto é:
fscanf(arquivo,"%s ",&ph);
Não entendo muito bem porque resolve, apenas vi um gringo recomendando isso aqui:
https://stackoverflow.com/questions/17568649/using-fgets-to-get-a-line-in-c[]'s
- 1
-
Para gerar o tabuleiro de um jogo, preciso ler um arquivo que contém posições dos monstros, das armadilhas, do chefe e do personagem principal. O arquivo segue este formato (sem os comentários):
//1o linha do arquivo: posição do herói 1C //o 2a linha do arquivo: posições dos monstros 1B 2D 3F 4H //o 3 a linha do arquivo: quantidade de armadilhas 5 //o 4 a linha do arquivo: posições das armadilhas 2A 2E 3J 4C 5G //o 5a linha do arquivo: posição do Chefão 5J
O código é o seguinte:
void debug(criatura personagem){ int arg = 1; FILE *arquivo; criatura inimigo; criatura chefe; criatura armadilha; criatura tabuleiro[5][10]; armadilha.classe = 'x'; inimigo.classe = 'i'; chefe.classe = 'C'; char nome[100]; char txt[5] = ".txt"; char ph[2]; char monstro[500]; char arm[500]; int col,lin,i,narm; system("cls"); printf("\n\t\t-- MODO DEBUG --\n Digite o nome do arquivo que deseja abrir:\n >> "); scanf(" %s",nome); i = strlen(nome); if(nome[i-1]!='t'){ strcat(nome,txt); } arquivo = fopen(nome,"r"); if(arquivo==NULL){ perror("Arquivo nao encontrado! =(\n"); exit(-1); }else{ fscanf(arquivo,"%s",&ph); printf("%s",&ph); system("pause"); lin = convertlin(ph); col = convertcol(ph); tabuleiro[lin][col].classe = personagem.classe; fgets(monstro,sizeof(monstro),arquivo); while(monstro[i]!='\n'){ lin = convertlinM(monstro); col = convertcolM(monstro); tabuleiro[lin][col].classe = inimigo.classe; puts(monstro); i++; } system("pause"); fscanf(arquivo,"%d",&narm); printf("%d",narm); for(i=0;i<narm;i++){ fscanf(arquivo,"%s",&arm); lin = convertlinM(arm); col = convertcolM(arm); tabuleiro[lin][col].classe = armadilha.classe; } printf("%s",&arm); system("pause"); fscanf(arquivo,"%s",&ph); // PH AQUI USADO COMO CHEFE printf("%s",&ph); system("pause"); lin = convertlin(ph); col = convertcol(ph); tabuleiro[lin][col].classe = chefe.classe; } fclose(arquivo); }
apresenta problemas logo após ler a posição do herói.
Os printf são meramente para eu saber como anda a leitura, serão retirados depois. As funções convertlin e convertcol simplesmente pegam o valor recebido e retornam algo que eu possa utilizar na tabela.
Eu tinha feito algumas variações achando q poderiam resolver:
-> imprime 5J infinitamentewhile(fscanf(arquivo,"%s",&monstro)!='\n'){ lin = convertlinM(monstro); col = convertcolM(monstro); tabuleiro[lin][col].classe = inimigo.classe; puts(monstro); }
-> Esta acaba imprimindo tudo até o final, em vez de pegar apenas a linha dos monstros:
for(i=0;i!='\n';i++){ fscanf(arquivo,"%s",&monstro); lin = convertlinM(monstro); col = convertcolM(monstro); tabuleiro[lin][col].classe = inimigo.classe; puts(monstro); }
Se alguém souber me explicar como fazer essa leitura, ficarei MUITO grato
[]'s
- 2
-
Cara, Vegas e Premiere são os principais. Você pode pegá-los em outras versões ou ir pra algo mais amador como Movie Maker (se realmente quiser fazer algo bem básico).
-
Cara, recomendo que pegue o Sony Vegas. É um programa leve e fácil de mexer. Abre o vídeo nele, clica com o botão direito em cima do vídeo depois de tê-lo jogado na timeline e vai em "event pan/crop", aí é só redimensionar.
Se precisar de uma ajuda mais detalhada só falar.- 1
-
Olá pessoas, tudo bom?
Estou pensando em comprar a fonte Zalman ATX 500W - ZM500-LE usando a seguinte configuração:
Placa mãe: Asus M5A78L-M LX V2
Processador: Phenom II x4 965 BE HDZ965FBK4DGM
Placa de vídeo: Nvidia 9500gt 1gb 128bit
RAM: 4Gb DDR3 1333Mhz
HD Sata II 500GB
+ leitor de dvd e um de cd.
O que acham? Suporta tranquilo? Tem alguma recomendação no lugar dela? Um abraço
- 1
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais
Crash ao tentar ler linha de arquivo
em C/C#/C++
Postado
@TYSQUARE89 AEEEEHOOOO, finalmente está pronto!!! Obrigadão, cara! Eu removi esse & aí (que vacilo) e refiz as funções convertlin e convertcol usando o modelo de switch que você tinha passado anteriormente. Tudo rodando! =D