Ir ao conteúdo
  • Cadastre-se

vangodp

Membro Pleno
  • Posts

    1.752
  • Cadastrado em

  • Última visita

Tópicos solucionados

  1. O post de vangodp em Como usar <vector> para armazenar um texto foi marcado como solução   
    #include<iostream> #include<vector> using namespace std; int main(){ std::vector<std::string> v; string s; s = "Ola"; v.push_back( s.c_str() ); s = "Mundo"; v.push_back( s.c_str() ); v.push_back( "curel" ); for(auto a : v){ cout << a << " "; } return 0; } igual que com outros tipos de dados você precisa fazer o tal pushback para inserir. Logo você terá v[0], v[1], v[2]... como de um vetor normal se tratara só que é um container da stl.

    Não é o caso mas deixo a sugestão de investigar sobre emplaceback em vez de usar pushback.
  2. O post de vangodp em Comparação de string com string em arquivo. foi marcado como solução   
    a forma correta de ler a seña de um arquivo é mais ou menos essa:
     
    #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char input[30]; char login[30]; FILE* f = NULL; f = fopen("login.txt", "r"); if ( f == NULL ){ perror("Erro"); getchar(); return 0; } printf("Digite seu login:\n"); scanf("%[^\n]%*c", input); while(fscanf(f, "%[^\n]%*c", login ) != EOF ) { if( strcmp(input, login) == 0 ){ printf("Login correto\n"); fclose(f); system("pause"); return 0; } } printf("errou"); return 1; } Supondo que no arquivo de senhas você tem uma senha por cada linha.
  3. O post de vangodp em Meu primeiro jogo em c++ foi marcado como solução   
    Está claro que seu problema não é com programação, lhe felicito, siga assim. Mas sim tem alguns problemas com a experiência em fazer jogos.... Por exemplo que acontece se somente escolho1? killer "arrebenta" a  killer, killer, killer, killer... >_< Se for ao banho a mijar ja n sabe qual killer é você shuesuhe.

    Em vez de: Killer inflicted 30 damage to the Killer
    por que não: juãojinho(Killer) inflicted 30 damage to marquinhos (Killer)???

    ou melhor ainda... que lhe parece passar esse jogo a gráficos???

    Limpar a tela também de vez em quando não faz mal.

     
    Quando tem muitas letras é algo confuso.

    Mas com tudo me parece um bom trabalho. O que mais me gostou é que teve 0 erros e 0 warnigs no programa...continue assim. Para ser o primeiro jogo é um ótimo projeto, não se detenha, continue melhorando esse jogo. Como falei... pode ser feitas bastantes melhorias.
     
    Entra ai e trocamos umas idéias se quiser: https://discord.gg/Xdtxz7W

     
  4. O post de vangodp em Inserir dado do arquivo em struct foi marcado como solução   
    Com essas pequenas mudanças seu programa já faz a leitura desde o arquivo. Se existir um arquivo com dados ele será carregado automaticamente, caso contrario o programa vai funcionar exatamente como antes.
    using namespace std; #include <stdlib.h> #include <conio.h> #include <string.h> #include <fstream> #include "biblioteca.h" //função que carrega produtos desde o arquivo int carregar_lista ( ListaE &lista ) { Produto *aux; aux = lista.inicio; ifstream fin; fin.open ( "arquivo.txt" ); if ( !fin.is_open() ) { perror("Problema ao abrir arquivo.txt"); system("pause"); return 0; } Produto produto; //usando streams e fazendo analogia a cin... se cin serve para ler desde o teclado fin servirá para ler desde arquivo ;) while( fin>> produto.Codigo >> produto.Preco >> produto.Nome ){ adiciona_item(lista, produto); } return 1; } int memoria ( ListaE &lista ) { //Produto *aux; //aux = lista.inicio; //char a[200]; ifstream salvar; salvar.open ( "arquivo.txt" ); if ( !salvar.is_open() ) { cout << "Arquivo.txt nao abriu"; return 0; } return 1; } bool imprime ( ListaE lista ) { Produto *aux = new Produto; aux = lista.inicio; while ( aux != NULL ) { cout << "Codigo: " << aux->Codigo << endl; cout << "Nome: " << aux->Nome << endl; cout << "Preco: " << aux->Preco << endl << endl; aux = aux->proximo; } return true; } int armazena ( ListaE &lista ) { Produto *aux; aux = lista.inicio; ofstream salvar; salvar.open ( "arquivo.txt" ); if ( !salvar.is_open() ) { cout << "Arquivo.txt nao abriu"; return 0; } while ( aux != NULL ) { salvar << aux->Codigo << " "; salvar << aux->Preco << " "; salvar << aux->Nome << " \n"; aux = aux->proximo; } return 1; } void inserir ( ListaE &lista, Produto prod ) { cout << "\t\tCodigo: "; cin >> prod.Codigo; cout << "\t\tPreco: "; cin >> prod.Preco; cout << "\t\tNome do produto: "; cin.ignore(); getline ( cin, prod.Nome ); adiciona_item ( lista, prod ); } int buscar_lista ( ListaE &lista, Produto prod ) { int codigo; cout << "Digite o Codigo para a busca: "; cin >> codigo; Produto* produto_buscado = busca ( lista.inicio, codigo ); if ( produto_buscado != NULL ) { cout << "Codigo: " << produto_buscado->Codigo << endl; cout << "Nome: " << produto_buscado->Nome << endl; cout << "Preco: " << produto_buscado->Preco << endl << endl; return 1; } else { cout << "Nao existe esse produto" << endl; return 0; } } int remover_lista ( ListaE &lista, Produto prod ) { int codigo_remover; cout << "Digite o Codigo para a remover: "; cin >> codigo_remover; if ( !remover ( lista, codigo_remover ) ) { cout << "Codigo invalido, ou a lista esta vazia" << endl; } else { cout << "Codigo: " << codigo_remover << " removido com sucesso" << endl; } return 1; } void menu() { system ( "color 0" ); cout << "\t\tMercado " << endl << endl; cout << "\t\tPRODUTOS" << endl << endl; cout << "\t\t1 - Adicionar Produto" << endl; cout << "\t\t2 - Buscar Produto" << endl; cout << "\t\t3 - Remover Produto" << endl; cout << "\t\t0 - Sair" << endl; } int main() { ListaE lista; Produto prod; int escolha; inicializa_lista ( lista ); //memoria ( lista ); carregar_lista(lista); do { system ( "color f1" ); menu(); imprime ( lista ); cin >> escolha; if ( escolha == 1 ) { system ( "cls" ); inserir ( lista, prod ); system ( "cls" ); } if ( escolha == 2 ) { system ( "cls" ); buscar_lista ( lista, prod ); } if ( escolha == 3 ) { system ( "cls" ); remover_lista ( lista, prod ); } if ( escolha == 0 ) { armazena ( lista ); } } while ( escolha != 0 ); return 0; } tente declarar as funçoes como void si não pretende usar retornos. E não declare variaveis que não forem ser usadas. Dão muitos warnings e a impresão de que você n tem seu programa baixo controle.

    Se tiver alguma duvida pergunte.

    Tente comentar um pouco o programa, mas somente as partes indispensaveis, porque tive que perder meia hora para adivinhar o que faz cada função 😆
    adicionado 0 minutos depois o biblioteca.h não foi alterado assim que não vou subi-lo novamente:)
  5. O post de vangodp em Utilizando struct como ponteiro?? foi marcado como solução   
    Para atribuir strings você precisa de strcpy.
    Troque:
    listaPizzas[cont].pizza[10] = "Peperoni\0"; listaPizzas[cont].descricao[50] = "peperonegostoso"; Por:
    strcpy( listaPizzas[0].pizza, "Peperoni"); strcpy( listaPizzas[0].descricao, "peperonegostoso"); Ficando mais ou menos:
     
    #include <stdio.h> #include <string.h> //Para poder usar strcpy struct pizzas{ int codPizza1; float precoPizza; char pizza[10], descricao[50]; }; int cadastrarPizza(struct pizzas *nova){ printf("%i\n",nova->codPizza1); printf("%.2f\n",nova->precoPizza); printf("%s\n",nova->pizza); printf("%s\n\n",nova->descricao); return 0; } int main(){ struct pizzas listaPizzas[10]; //Lista de 10 pizzas //pizza 1 listaPizzas[0].codPizza1 = 11; listaPizzas[0].precoPizza = 44.0; strcpy( listaPizzas[0].pizza, "Peperoni"); strcpy( listaPizzas[0].descricao, "peperonegostoso"); cadastrarPizza(&listaPizzas[0]); //pizza 2 listaPizzas[1].codPizza1 = 12; listaPizzas[1].precoPizza = 34.70; strcpy( listaPizzas[1].pizza, "calabreza"); strcpy( listaPizzas[1].descricao, "Linguiça!"); cadastrarPizza(&listaPizzas[1]); return 0; }  
  6. O post de vangodp em Verificação de consumo de energia foi marcado como solução   
    Não é nenhum transtorno, é que o olho agradece >_<.
    Da um minutinho para analisar o seu problema.
    adicionado 27 minutos depois #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <math.h> int main() { setlocale ( LC_ALL, "Portuguese" ); float quadro; int num; char categoria; printf ( "Olá! Você deseja ver os números pares de 0 a 200 ou verificar o consumo de energia?" ); printf ( "\nInforme 1 para os números pares, informe 2 para o consumo de energia: " ); scanf ( " %c", &categoria ); switch ( categoria ) { case '1': printf ( "\nOs números pares de 0 a 200 são:" ); printf ( "\n2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200" ); break; case '2': printf ( "\n\nPois bem, vamos verificar seu consumo de energia.\n" ); printf ( "Precisamos saber onde você se enquadra, então, vamos começar." ); printf ( "\nIremos lhe informar a tabela de gasto e seus respectivos enquadramentos, só pra você poder se orientar melhor: " ); printf ( "\n\n0 - 30 quadro 1 " ); printf ( "\n31 - 100 quadro 2" ); printf ( "\n101 - 200 quadro 3" ); printf ( "\nAcima de 200 quadro 4" ); printf ( "\n\nDigite o quanto você gastou: " ); scanf ( "%d", &num ); if ( num >= 0 && num <= 30 ) { //0 - 30 = 0,0423 quadro = 0.0423 * ( float ) num; printf ( "\nVocê deverá pagar %.2f", quadro ); } else if ( num >= 31 && num <= 100 ) { //31 - 100 = 0,0725 quadro = 0.0725 * ( float ) num; printf ( "\nVocê deverá pagar %.2f", quadro ); } else if ( num == 101 && num <= 200 ) { // 101 - 200 = 0,1087 quadro = 0.1087 * ( float ) num; printf ( "\nVocê deverá pagar %.2f", quadro ); } else if ( num > 200 ) { // Acima de 200 = 0,1208 quadro = 0.1208 * ( float ) num; printf ( "\nVocê deverá pagar %.2f", quadro ); } break; default: break; } return 0; } Faça a prova e veja se ele rodou bem. Logo compare com o seu, se tiver duvida pergunte e diga em que partes tem maior dificuldade. Não sei se esta correto totalmente, mas se tiver dando erros avise.
  7. O post de vangodp em Cin pulando a entrada de dados foi marcado como solução   
    o cin tem a "má" costume de ler até encontrar um espaço(' '), o enter('\n') ou um tabulador('\t') isso faz com que cin deixe de ler imediatamente, ou seja se você tiver uma string e tentar ler um nome junto com sobrenome por exemplo, certamente ele só vai liberar o nome para a variavel.

    Vou tentar explicar melhor....
    Quando você tiver...
    string nome;

    ...e tentar ler "Luiz Henrique"...
    cin>>"Luiz Henrique";

    ...você vai digitar "Luiz Henrique" e apertar o enter para informar que terminou de digitar, saiba que no buffer você tem a seguinte string "Luiz Henrique\n" que basicamente é composto por isso-> Luiz+espaço+Henrique+enter(Luiz+' '+Henrique+'\n') Quando o programa detectar que o \n(Enter) entrou no buffer automaticamente começa a "descarregar" os dados para as variáveis que você criou. O problema é que será liberado os dados em "pedaços" separados pelos 3 caracteres que citei lá no começo, ou seja, o espaço(' '), o enter('\n') ou o tabulador('\t'). Então será liberado "Luiz" para a variável nome porque logo depois ven um espaço, o resto permanecerá no buffer esperando outras variáveis para ser descarregadas, e olha que sorte... logo depois vem o cpf. XD Adivinha o que vai parar no cpf...


    Rode ele ai no seu computador e comprove:
     
    #include <iostream> using namespace std; int main () { string nome; string cpf; cout << "Digite \"Luiz Henrique\" e aperte o enter normalmente: "; cin >> nome; cin >> cpf; //<-vai pular e cpf vai guardar henrique XD cout << "No nome tem: " << nome << endl; //vai imprimir só Luiz cout << "E no cpf acredito que tem Henrique verdade?: " << cpf << endl; //E o Henrique vai estar aqui!!! return 0; } Agora que entendeu mais ou menos qual o problema, ou pode que não shuehsuesuhe, que se pode fazer? Para ler linhas inteiras você pode usar o getline(cin, nome);

     
    Então a resposta é, use o getline para ler frases que contenham espaços(strings com espaços)... e cin para palavras simples(strings que contenham somente 1 única palavra sem espaços nem tabuladores), dados básicos como int, float ou char, etc.
     
    Se continuar com duvidas pergunte.
     
     
  8. O post de vangodp em Menu de opção invalida... foi marcado como solução   
    Sempre é melhor switch para isso:
     
    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int main () { int opc; bool sair = false; while ( sair == false ) { printf ( "Digite qual opcao voce quer usar:\n" "1- Matematica basica\n" "2- Eletricidade basica\n" "3- Circuitos eletronicos\n" "0- Sair\n" "Opcao?> " ); scanf ( "%d%*c", &opc ); system ( "CLS" ); switch ( opc ) { case 1: printf ( "Escolhido opcao 1" ); break; case 2: printf ( "Escolhido opcao 2" ); break; case 3: printf ( "Escolhido opcao 3" ); break; case 0: sair = true; printf ( "Byebye!!" ); break; default: printf ( "Opcao invalida.\n" ); break; }//FIM SWITCH printf ( "\n\nSuprimir uma tecla para continuar.\n" ); getchar();//pausa antes de limpar tela(Importante ter buffer limpo ou não funcionará) system ( "CLS" ); } return 0; }  
  9. O post de vangodp em Diferenças entre Float e Double foi marcado como solução   
    Não só isso. Um double ocupa um espaço maior na memória.
    Muitas funções da biblioteca math.h trabalham com double. Tudo é questão de otimização, ou seja, da necessidade de que seu programa tiver. Si precisar usar uma só variável, talvez seja melhor usar um double, porém se precisar de 200k de variáveis do tipo real, talvez float seja melhor opção pois com float seu programa ocupa a metade da memória.
    adicionado 6 minutos depois Lembre que você sempre pode fazer um cast de menor a maior sem perder precisão porém não ao contrario.
  10. O post de vangodp em Variável com e sem referência foi marcado como solução   
    que o 1 é como se fosse "auto index = alunos;", ou seja, é uma copia de aluno. E o 2, trata-se de uma referencia a alunos, tudo o que acontecer com index, também acontecerá com alunos(estão ligados).
  11. O post de vangodp em C Leitura de arquivo com números junto com letras linha a linha foi marcado como solução   
    Se a longitude das linhas não variam quer dizer que por exemplo, na linha 2, o valor 5 vai estar a 93 bytes desde o inicio do arquivo, costumamos dizer que é um salto de 93 bytes(Ou um offset de 93 bytes). O caso seria mover 93 bytes adiante e fazer a leitura:
     
    #include<stdio.h> #include<stdlib.h> int main(){ int n = -1; FILE * f; if ( (f=fopen("config.ini", "r")) == NULL ){ perror("Erro: "); getchar(); exit(0); } long offset = 93; fseek(f, offset, SEEK_SET); fscanf(f,"%d", &n); printf("%d", n); fclose(f); return 0; } Provado com esse arquivo aqui:config.ini
    que exatamente contem isso:
    config.ini
    #########screenshot############################################ screenshot número de fotos= 5 screenshot minutos para cada foto= 1 #########WEBCAM################################################ webcam número de fotos= 5 webcam minutos para cada foto= 1 ############################################################### Para ler as seguintes linhas seria mudar o offset para
    linha 3->131
    linha 5->224
    linha 6->258
    ...que são a quantidade de bytes que está cada variável em relação ao inicio do arquivo(SEEK_SET). Podendo também usar em relação de uma variável a outra(SEEK_CUR), porém seria preciso recalcular os offsets que teriam saltar de uma a outra.
    adicionado 0 minutos depois Como pode apreciar você obtem o 5 como um int.
  12. O post de vangodp em leitura de string e um valor flutuante foi marcado como solução   
    vamos lá...
    Primeiro você não deve por espaços entre especificadores dentro do scanf. El fato de usar especificadores como " %s %d", com espaços, pode certamente gerar erros no seu programa pois um espaço em scanf significa uma coisa completamente diferente em scanf e em printf. No printf um espaço é um espaço, mas no scanf um espaço quer dizer que você quer ignorar um espaço, e dependendo de onde vai o espaço quer dizer outra coisa, como por exemplo antes de um especificador, pode ignorar por exemplo a supressão do caractere enter em uma leitura anterior. Em outras palavras, a menos que queira ignorar certos caracteres com scanf não use espaços no scanf.
    Segundo e mais importante é que você esta lendo sem limpar o buffer, isso gera outros tantos problemas ao ler chars e strings com outras variáveis de por meio. Procure limpar o buffer antes de ler um char ou uma string, ou você pode levar esse tipo de surpresas.
    Dicas:
    Tome o nome e numero em scanfs separados, o programa deveria funcionar meio assim:
    Informe o nome: tomate
    quantidade: 3

    Em código seria algo como:
    Informe o nome: tomate
    preço: 3
     
    f lista[100]; printf("Informe o nome: "); scanf("%s", lista[0].produto); printf("valor: "); scanf("%s", &lista[0].preco); //Limpar buffer aqui... antes de uma nova leitura printf("Informe o nome: "); scanf("%s", lista[1].produto); printf("valor: "); scanf("%s", &lista[1].preco); //Limpar buffer aqui... antes de uma nova leitura ...  
  13. O post de vangodp em C++ iguala variáveis !? foi marcado como solução   
    crie uma 3 variavel e faça a troca.

    temp = x //guarde o valor de x na variavel temporal
    x = y
    y = temp //y ganha o valor de x que ficou guardado no temp

    tadah!!!
     
  14. O post de vangodp em C - atribuição de strings a partir de uma entrada foi marcado como solução   
    #include<stdio.h> int main(){ char dir[100]; char rua[200]; int num; char * frase = "Siga norte a partir da Avenida NS da Penha 1600"; sscanf(frase, "%*s %s %*c %*s %*s %[^0-9]s %d", dir, rua, &num ); printf("Direcao: %s \nRua: %s \nNum: %d \n\n", dir, rua, num); return 0; }

    scanf/sscanf/fscanf/etc lê uma string até encontrar um dos seguintes chars: ' ', '\t', '\n'. É dizer que si temos que ler algo com nome, e sobre nome, algo como "Pedro Alcantra", se tentar ler  isso com scanf por exemplo, e querer guardar em uma variável como char nomeCompleto[100], você tem que fazer algo como scanf("%s", nomeCompleto). porém logo depois de entrar com a string "Pedro Alcantra" e imprimir nomeCompleto você vai se dar conta que somente LEU "Pedro". Ué! Onde tá o Alcantra? Ficou no buffer! Por quê? Porque como falei, o scanf só lê ate encontrar espaço(' '), tabulador('\t') ou até encontrar enter('\n'), e justamente depois do "Pedro" tem um espaço(Entre "Pedro" e "Alcantra" temos ' '). O programa Lê Pedro e o resto fica no buffer de entrada(stdin) esperando uma nova variável para entrar.
    Se você fizer algo como:
    char nome[100];
    char sobrenome[100];

    e logo depois fizer:
    scanf("%s", nome);
    scanf("%s", sobrenome);

    Na hora que o programa esperar o nome você bota tudo ai no primeiro scanf "Pedro Alcantra".
    Adivinha o que vai acontecer? >_< Tenta imprimir...o pedro vai parar no nome e o alcantra vai parar no sobrenome.

    A explicação é que quando você ta escrevendo no teclado, tudo o que você ta escrevendo vai acumulando no buffer de entrada. Não vai parar de acumular até que o programa detecte que você pulsou enter('\n'). O enter também é considerado uma letra, e entra junto no buffer, mas depois de pulsar enter "começa a soltar lastre". >_<

    Depois de pulsar enter o scanf começa retirar letra por letra do buffer stdin, ele vai jogando na primeira variável que apareceu, essa é nome. Ele vai fazer isso até quando? Até encontrar espaço(' '), tabulador('\t') ou até encontrar enter('\n') omi!!

    Adivinha o que o scanf vai encontrar primeiro na sua frase? O espaço que está logo depois de "Pedro", dai como falei antes, ele para de jogar letras na "variável do momento", o restante fica no buffer.

    porém quando pulsamos enter, depois de entrar com uma frase como "Pedro Alcantra", a ordem é "Tira tudo fora!", o buffer tem quer ser esvaziado completamente. Se você botar outro scanf em seguida, o programa vai pegar o resto do que ta no buffer e vai jogar ele na seguinte variável que aparecer, mesmo esta estando em outro escanf, "MAS SÓ SE O TIPO DE VARIÁVEL COINCIDE COM O QUE FICOU NO BUFFER".

    Se você ler usar 2 strings consecutivos, o resto que permanecer no buffer depois que o primeiro scanf encontrar dessas três letras, se descarrega no segundo string, mas se aparecer uma variável de outro tipo diferente isso não vai acontecer. Isso só acontece se você ler ou 2 ou mais strings consecutivos, 2 ou mais chars consecutivos, ou você ler um char e um string logo depois... esse é um caso bastante especial. É especial porque a letra vai parar no primeiro char que aparecer, e o que vai parar no string é o enter(WTF!), causando vários erros na leitura.

    Se você não souber lidar com os problemas anteriores, certamente vão lhe causar muitos problemas. Isso acontece por que em C, se o programa ta esperando uma palavra e você escrever um simples char, ele aceita, então imagine que você tem que ler um char e depois um string, você entra uma letra como 'a' e pulsa enter, enter também é uma letra(igual que os outros chars e todo o resto sa tabela asc2), dai o que acontece é que você tem 2 chars pelo preço de 1. Os tipos coincidem perfeitamente, 'a' vai parar no primeiro char, e como falei antes uma letra(enter) pode entrar em um string, o resultado é um programa fora de controle. No fundo a culpa é do programador por não saber usar scanf+buffer corretamente, certamente por desinformação.

    Bom... agora que ja sabe um "pouquinho" mais( -_-' )  sobre o funcionamento do buffer + essas funções de entrada como scanf, sscanf e fscanf. Deixo claro que são todas mais ou menos iguais só que o scanf lê o string desde o buffer stdin, sscanf lê desde outra string, e fscanf lê desde um arquivo, mas todas leem desde outras strings....
    Vamos com a explicação disto: sscanf(frase, "%*s %s %*s %*s %*s %20[^0-9] %d", dir, rua, &num );

    sscanf lê desde frase. O primeiro parâmetro é a string frase na qual contêm a frase"Siga norte a partir da Avenida NS da Penha 1600".
    O segundo parametro é clave nessa historia, pois é ele que vai determinar o comportamento do scanf: "%*s %s %*s %*s %*s %20[^0-9] %d". Vamos com a explicação sobre o segundo parâmetro.
    Como sabemos temos a frase "Siga norte a partir da Avenida NS da Penha 1600". O primeiro especificador(%*s) é o contrario de %s. Se %s permite ler um string, e o joga em uma variável do tipo char[], %*s ignora por completo a primeira string que aparece. Ou seja... a primeira palavra na frase vai ser ignorada respeitando as regras que suamos antes para entender . A palavra "Siga" será ignorado pelo primeiro especificador até encontrar um daqueles 3 chars "ixpertinhos" que falamos antes, nesse caso até o espaço que vem logo depois de "Siga".

    Como %*s é o inverso de %s e ignora uma palavra, não precisamos passar nenhum argumento para a função, em outras palavras, só precisamos passar argumentos quando vemos %s, %d, %c, se vemos seus antagonistas(%*s, %*d, %*c) quer dizer que não temos que passar variáveis ok. O asterisco( * ) no meio de um especificador a essa altura acho que você ja deduziu o que faz... "ignora a leitura da variável".

    Como temos de frase "Siga norte a partir da Avenida NS da Penha 1600", %*s ignora "Siga".

    Agora nos situamos em "norte". Essa sim você quer jogar ela em uma variável chamada "direcao" certo? Trata-se de um string... então teríamos que usar algo como char direcao[100]. Dessa vez você está obrigado a passar o argumento no terceiro parâmetro de sscanf, que é nossa variável, pois não estamos ignorando nada, dessa vez vai haver leitura.

    Então agora %s lê "norte" e joga isso em dir(no meu caso). Agora nos situamos antes da 'a'. Lembre que 'a' também é um string se está dentro de outro string, então posso lhe ignorar tanto com %*s como com %*c, por conveniência eu usei %*s. Então os seguintes 3 especificadores %*s ignoram 3 palavras, ou seja "%*s %*s %*s" ignora a "a partir da".

    Agora ja chegamos adiante do nome da rua, heis aqui un problema.
    O problema que temos agora é que você quer jogar "Avenida NS da Penha" em uma só string e como falei o scanf tem aquele peculiar comportamento de tropeçar com as 3 variáveis que falei. porém não tudo está perdido...

    Existe um especificador que é algo mais complexo(mas nem tanto), que nos permite tragar tudo até onde queremos. Esse especificador é o %[algo]s onde "algo" é um conjunto de regras que serão respeitados na hora de ler as seguintes letras.

    No caso de %[^0-9]s, o primeiro a explicar é que quando o programa vê %[]s, ele vai ler atropelando tudo por adiante, incluindo espaços, tabuladores, tecla enter e o raio que o parta >_<. Dai a necessidade de dizer pro caboclo que não('^') queremos números de 0 a 9(0-9).

    Então %[^0-9]s quer dizer que comece ler desde "Avenida" até encontrar um numero qualquer de 0 a 9, si tiramos o ^(chapéu) quer dizer o contrario, que o especificador vai ler só números de 0 a 9, se encontrar um desses números passa ao seguinte especificador, e se não tiver mais nenhum sai do scanf. Com chapéu ele ignora.

    Isso aí é tema delicado, mas esse especificador %[]s é a coisa mais maravilhosa do mundo >_<.
    Alguns exemplos:
    scanf("%[BANGLADESH]", s);
    Só lê a palavra "BANGLADESH" se falhar sai fora do scanf, s é um string.

    scanf("%[^\n]", s);
    Le tropelando tudo até que o usuari pulse o enter. A diferença é que essa versão sim le algo como "Pedro Alcantra" e joga tudo em um só string ignorando os espaços.

    scanf("%d%*c%d", &h, &m);
    Para ler hora tipo 10:30. Tambem funciona:
    scanf("%d:%d", &h, &m);
    Nesse caso os os 2 pontos no caso do scanf quer dizer que ignore 2 pontos que pode aparecer entre 2 inteiros, é dizer que pega "10:30" e joga o 10 em h e 30 em m ignorando o : .

    scanf("%10s", s);
    s vai conter máximo 9 letras + \0 = 10 letras. Muito util si você tem "char s[10]" e não quer superar o tamanho do string s. O problema é que se você digitar 100 letras 10 vão a parar a s e o resto permanece no buffer, dai se você chamar outra string e não tevir espaço vou puxar sua orelha. kkk Melhor limpar o buffer antes de fazer um novo scanf.

    %*[ ] // ignora um espaço
    %10[ ] //ignora 10 espaços
    %[^a] //lê até encontrar uma letra 'a'
    %[^\0]s // lê até encontrar null. Bom para isso:
    char * frase = "Siga norte a partir da Avenida NS da Penha 1600"; char s[100]; sscanf(frase, "%[^\0]s", s); printf(s); Copia tudo da frase a s ignorando tudo(espaços, tabuladores e teclas enter), até encontrar o null que indica o fim da frase. Bom para copiar um string completo a outro, se parece muito a strcpy >_<

    Bom, ja está bem de exemplos, vamos continuar com o exemplo né... só que o único que restou foi ler o inteiro, e isso acho que ja não precisa de mais parlatório.
     
    Cara.. pratique muito com tudo isso que lhe expliquei leia muito sobre o comportamento dessas funções, como funciona os buffers stdion e stdou etc. falou? =)





     
  15. O post de vangodp em Problema com ponteiros c++ foi marcado como solução   
    Pois o programa sim funciona ok aqui:
     
    #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; class pessoa { private: char nome[30], email[50], telefone[10], rg[10], codigo[10]; public: void cadastrar(); void consultar(); }; pessoa **p; void pessoa :: cadastrar() { cout << "Digite o Codigo: "; cin >> codigo; cin.sync(); cout << "Digite o Nome: "; cin >> nome; cin.sync(); cout << "Digite o Email: "; cin >> email; cin.sync(); cout << "Digite o Telefone: "; cin >> telefone; cin.sync(); cout << "Digite o RG: "; cin >> rg; cin.sync(); }; void pessoa :: consultar() { cout << "Codigo: " << codigo << endl; cout << " Nome: " << nome << endl; cout << " Email: " << email << endl; cout << " Telefone: " << telefone << endl; cout << " RG: " << rg << endl << endl; }; int main() { const int TAM = 100; int y = 0, opc, new_opc; p = new pessoa*[TAM]; do { cout << "\n----- MENU -----" << endl; cout << "1- Cadastrar" << endl; cout << "2- Consultar" << endl; cout << "3- Alterar" << endl; cout << "0- Sair" << endl; cout << "----------------" << endl; cout << "Informe a Opcao: "; cin >> opc; cin.sync(); switch ( opc ) { case 1: system ( "cls" ); do { p[y] = new pessoa; p[y]->cadastrar(); new_opc = 0; cout << "Deseja continuar cadastrando? 1-Sim / 2-Nao " << endl; cin >> new_opc; cin.sync(); y++; } while ( new_opc == 1 && y < TAM ); system ( "cls" ); break; case 2: system ( "cls" ); for ( int i = 0; i < y; i++ ) { p[i]->consultar(); } break; default: exit ( 0 ); } } while ( opc != 0 ); delete[] p; return 0; } prove este
    adicionado 6 minutos depois certamente para liberar tem erro
     pois **p é como uma matriz, deveria liberar cada umas das posições de p[] primeiro para ultimo liberar o ponteiro.

    for( int i = 0; i<tam; i++ )
    delete[] p;

    E depois.
    delete p;
     
    Essa seria a forma correta de liberar.
  16. O post de vangodp em Dicas boas pra nomenclatura de variáveis? foi marcado como solução   
    Em realidade não existe norma alguma, existe umas regras que estipula a linguagem, porém as tais normas depende mais do equipe de trabalho. Por exemplo para Classes e estruturas você pode usar a primeira letra em maiúsculas para o tipo e todas minúsculas para o identificador. Por quê? Simples...! pense que você declare uma estrutura tipo:
    struct Lista{...};

    Dai você vai criar um objeto da lista, porém pense que que se você tivesse declarado essa estrutura tal como struct lista{...}; você não poderia fazer isso ao criar um objeto do tipo lista:
    struct lista lista; //Errado

    Nesse caso você pode apreciar que não faz sentido algum tanto lista do tipo como lista do identificador chamar-se iguais "lista lista", para o programa ja existe um tipo chamado "lista" que é a struct, e você quer declarar outro chamado igual. porém as vezes é interessante chamar a variável igualmente como o mesmo tipo mas com tipos de letras diferentes
    struct Lista{...};

    struct Lista lista;

    Agora sim faz mais sentido não?

    E si fazemos um typedef? Então recomendaria algo como:
    struct _Lista{...};
    typedef struct _Lista Lista;

    Agora podemos criar a variável assim:
    Lista lista[100];

    Ótimo não?
    Pense em uma agenda... nesse caso faz mais sentido ainda.
    struct _Contatos{
    char nome[100];
    int telefone;
    };
    typedef struct _Contatos Contatos;
    Contatos lista[100];

    Nesse caso você teria uma lista de 100 contatos no qual você pode fazer:
    lista[1].telefone = 999999999;

    Ou se preferir:
    Contatos contato[100];
    contato[1].telefone = 999999999;

    Esse ultimo faz mais sentido ainda não? queremos o telefone do contato 23 fazemos
    printf("%d", contato[23].telefone);

    Então com tudo isso vimos que "talvez" seja melhor chamar as estruturas com um '_' adiante do seu nome, por que logo depois podemos fazer um typedef(definição de um novo tipo de dados), que no caso seria o mesmo tipo mas sem o '_' adiante, permitindo declarar coisas como Agenda contato[10] ou Agenda auxiliar por exemplo.

    Sobre espaços, nomes, etc, eu não me preocuparia muito, quando você for trabalhar em equipe certamente a equipe vai adotar umas certas "normas" que permita "todo" o grupo trabalhar mais ou menos de forma clara para todos. Certamente todos iriam se por de acordo se usar diasMes ou dias_mes, se usar struct Lista ou struct _lista, ou usar inclusive coisas diferentes.

    Agora mesmo meu conselho é adotar a forma mais cômoda que você achar melhor, quando for trabalhar em grupo certamente terão reuniões para estipular o "tipado" do código que todos usarão.

    Provavelmente você mesmo se dará conta da melhor forma de fazer isso com o tempo, ao ler código de outros usuários.
  17. O post de vangodp em Problema com orientação a objetos em c++ foi marcado como solução   
    se você declarou um array de de uma só pessoa(pessoa p[1]) como você quer cadastrar múltiplas pessoas? Ou você declara um array maior de pessoas que x ou como minimo igual. Exemplo... si tiver que ler a nota de 10 alunos pessoa p[10]; ou pessoa pessoa p[100];, mas nunca você deve fazer pessoa p[9]; ou menor. O correto seria você fazer isso:
     
    #include <iostream> using namespace std; class pessoa { private: char nome[30]; float* nota; int tnota; //tamanho de nota public: void cadastrar_nome(); void consultar_nome(); void cadastrar_nota(); void consultar_nota(); void setSizeNota(int); //destrutor ~pessoa(); }; //pessoa p[1]; void pessoa::setSizeNota(int tam){ tnota = tam; nota = new float[tnota]; } //destrutor pessoa::~pessoa(){ delete[] nota; cout << "Recursos liberados" << endl; } void pessoa :: cadastrar_nome() { cout << "Digite o nome do Aluno: "; cin >> nome; }; void pessoa :: cadastrar_nota() { for (int i = 0; i<tnota ; i++) { cout << "Digite a Nota "<< i << ": "; cin >> nota[i]; } }; void pessoa :: consultar_nome() { cout << "Nome: " << nome << endl; }; void pessoa :: consultar_nota() { for (int i = 0; i<tnota ; i++) { cout << "Nota " << i << ": " << nota[i] << endl; } }; int main() { int i, j, x, y; pessoa* p; cout << "Digite o numero de Alunos: "; cin >> x; cout << "Digite o numero de Notas: "; cin >> y; //array dinamico de pessoas p = new pessoa[x]; //array interno dinamico de notas for ( i = 0; i<x ; i++) { p[i]. setSizeNota(y); } for ( i = 0; i < x; i++ ) { p[ i ].cadastrar_nome(); p[i].cadastrar_nota(); } for ( i = 0; i < x; i++ ) { p[ i ].consultar_nome(); p[ i ].consultar_nota(); } delete[] p; } Ou seja, usar memória dinâmica.
     
  18. O post de vangodp em Estudo extensões foi marcado como solução   
    Um arquivo binário nada más é que uma representação da memória. você pode guardar todos os dados em uma struct e enviar ao arquivo usando funções como fread e fwrite. O que vai ir parar no arquivo são inteiros, floats, chars, etc, A mesma forma de dados que está na memória.

    Outra solução seria usar arquivos .INI
  19. O post de vangodp em Code::blocks erros foi marcado como solução   
    Se você não fez o download do codeblocks conjuntamente com o g++ talvez você tenha que configurar o toolchain manualmente.

    O problema é que as vezes o nome dos arquivos podem variar, uns arquivos podem se chamar mingw32-gcc.exe e outros ter coisas extras como i686-w64-mingw32-gcc.exe, por esse motivo pode que toolchain não encontra certos arquivos. Veja essa outra imagem e compare com a primeira, a primeira é um print do meu toolchain, a segunda imagem foi tirada da internet e leva os nomes mais comuns, porém como eu instalo compilador e IDE por separado acontece isso.

     
    você precisa indicar a pasta que contem a pasta bin, e se o toolchain no pegar a configuração automaticamente você precisa fazer a mão. você precisa buscar os arquivos que mais se parecem a aos nomes dessa ultima imagem.

    Também terá de indicar na aba seach directories as pastas include e lib que normalmente estão juntas com a bin.
  20. O post de vangodp em Qual é melhor para manipulação de arquivos? c ou c++? foi marcado como solução   
    A diferencia poderia se dizer que é "filosófica". >_<

    Em C trabalhamos com "Descritor de Arquivos", uma espécie de ponteiro a arquivo, também conhecido originalmente por "File Descriptor" ou abreviadamente por "fd".

    FILE* fd;
    fd=fopen(NomeDoArquivo, ModoDeAbertura);

    Em c++ o conceito é de trabalhar com streams, que traduzido para leigos quer dizer fluxo de dados.
    Para trabalhar com arquivos você pense que ou tem fluxo de entrada(in) ou de saída(out), de dados.

    //fluxo saida
    ifstream fout;
    fout.open(NomeDoArquivo, Flags(Modificadores opcionais) );
    fout << "cpp";

    //fluxo entrada
    ifstream fin;
    fin.open(NomeDoArquivo, Flags(Modificadores opcionais) );
    string palavra;
    fin >> palavra;

    Tecnicamente fin e fout são obviamente nomes que dei assemelhando-se a cout e cin, porém são também uma espécie de ponteiro que marca a posição onde nos encontramos no arquivo, assim como em C. A diferencia é que C++ se pode apreciar é o uso de operadores << e >> em relatividade a C que não inclui essa prática.

    Sinceramente em todos esses anos trabalhando com ambos linguagens não vejo grandes diferenças, posso fazer a mesma coisa com um linguagem que com outro. A diferença talvez mais significativa seja a linguagem em si, cpp acho um linguagem mais útil a dia de hoje, permite trabalhar com streams como cout, cin, ifstrem, ofstream, stringsteram, etc, classes e todo o relacionado com elas como a OO. Sempre que quiser trabalhar com C dentro de CPP será possível já que C esta incluído dentro de CPP também, ou como dizem... cpp é um "superconjunto de C", antigamente se poderia dizer isso, porém C++ já foi tão remodelado que é um linguagem completamente  independente de C.

    As vezes pode ser que também queiramos fazer algo muito simples e pequeno, quando isso acontece prefiro faze-lo em c, mas quando a coisa é seria e demolidora prefiro usar c++, porque brinda algumas facilidades que C não fornece, ainda a cambio de inclusão de coisas mais complexas como OO. A OO a objetos pode ser uma barreira difícil de se superar ao principio para um programador novato, sobre tudo se esse programador já veio de outro linguagem como C, pode fazer sua cabeça explodir(>_<), mas superada essa etapa de aprendizagem OO pode se fazer querer, e em alguns casos pode criar muita dependência(Como uma droga). XD

    Sinceramente acho que quando uma pessoa tem algumas duvidas como essa deveria experimentar ambas formas para tirar suas conclusões.

    Se quiser um conselho aprenda C++ pois é um linguagem com maior saída hoje em dia. Más seria mentir se achar que vai aprender um sem aprender o outro praticamente , eu optei por aprender ambos, e não me arrependo disso.
     
  21. O post de vangodp em Sistema de gerenciamento de tempo foi marcado como solução   
    Em C? Normalmente se usa em C++. porém são simples métodos que mostram e pedem dados ao usuário.
  22. O post de vangodp em Ecercício C++ com Função foi marcado como solução   
    certamente é por causa que aqui você declarou "char dog, dog2, cat, cat2, coelho, coelho2, roedor, roedor2;",
    e logo depois você declarou uma função chamada "dog(){...}", que por certo esta mal declarada, pois deve levar o void adiante de forma que fique void dog(){...}, não só essa função si não todas elas.... Onde esta o tipo de retorno das funções? Se uma função não tem que retornar nenhum valor essa seria void.
  23. O post de vangodp em Matriz que lê um bloco de notas. foi marcado como solução   
    Lendo só produtos INTEIROS de cada produto quimico. 
    #include <stdio.h>typedef struct{ char nomeProduto[100]; int numero[5];}Dados;int main (){ Dados d; FILE * f = fopen("file.txt", "r"); while( fscanf( f, "%s %*f %*f %*f %*f %*f %d %d %d %d %d ", d.nomeProduto, &d.numero[0], &d.numero[1], &d.numero[2], &d.numero[3], &d.numero[4] ) != EOF ) { printf("%s %d %d %d %d %d\n", d.nomeProduto, d.numero[0], d.numero[1], d.numero[2], d.numero[3], d.numero[4] } fclose(f); getchar(); return 0;} Ok?   
  24. O post de vangodp em elaborar um sistema para cadastrar e listar os membros de um clube de games foi marcado como solução   
    #include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct { int codigo; char nome[40]; int edade; char Gpreferido[10]; char email[40];}Membro;int menu();void salvarDados ( Membro *m );void listar ( const char *tipoCliente );int cargarDados( FILE *f, Membro *m );void printMembro(Membro *m );void tomarDados(Membro *m);void flush_in();void salvarDados ( Membro *m ) { FILE *f; f = fopen ( "bdmembro.txt", "a" ); if ( !f ) { perror ( "Erro: " ); return; } fprintf ( f, "%d %s %d %s %s\n", m->codigo, m->nome, m->edade, m->Gpreferido, m->email ); fclose ( f ); printf ( "\n" ); printf ( "Cadastro Realizado com sucesso !\n\n" );}void cadastrar(){ Membro m; tomarDados(&m); salvarDados(&m);}void listar ( const char *tipoCliente ){ FILE *f; f = fopen ( "bdmembro.txt", "r" ); if ( !f ) { perror ( "Erro: " ); return; } Membro m; system("cls"); while ( cargarDados( f, &m ) ){ if ( strcmp(tipoCliente, "todos")==0 ){ printMembro(&m); }else if ( strcmp(tipoCliente, "menores")==0 ){ if ( m.edade <= 17 ){ printMembro(&m); } } } fclose ( f ); printf ( "\n" ); printf ( "Listado todos os clientes %s!\n\n", tipoCliente ); }void printMembro(Membro *m ){ printf ("%d %s %d %s %s\n", m->codigo, m->nome, m->edade, m->Gpreferido, m->email );}int cargarDados( FILE *f, Membro *m ){ int leitura = fscanf( f, "%d %s %d %s %s%*c", &m->codigo, m->nome, &m->edade, m->Gpreferido, m->email ); return ((leitura == EOF )? 0:1);}void tomarDados(Membro *m){ system("cls"); printf ( "Entre com o codigo: "); scanf("%d", &m->codigo); flush_in(); printf ( "Entre com o nome: "); scanf("%39[^\n]", m->nome); flush_in(); printf ( "Entre com o edade: "); scanf("%d", &m->edade); flush_in(); printf ( "Entre com o genero preferido: "); scanf("%9[^\n]", m->Gpreferido); flush_in(); printf ( "Entre com o email: "); scanf("%39[^\n]", m->email); flush_in();}int main() { int continuar = 1; while ( continuar == 1 ) { switch (menu()) { case 1: cadastrar(); break; case 2: listar("todos"); break; case 3: listar("menores"); break; case 0: continuar = 0; break; default: break; } getchar(); system ( "cls" ); } return 0;}//mainint menu() { int op; printf ( "1-Cadastrar membro:\n" ); printf ( "2-Listar membros (todos):\n" ); printf ( "3-Listar membros menores de 18anos:\n" ); printf ( "0-Sair\n" ); scanf ( "%d%*c", &op ); return op;}void flush_in() { int ch; while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}} É uma versão meia capenga de algo que você pode melhorar, eu não gosto muito de aplicar arquivos binários para coisas pequenas, más se quiser binários tem que modificar um pouco, logicamente com binários se consegue uma melhor funcionalidade a troca de uma maior capa de dificuldade.
  25. O post de vangodp em falta terminar este codigo foi marcado como solução   
    você não esta sabendo como trabalham os ponteiros que lêem um arquivo, você esta fazendo muita confusão por não entender o fundamentos básicos das operações com arquivo. Tenha claro que cada vez que lemos algo, o ponteiro avança, existem varias funções que lêem, char( como fgetchar()), strings(fgets()), dados de vários tipos( fprintf() ) etc,  si eu utilizar fgetchar por exemplo, ele vai ler um Byte e avança ao principio do segundo. Eu ja coloquei uma função que lê o arquivo justo no final, então se supõe que o ponteiro esta no final, não há mais nada que ler. Entendeu?
    Quando abrimos o arquivo devemos indicar onde o ponteiro vai iniciar. Como fazemos isso? Pois quando indicamos o segundo parâmetro de fopen("nome.txt", "AQUII!!!");! Até aqui nada novo baixo ao sol, sabemos que r lê, então se vai ler, o lógico que ele começa no inicio do arquivo, mas si vamos adicionar conteúdo, o óbvio é primeiro o ponteiro se deslocar até o fim do arquivo e escrever lá, isso se faz com "a" de append. Si não há nada que no arquivo e queremos escrever nele ou sobrescrever, então o segundo parâmetro é "w". Essas letras, a, r, w... definem o comportamento do ponteiro, imagine que o ponteiro é seu dedo, si vai ler você abre uma pagina(isso é fopen), você leva seu dedo ao começo da pagina( "r" já que vamos ler), ao terminar fechamos o livro, (isso é fclose). Si fechar o livro você já não pode por o dedo não? Pois igualmente si você fechar o arquivo você perde o ponteiro e o ponto onde ele estava.
     
    Então agora si você for lá no seu código você vai ver que nem precisava de 2 ponteiros, com um só poderia ter feito o trabalho perfeitamente.
     
    Tudo isso ainda não respondeu sua pergunta, voltando ao assunto, si eu ja fiz uma leitura antes de você, desse seu ultimo loop, então como falei, o ponteiro esta no final, ai foi você lá e colocou um for no fim, conclusão, seu for quer ler até encontrar null, e é o primeiro que ele vai encontrar. Ai você me vai dizer... Tá mas eu vejo uns números estranhos que não são os que eu coloquei. Bom... em minha defesa eu direi que é por que sua matriz tem lixo, ela contem restos de outros programas que usaram a memória antes de você, igualmente quando você usa memória você nunca volta a por ela a null. Verdade?  Aí vai outro programador e usa seu espaço com o lixo que você deixou lá  . Resumindo é programador trolando programador . Solução... Si você tivesse declarado sua matriz tal como int nomeMatriz[valor1][valor2] = {0};, esse = {0}, estabeleceria toda sua matriz a nulls na hora da declaração, então seu programa sairia um bonito zero. Mais isso ainda não é a solução.  
    A solução para seu problema está em usar uma função que vem lá da época das memórias a "fitas", quando os computadores tinham aqueles rolos enormes de fita para memória, por aquela época então existia uma função chamada rewind(ponteiro), si você chamar ela antes de uma nova leitura, o ponteiro vai se posicionar ao principio do arquivo novamente sem precisar fechar e abrir ele, sempre e quando seja do tipo que você quer, si você esta lendo e depois você quer escrever, não há lógica em você usar rewind si não poderá usa-lo para escrever, nesse caso, acho que existe uma outra que se chama reopen, mas essa não estou muito seguro, simplesmente feche ele com fclose e abra ele com fopen no modo correto novamente.
    #include <stdio.h>#include <stdlib.h>int main() { FILE *p; int lin, col; int mat[3][3]; int i, j, soma = 0; //sobra-> , num; p = fopen ( "matriz.txt", "w" ); if ( !p ) { perror ( "Erro: " ); getchar(); exit ( EXIT_FAILURE ); } for ( lin = 0; lin < 3; lin++ ) { for ( col = 0; col < 3; col++ ) { printf ( "matriz[%d][%d]=", lin + 1, col + 1 ); scanf ( "%d", &mat[lin][col] ); } } for ( lin = 0; lin < 3; lin++ ) { for ( col = 0; col < 3 - 1; col++ ) { fprintf ( p, "%d ", mat[lin][col] ); } fprintf ( p, "%d\n", mat[lin][col] ); } fclose ( p ); int matriz [3] [3]; p = fopen ( "matriz.txt", "r" ); if ( !p ) { perror ( "Erro: " ); getchar(); exit ( EXIT_FAILURE ); } system ( "pause" ); system ( "cls" ); printf ( "\nA MATRIZ DIGITADA E:\n" ); //essa é a vez anterior que eu fiz a ultima leitura for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) { fscanf ( p, "%d", &matriz [ i ] [ j ] ); printf ( " %3d ", matriz [ i ] [ j ] ); } printf ( "\n" ); } //Nesse ponto o ponteiro está no final do arquivo justo antes do null, nao podemos ler mais nada //Justo aqui chamo a rewind para que o ponteiro volte ao principio, e paso para ele p. rewind(p);//rebobinamos a fita =D for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 3; j++ ) { fscanf ( p, "%d ", &mat [i][j] ); // faltou o mat [i][j] depois de p, "%d",... (terceiro argumento) //mat [i][j] = num; <- sobra //soma = mat [i][j]; //isso nao funciona = ponha += soma += mat [i][j]; } fscanf ( p, "%d%*c", &mat [i][j] ); // faltou isso //fprintf ( "a soma e: %3d", soma ); isso vai fora do loop... } printf ( "a soma e: %d", soma ); //...Aqui! fclose ( p ); //fclose ( p );//fechar uma só vez esse nao fará efeito return 0;} Olha... si tiver muita duvida sobre arquivos melhor você me adicionar lá no skype >_<. Prometo ser bonzinho XDD
     
    Sorte.

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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!