-
Posts
1.558 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que isrnick postou
-
O problema é a codificação do arquivo CSV que está em UTF-8-BOM, pra imprimir esses caracteres no Windows vai precisar mudar a Code Page do terminal (prompt de comandos) para UTF-8. Pra fazer isso inclua a biblioteca windows.h e use a função SetConsoleOutputCP para a codepage 65001, e o deve imprimir corretamente os nomes. Use #include <windows.h> e SetConsoleOutputCP(65001); Também pode usar SetConsoleCP() pra setar a Codepage de entrada de dados via prompt (para quando usar scanf() por exemplo). A tabela completa de Code Pages pode ser vista aqui: https://msdn.microsoft.com/library/windows/desktop/dd317756
-
Tinha problemas na sua função... Você fez um if dentro do while da função pra comparar o nome lido do arquivo com o que está sendo pesquisado, mas se o nome não fosse igual entra no else, que imediatamente dá um break saindo do ciclo while, então seu programa sempre vai ler apenas 1 nome do arquivo.... Em qualquer casos ele sai imediatamente do while... Outro problema que tinha era que o fclose(arq_entrada) estava dentro do ciclo while, e obviamente deveria estar fora, pois só deve fechar o arquivo após ler os dados dele. //Busca um contato e exibe na tela. void pesquisa(char pesq[]) { int contador=0; agenda agen[100]; FILE *arq_entrada; arq_entrada = fopen("dados.txt", "r"); // Abre o arquivo while(!feof(arq_entrada)) { fscanf(arq_entrada,"%[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,],\n", agen[contador].nome, agen[contador].rua, agen[contador].numero, agen[contador].complemento, agen[contador].bairro, agen[contador].cidade, agen[contador].estado, agen[contador].fone1, agen[contador].fone2); //printf(agen[contador].nome); if (strcmp(pesq, agen[contador].nome) == 0) { printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("Nome.......: %s\nLogradouro.: %s\nNumero.....: %s\nComplemento: %s\nBairro.....: %s\nCidade.....: %s\nEstado.....: %s\nFone 1.....: %s\nFone 2.....: %s\n", agen[contador].nome, agen[contador].rua, agen[contador].numero, agen[contador].complemento, agen[contador].bairro, agen[contador].cidade, agen[contador].estado, agen[contador].fone1, agen[contador].fone2); } //else //{ // printf("Cadastro inexistente!\n"); // break; //} contador++; //getchar(); } fclose(arq_entrada); }
-
Você deve clicar na engrenagem pra compilar o código, é assim que o executável é criado, e precisa recompilar toda vez que alterar o código pra gerar o novo executável, e só então clicar no ícone do play pra rodar o executável. Outra opção é clicar no botão com a engrenagem e o play, pra compilar e imediatamente em seguida rodar o programa.
-
E depois pode usar rewind(pFile) pra voltar ao início do arquivo, e poder ler os dados.
-
Testei sim. Esse é um programa em C, mas você salvou num arquivo com extensão .cpp, e o Dev interpreta que se trata de um programa em C++, e usa o compilador do C++ pra compilar, isso pode gerar erros pois algumas coisas do C não funcionam no C++. Arquivos de programas em C devem ser salvos com extensão .c para que o dev use o compilador da linguagem C. Logo salve o código num arquivo com extensão .c e tente novamente. Se isso não funcionar será necessário usar um cast (struct usuarios_infos *) antes do malloc, mas não deveria ser necessário.
-
Você está compilando um programa na pasta C:\programas\ mas o programa sendo editado pelo Notepad++ está na pasta C:\Users\Cleiton\Documents\ . Então não adianta corrigir nesse arquivo pois está tentando compilar outro arquivo que está sem o int main() e return 0; Logo, edite o programa adicao.c da pasta C:\programas\ que é onde está tentando compilar. E Warning é apenas um aviso, o programa ainda é compilado, mas te avisa que há algo que não está de acordo com o padrão da linguagem.
-
Tem vários problemas no seu código, a começar pelo uso de lables + gotos, também tem os & nos scanf("%s",&usuario_cadastrado.senha); que não é necessário já que login e senha são vetores, e uns memcpy() que não sei porque estão aí, e o memset() está no lugar errado (deveria ser antes de ler os logins e senhas), etc... Achei melhor reorganizar o código e ir fazendo as correções pra o código funcionar corretamente, e ficou assim: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int total_contas = 0, arq_tamanho = 0, op = 0, i; struct usuarios_infos { char login[10]; char senha[10]; }; struct usuarios_infos usuario_cadastrado, *lista_de_contas; FILE* logs; while (op != 3){ printf("\n 1 - Cadastrar nova conta\n"); printf(" 2 - Fazer login\n"); printf(" 3 - Sair\n"); printf("\nOpcao: "); scanf("%d%*c", &op); switch(op){ case 1: logs = fopen ("contas.db","ab"); if(logs == NULL) { printf("\nErro ao tentar abrir o arquivo.\n\n"); } else { memset(&usuario_cadastrado,0,sizeof(struct usuarios_infos)); printf("Cadastrar usuario: "); scanf("%s", usuario_cadastrado.login); printf("Cadastrar senha: "); scanf("%s", usuario_cadastrado.senha); fwrite(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs); fclose(logs); } break; case 2: memset(&usuario_cadastrado, 0, sizeof(struct usuarios_infos)); printf("USUARIO: "); scanf("%s", usuario_cadastrado.login); printf("SENHA: "); scanf("%s", usuario_cadastrado.senha); logs = fopen ("contas.db","rb"); if(logs == NULL) { printf("\nErro ao tentar abrir o arquivo.\n\n"); } else { fseek(logs,0,SEEK_END); arq_tamanho = ftell(logs); total_contas = arq_tamanho / sizeof (struct usuarios_infos); rewind(logs); lista_de_contas = malloc(arq_tamanho); if(fread(lista_de_contas, sizeof usuario_cadastrado, total_contas, logs) != total_contas) { printf("Falha ao tentar ler contas\n"); fclose(logs); free(lista_de_contas); return 1; } fclose(logs); for (i=0; i<total_contas; i++){ if(memcmp(&usuario_cadastrado, &lista_de_contas[i], sizeof(struct usuarios_infos)) == 0) { printf("\n LOGADO COM SUCESSO\n"); break; } } if(i == total_contas) { printf("\n NEGADO\n"); } free(lista_de_contas); } break; case 3: break; default: printf("\n Opcao invalida!\n"); } } return 0; }
-
E C e C++ toda linha de comando deve acabar em ; , e está faltando um ; no fim da linha do return 0.
-
a==b==c não funciona em C, é preciso fazer 2 comparações separadamente a == b e b == c, e então usar o operador booleano && (AND/E) para checar que ambas são verdadeiras. A condição do seu seu segundo if, a==b && a==c && b==c, na verdade está testando corretamente o que o primeiro if deveria checar. Então esse if será satisfeito quando os 3 números forem iguais. O único detalhe a ser apontado é que nesse caso não é necessário comparar 3 vezes, apenas 2 basta, pois se a é igual a b (a==b) E (&&) a é igual a c (a==c), já implica que obrigatoriamente b é igual a c. Então, fazer apenas a==b && a==c já basta. Para checar se apenas 2 números são iguais, é preciso usar o operador || (OR/OU), assim a==b || a==c || b==c, ou seja verificar se a é igual a b, OU se a é igual a c, OU se b é igual a c. Você também precisa usar else para evitar resultados 2 duplos, do contrário toda vez que houver 3 números iguais seu programa também vai encontrar que tem 2 números iguais, e imprimir as 2 frases, então use else pra que o programa apenas cheque se há 2 números iguais quando não houver 3 números iguais. Aí seu programa fica assim #include <stdio.h> int main () { float a,b,c; printf ("Digite o primeiro numero: "); scanf ("%d",&a); printf ("Digite o segundo numero: "); scanf ("%d", &b); printf ("Digite o terceiro numero: "); scanf ("%d", &c); if (a==b && a==c) printf ("Você possui tres numeros iguais"); else if (a==b || a==c || b==c) printf ("Você possui dois numeros iguais"); if (a!=b && a!=c && b!=c) printf ("Os numeros sao diferentes"); return 0; } Note que você também pode substituir o terceiro if por um simples else, pois se não tiver 3 nem 2 números iguais os números só podem ser diferentes: if (a==b && a==c) printf ("Você possui tres numeros iguais"); else if (a==b || a==c || b==c) printf ("Você possui dois numeros iguais"); else printf ("Os numeros sao diferentes");
-
Lembre-se que você tem que recomeçar do início os cadastros no arquivo .db, melhor apagar o arquivo e usar o programa pra gerar um novo, pois os dados salvos de modo errado não são úteis pois não podem ser lidos corretamente. E se esse não é o problema posta como está seu programa agora pra podermos ver o que pode ser.
-
Tecnicamente estão ao contrário as posições do size e do count (no seu caso = 1) na função fwrite(), ou seja você fez a mesma inversão que o @Anonymous Programmer fez no tópico dele pouco acima. Na dúvida olhe a referência: http://en.cppreference.com/w/c/io/fwrite E não há necessidade de gravar login e senha separadamente, você pode salvar os 2 no arquivo com um único fwrite(), chamando uma referência para a variável usuario_cadatrado inteira. Ficando assim: fwrite(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs); E o mesmo é válido na hora de ler do arquivo: fread(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs); O fread acima já lê tanto o login quanto a senha (desde que os dados tenham sido salvos corretamente com fwrite). A maior vantagem de fazer assim é que você poderia alterar a sua struct usuarios_infos, por exemplo para guardar outras informações sobre o usuário além de login e senha, sem ter que alterar o código que lê e salva dados.
-
Outro Passar número da basa 2 para base 10
isrnick respondeu ao tópico de Caroline Ferreira em Programação - iniciantes
Você pode obter uma aproximação. Pense na conversão de um número binário inteiro, você obtém o número decimal correspondente fazendo uma soma de potências de 2, onde cada potência corresponde ao número da casa do número binário. Com 0 sendo o número da primeira casa a direita, e vai aumentando de 1 a cada casa a esquerda. Ex: casas 5 4 3 2 1 0 binario 1 0 1 1 0 0 101100 binário --> 1 * 25 + 0 * 24 + 1 * 23 + 1 * 22 + 0 * 21 + 0 * 20 = 32 + 0 + 8 + 4 + 0 + 0 = 44 decimal A mesma coisa é válida para a parte fracionária do número binário, é uma soma de potências de 2, mas as potências se tornam negativas. (Isso é lógico pois se observar o exemplo acima da esquerda para a direita as casas vão de 5 até 0, então se continuar a sequência para a direita subtraindo 1 a cada casa, vai continuar com -1, -2, -3, etc...) Ex: casas 1 0 . -1 -2 -3 -4 -5 binario 1 1 . 1 0 0 1 1 11.10011 binário --> 1 * 21 + 1 * 20 + 1 * 2-1 + 0 * 2-2 + 0 * 2-3 + 1 * 2-4 + 1 * 2-5 = 2 + 1 + 0.5 + 0 + 0 + 0.0625 + 0.03125 = 3.59375 decimal Então no caso de uma dízima periódica você pode definir um número de casas após a vírgula do número que ainda é relevante, por exemplo 10 casas (no seu caso ficaria 1111.1011011011), e calcular até essa casa, e achar uma aproximação do número na base 10. -
@Xaws O problema está aqui na hora de salvar os dados no arquivo: fprintf(logs,usuario_cadastrado.login); fprintf(logs,"\n"); fprintf(logs,usuario_cadastrado.senha); fprintf(logs,"\n"); Você está usando fprintf ao invés de fwrite... Então não está salvando o vetor de chars inteiro no arquivo, apenas a parte contendo a string do login ou da senha (e ainda adicionar um '\n' no final). Isso vai dar problema na hora de ler os dados com fread, pois o fread tenta obter sempre o total de 60 caracteres da sua struct usuarios_infos. fprintf é uma função mais apropriada para ser usada com escrita em arquivo em modo texto, não em modo binário, ou seja usando parâmetros como "a" ou "w" no fopen(), ao invés de "ab" ou "wb". E nesse caso ao invés de usar fread para ler os dados do arquivo deve-se usar funções como fscanf ou fgets. Para salvar em modo binário usa-se fwrite, e usa-se fread para ler em modo binário. fwrite salva todos os bits dos dados guardados na variável da sua struct no arquivo, ou seja nesse caso sempre salva 60 caracteres, não importando quantos caracteres tenha cada login ou senha.
-
Queria saber porque não estou conseguindo criar um executavel no mingw
isrnick respondeu ao tópico de Amanda Kellen em C/C#/C++
O problema está aí, o arquivo na pasta não tem extensão, ou seja o nome do arquivo é apenas "ex" e não "ex.c". Você tem 2 opções renomear o arquivo e adicionar a extensão ao nome, ficando "ex.c", e usar o mesmo comando que você estava estava tentando usar, e dessa vez vai dar certo: gcc ex.c -o ex.exe Ou então não alterar o nome do arquivo e usar o comando assim: gcc ex -o ex.exe -
@Anonymous Programmer Sua struct tem 200 bytes, o que não é compatível com os 60 bytes do programa dele. E você inverteu os parâmetros do fwrite, colocando o size no lugar do count e o count no lugar do size, mas nesse caso coincidentemente gera o mesmo resultado. http://en.cppreference.com/w/c/io/fwrite int bytes = fwrite(&contas,1,sizeof(struct usuarios_infos),wFile); deveria ser: int bytes = fwrite(&contas,sizeof(struct usuarios_infos),1,wFile); Eu postei um programa na página anterior para gerar o arquivo .db e gravar os logins e senhas usando a struct de 60 bytes, que deve ser compatível com o programa do @Xaws .
-
Queria saber porque não estou conseguindo criar um executavel no mingw
isrnick respondeu ao tópico de Amanda Kellen em C/C#/C++
Tem certeza? O gcc está acusando que não está. Dá um "dir" na pasta pra checar (e posta o print se estiver aí mesmo). -
Não entendi o que quis dizer... Meu programa sempre verifica todas as contas no arquivo, e podem ser adicionadas quantas contas quiser ao arquivo de banco de dados...
-
multiplicar matriz 3x3 por vetor 3x1
isrnick respondeu ao tópico de André Luiz Macedo Amaral em C/C#/C++
Qual seria a dúvida? Se o tamanhos das matrizes está fixo você poderia até fazer diretamente: C[0] = A[0][0]*B[0] + A[0][1]*B[1] + A[0][2]*B[2]; C[1] = A[1][0]*B[0] + A[1][1]*B[1] + A[1][2]*B[2]; C[2] = A[2][0]*B[0] + A[2][1]*B[1] + A[2][2]*B[2]; -
Faltou o for do printf() para incrementar o i de 0 a 4... (e não precisa do fflush) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char nomes[5][21]; int i; for(i=0;i<5;i++){ fgets(nomes[i],21,stdin); nomes[i][strlen(nomes[i])-1]='\0'; } for(i=0;i<5;i++){ printf(" %s\n", nomes[i]); } return 0; }
-
@Xaws Eu fiz esse código pra gerar o arquivo contas.db contendo as contas e senhas: #include <stdio.h> #include <stdlib.h> #include <string.h> struct usuarios_infos{ char login[30]; char senha[30]; }; struct usuarios_infos usuario_cadastro; int main() { FILE * logs; logs = fopen ("contas.db","ab"); do { printf("USUARIO: "); scanf("%s", usuario_cadastro.login); if(strcmp(usuario_cadastro.login, "0") != 0) { printf("SENHA: "); scanf("%s", usuario_cadastro.senha); printf("\n"); fwrite(&usuario_cadastro, sizeof usuario_cadastro, 1, logs); } } while (strcmp(usuario_cadastro.login, "0") != 0); fclose(logs); return 0; } E depois usei o arquivo gerado pra testar o código de login que coloquei no meu post anterior, e funcionou como esperado, sem erros. Então o motivo que não deu certo aí provavelmente seja o modo como você armazenou os dados no seu arquivo contas.db, afinal os dados no arquivo precisam ser compatíveis com o modo em que a leitura com o fread é feita para obter os dados da struct usuarios_info. Mas note que os logins e senhas estão sendo armazenados sem qualquer encriptação, a struct é composta por strings logo estamos basicamente salvando as senhas diretamente como texto no arquivo, então qualquer pessoa poderia simplesmente abrir o arquivo num editor de texto e ler os logins e senhas diretamente. Logo, esse não é o modo que seria usado em uma aplicação real para salvar e/ou verificar logins e senhas, ou ao menos não deveria ser, mas incrivelmente existem exemplos de mal programadores salvando senhas como texto sem qualquer encriptação, que acabam sendo hackeados e dando acesso a todas os logins e senhas dos usuários aos hackers.
-
Me parece que está complicando o código sem necessidade, uma ideia mais simples, usando usando a struct pra ler os dados do arquivo, e comparar com o login e senha digitados pelo usuário, poderia ficar assim: #include <stdio.h> #include <stdlib.h> #include <string.h> struct usuarios_infos{ char login[30]; char senha[30]; }; struct usuarios_infos usuario_cadastrado; int main() { char login[30], senha[30]; int logado = 0; FILE * logs; logs = fopen ("contas.db","rb"); if(logs == NULL) { printf("Erro ao abrir arquivo de logs.\n"); return 1; } else { do { printf("USUARIO: "); scanf("%s", login); printf("SENHA: "); scanf("%s", senha); while (fread(&usuario_cadastrado, sizeof usuario_cadastrado, 1, logs) == 1){ if (strcmp(usuario_cadastrado.login, login) == 0 && strcmp(usuario_cadastrado.senha, senha) == 0) { logado = -1; break; } } rewind(logs); if (!logado) printf("O usuario %s nao foi encontrado ou a senha digitada nao e valida.\n", login); } while (!logado); } printf("\nLogado!\n\n"); fclose(logs); return 0; } Não testei porque não tenho o arquivo contas.db, mas deveria funcionar sem problemas. Edit: Corrigi colocando o rewind(logs) que havia esquecido.
-
pergunta sobre erro else without a previous if
isrnick respondeu ao tópico de Duilio Matias Gonçalves em Programação - iniciantes
O problema parece estar aqui: if ( value == 255);{ // Tem um ; nessa linha do if e não deveria digitalWrite(10,1); }else { digitalWrite(10,0); } -
Python arduino, python e blender
isrnick respondeu ao tópico de Raphael Nazário em Programação - outros
Pelo que li pesquisando na internet o Blender tem um interpretador Python embutido, que é separado do Python do seu sistema, e é acessado através do próprio Blender, e é nele que deve rodar seu script em Python. (Obs: Em outro post (de 2014, logo, mais recente que o seu tutorial de 2011) em um fórum também li que não é mais necessário importar o módulo/biblioteca bge, mas você vai ter que verificar isso por conta própria.) -
A biblioteca windows.h é a biblioteca da Windows API para C e C++, logo pode ser utilizada em ambas as linguagens. https://en.wikipedia.org/wiki/Windows.h
-
(5 + len(var1) - var3) ** 2 – val( str(val(var2) + 1) + str(var3) ) (5 + len("logica") - 7) ** 2 - val( str(val("20") + 1) + str(7) ) (5 + 6 - 7) ** 2 - val( str(20 + 1) + "7" ) 4 ** 2 - val( str(21) + "7" ) 16 - val( "21" + "7" ) 16 - val("217") 16 - 217 -201 Obs: O fórum transformou as letras maiúsculas em letra minúsculas no texto acima, mas não muda a lógica.
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