Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. O mínimo do Code::Blocks é pouco. A interface é horrível. Ficou anos sem ser atualizada e agora que o fizeram pouco mudou. Tem problemas em máquinas com mais de um monitor, a tela inicia maximizada, a interface é ruim. Tem a cara de pau de usar os padrões de C de 89 e C++ de 98. Eu não faria isso com um aluno meu, obrigar o cara a usar um programa desses a partir de 2000. A interface é tão ruim que a splash screen de início não fica visível sobre as outras janelas, e o programa não entra na lista de tarefas antes de ele rodar o mecanismo de detecção dos compiladores. Tosco. Depois que saiu o Visual Studio Code houve uma migração em massa para ele, nas escolas, no Youtube, nos cursos online e tal. Não há como comparar. O dinheiro é o que resolve. A Microsoft tem os melhores caras e o maior orçamento... E aí o programa é melhor. Mais bonito, mais fácil de usar e muito mais flexível. E de graça. e tem o CLion. A JetBrains sabe escrever essas coisas. Um pouco caro mas pode ser grátis para as escolas. E ele ajuda demais na hora de aprender então pode ser um problema. Ele gera classes, preenche coisas, gera código sózinho. Visual Studio é o padrão. Eclipse em alguns lugares. VS Code é o novo. E agora tem em beta o Visual Studio CodeSpaces que deve ser uma revolução nessas coisas. Eu não sei. Visual Studio é o padrão. Não tem nada igual. E todo mundo usa. Eu acho que é muito bom. Mas é gigante. A NSA usa, o Bradesco usa, a escola usa, as seguradoras usam, as financeiras usam... Em Visual Studio você pode abrir um projeto na sua máquina e me mandar um convite pra eu te ajudar, por exemplo. E eu posso abrir o seu projeto na minha máquina e acompanhar com você uma execução de teste. E a gente pode incluir até 30 caras na revisão. E todos vão acompanhando na máquina deles o cursor, o mouse, os arquivos. Nem é preciso ter o Visual Studio instalado na máquina de todos. Mas se tiver é mais flexível. A integração com o git é perfeita. Então você pode abrir um projeto direto a partir de um repositório. Pode fazer isso com códigos que eu postei aqui por exemplo. E se pode trabalhar em equipe no projeto, mantendo as diferenças, incorporando as correções de cada um, muito produtivo A documentação está sempre a um click, o código é completado, ele mostra os parâmetros das funções, inclusive das que você escreveu. Tem integração com o vcpkg então você pode incorporar bibliotecas como SDL ou wsWidgets sem fazer nada. Basta abrir o projeto e começar a escrever Tem integração com o cmake então pode criar builds imensos compatíveis com outros ambientes. Isso é usado em projetos com milhares de arquivos. Mas o VS Code é muito esperto. Muito mesmo. E você pode rodar código no Mac e no Linux com os fontes no Windows sem sair da cadeira. Incluindo o debugger. E usar vários compiladores e linguagens e terminais. É impressionante e vem sendo adotado muito rápido. adicionado 2 minutos depois VS Code é controlado por essa noção de tarefas e builds. Um pouco como o Code::Blocks, o Eclipse e o Dev-C++. Sequer tem um compilador, a exemplo desses outros. Então você cria esses formulários json para descrever o compilador e as funções. Acho que você não leu a documentação... Vou ver se tenho um desses json aqui que eu possa te mostrar. Que compilador você vai usar?
  2. Você disse que tinha instalado Visual Studio... É outro programa completamente diferente...
  3. Eu sei. Mas são muito problemáticos. Não funcionam facilmente... Eu instalei e toda hora aparece um problema, como essa coisa absurda do Dev-C++ A nova definição de amigável é mesmo o Visual Studio Code, já há uns 2 anos. E o IDE de produção acho que vai continuar mesmo sendo algo entre Visual Studio, Eclipse, NetBeans e CLion. Qual seria um problema para rodar algo no Visual Studio?
  4. Não não... Veja a sugestão acima de @holifaca Vou te mandar um programa que vai ajudar a entender uma solução possível pra isso, e comum. Ao menos eu já usei incontáveis vezes. O lance de LoadFromMemory() no seu caso é replicar o que o sistema faz com os chamados resources --- e o sistema faz isso de modo transparente em geral. No geral o que você quer fazer é o que está descrito aqui https://docs.microsoft.com/en-us/windows/win32/menurc/about-resource-files mas sem arquivos .rc e sem o Microsoft Resource Compiler. Então se pode imitar os caras... Na maioria dos casos o que você quer é inserir coisas, como sons e imagens, no executável no início do programa. Lendo do disco, e depois usar sempre a partir da memória. Mas você quer embutir isso direto no executável para não ter que distribuir os arquivos que seriam lidos na carga do programa. Vou te mostrar uma classe depois com um jeito de fazer isso e um programa que eu postei outro dia aqui que ajuda a entender a simples ideia e aí você acerta pra seu uso. Em resumo você declara uma classe Recurso que faz o meio de campo. Essa classe cria um recurso e aí você pode usar um vetor ou um mapa ou qualquer coisa para guardar os tais recursos. Ou mesmo nada se forem poucos recursos, Talvez algo assim já resolva: #pragma once #include <iostream> using namespace std; class Recurso { public: std::string nome; private: unsigned char* conteudo; int tamanho; public: Recurso(string, int, unsigned char*); ~Recurso() { delete[] conteudo; }; int Dump() {}; }; // class No construtor do Recurso você aloca a memória para ele e carrega o valor. E lá você passa conteudo que é liberado no destrutor; O método Dump() mostra na tela os bytes para você saber que carregou certinho Uma declaração usando o construtor seria algo assim //Magica int magica = 0; Recurso png1("MeuPng1", 8, "12345678"); E agora? Em main() você vai ter uma série de declarações de recursos, e na declaração vai estar tudo acertado já. Imagine um arquivo assim # recursos teste.png png1 azul.ico ico1 outro.png png2 E você faz seu programa normalmente, já assumindo que os recursos estão lá, e pode usar LoadFromMemory() e tal. Como costurar isso? Você preprocessa seu programa fonte usando o arquivo de recursos acima e cria as declarações certinhas a partir daquele comentário //Magica e insere as declarações para os recursos. E muda o valor do int magica também. Como seria esse programa O int magica serve para você em runtime saber se não está rodando um fonte que não foi preprocessado. Ao ajustar o programa você só vai gerar um trecho de código, como se fosse um #define. Mas então se magica for ainda 0 em tempo de execução é porque você está usando um fonte compilado sem a inserção dos recursos. Deu pra entender? E a partir daí o processo é um simples loop: para cada arquivo em recursos você vai no disco e vê o tamanho dele e gera a declaração de acordo: o nome que está no arquivo de entrada, o tamanho que leu no disco e a string que vai criar a partir do conteúdo. Assim você cria os recursos no stack usando alocação dinâmica, a memória já é liberada no final sem você fazer nada e a vida segue. Se usasse como estático poderia ter problemas com o tamanho do heap.
  5. Então tenho boas notícias. É bem simples. Vai usar C++ mesmo?
  6. por acaso o 112 no seu exemplo é simplesmente o tamanho do arquivo e o char[] o conteudo em bytes?
  7. loadFromMemory("\x89\x50\x4e\x47\xd\xa\x1a\xa\x0\x0\x0\xd\x49\x48\x44\x52\x0\x0\x0\x6\x0\x0\x0\x8\x8\x6\x0\x0\x0\xda\xc6\x8e\x38\x0\x0\x0\x37\x49\x44\x41\x54\x8\xd7\x65\xcc\xd1\xa\x0\x20\x8\x43\xd1\xbb\xfd\xff\x3f\xdb\x4b\xd9\x32\x41\x90\x1d\x19\x40\xed\x7d\xc6\x0\x55\xc5\x44\x9f\x63\xa2\xf3\x2b\xd1\xb3\xfb\xe0\x7\x92\x6e\x95\xa4\xe\xda\xb3\x25\x61\x1\x50\x1f\x13\x6\x81\x80\xaf\xc6\x0\x0\x0\x0\x49\x45\x4e\x44\xae\x42\x60\x82", 112); Isso não é o formato. Você tem aí um char[] e um byte 112. Se a primeira parte é simplesmente o conteúdo do arquivo e 112 é algum número mágico, aí sim temos um formato. É isso? Se for isso aí te digo umas maneiras de fazer isso se não for me diga como passar do arquivo original para essa string aí e vemos uma opção
  8. Vai converter para que formato? adicionado 0 minutos depois E onde entra o lance de 15 mil linhas? png não tem linhas
  9. Dev-C++ não é um compilador. Quando instalado no modo padrão no Windows vai incluir uma versão de gcc, esse sim um compilador C/C++ para Windows. Dev-C++ é um ambiente problemático. Se estiver usando com ele o compilador da Microsoft ou alterar o makefile nele para usar o linker LINK da Microsoft acho que pode usar /SUBSYSTEM:CONSOLE e ele para no final de todo programa de console Usando gcc eu acho que não tem jeito. Eu nunca imaginei que isso existisse, mas parece que é o caso. E é muito 1d10t@. Totalmente bu##0 e por si só uma razão para usar outro ambiente. Ao mudar um programa para atender a uma fragilidade do ambiente --- que poderia ter sido corrigida facilmente nesses anos todos --- se cira um problema: você não pode testar o programa no IDE e rodar em produção ou na console a seguir. Claro, não é esperto rodar o programa apenas no IDE porque é um ambiente diferente e o programa pode não rodar no computador ao lado. E o computador ao lado pode ser o do cara que te pagou pra fazer o programa, ou o computador do professor que vai avaliar o que você fez. Mas durante o desenvolvimento essa é uma das razões de se usar um IDE: aumentar a produtividade porque você não precisa sair do ambiente, como era antes no ciclo tradicional de editar compilar "linkar" testar. No Code::Blocks, um outro arcaico IDE muito citado aqui, você pode usar isso E o programa vai parar ao final, sem fechar a janela da console. E sem inserir coisas no programa... Claro que só rodei agora pra testar então pode ter outros problemas. Mas dá pra ver que o programa para sem artifícios bobinhos como ler uma letrinha ou chamar system(). Entenda que uma bobagem dessas transforma qualquer programa em uma coisa interativa do tipo em que você tem que ficar esperando o programa terminar para poder rodar outro. Parece primitivo não é? Sim. Deve parecer, porque é. Se você quer deixar rodando 12 testes do seu programa que demora 5 minutos e sair pra fazer outra coisa, esqueça: vai ter que ficar de babá dele pra teclar ENTER 4 vezes... Isso não acontece com CLion ou Eclipse ou VS Code ou Visual Studio ou qualquer ferramenta minimamente séria. Eu nunca tinha ouvido falar nisso e só acredito agora porque não achei uma opção nesse Dev-C++. Até instalei pra ver. Recomendo muito migrar para um ambiente mais "adulto".
  10. @devair1010 não entendi porque separou apenas d e i Não faz diferença: todos os especificadores funcionam do mesmo modo. @José Eduardo Corrêa Tavare sugiro sempre usar um gabarito e escrever antes o que quer, como no notepad por exemplo. E aí alinhar melhor usando o que foi explicado aqui. Note que pode usar também os sinais de + e - para alinhar os campos. E pode imprimir um gabarito na tela do seu programa mesmo para ir alinhando até ficar como quer... É de graça. EXEMPLO ***Resu1tado*** ***Resu2tado*** ***Resu3tado*** 123*567X 23*567X 23*567X 2.2 4.6 8.6 8.4 7.1 8.4 Pressione qualquer tecla para continuar. . . Veja a linha com os "123*678" que obviamente tem posições e os 3 printf() com "Resultado" que tem 16 posições mas quero colocar em 20... printf("\n"); printf("%20s", "***Resu1tado***\n"); printf("***Resu2tado***\n"); printf("%-20s", "***Resu3tado***\n"); printf("\n"); printf("123*567X 23*567X 23*567X\n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%8.1f", resultado[i][j]); printf("\n"); } printf("\n"); E entenda cada coluna da matriz está mesmo usando 8 posições para o %8.1f o primeiro printf() para Resul1tado alinha o texto a direita, com as 20 posições. Sobre isso Entenda: Terminar seu programa com um "pause" é uma coisa bem esquisita. Usar system() em geral é um erro. E em muitos lugares é proibido. Está usando C ou C++. Seu sistema inteiro foi escrito em C ou C++. Inclusive system. Então não há razão para chamar system(0 em especial para parar o programa. Espero que tenha aprendido isso de um vizinho e não de um professor ou livro Entende que assim jamais vai poder rodar vários testes de seus programas, por exemplo? A menos que fique parado esperando cada teste teste terminar para teclar... um ENTER? Sério? Se "aprendeu" isso por causa de seu IDE pense que deve ter uma opção NELE para não fechar a janela E de todo modo não devia testar seus programas dentro do IDE mesmo...
  11. cout<<"(Atenção:se você for escrever os numeros em reais,não coloque virgula, mais um ponto em vez da virgula.)\n\n"; off-topic? O compilador C++ não pega isso mas: a primeira ',' não se aplica a palavra vírgula tem acento a palavra é "mas" e não "mais" porque o sentido é de adversidade e não de soma... Isso não é um bug. Apenas está usando a função errada para ler. Uma possibilidade seria fazer como recomendado e usar getline(). C++ tem uma classe mais conveniente para tratar strings: string. Use.
  12. Não só é viável como é muito comum. Mas não é esperto. Se acompanhou alguma dessas quase religiosas discussões sabe o que acho . Na prática, se precisa ter controle mesmo não usa nenhuma dessas. Mas para ler dados de entrada como esses de programas de estudantes o simples é o que eu disse: usae fgets() e leia em linhas, ou use fgetc() e leia as letras. adicionado 2 minutos depois Wow genial esse Mas não vou mesmo saber o que seria "cpp" nesse contexto. Poste algum desses qualquer hora. C++ é outra linguagem. Muito diferente.
  13. Se eu te mostrei como criar tantos itens de cadastro quanto queira, porque está ledo do teclado, o que eu te disse pra não fazer NUNCA antes de terminar o programa? Para ler uma string usando scanf() use o especificador certo %s Eu sempre posto isso então vou repetir: scanf() não foi escrita para ler essas coisas. scanf() é para scanf formatted input. Ler campos do teclado não é "entrada formatada". É possível, mas não devia. Use gets() para ler linhas ou getc() para ler caracteres. É como correr de meias: possível, mas provavelmente não compensa
  14. O jogo dura entre 1 minuto e 24h. Então você vai lá e entra com um jogo que começou as 5:03 e terminou as 5:02 Então deu um número negativo porque ele terminou antes de ter começado?.... É Ou terminou um minuto depois das 24H estabelecidas como máximo... O erro que vai dar vai depender de como escreveu o programa... Errado está.
  15. Pode explicar o que quer fazer e a estrutura do arquivo? É uma matriz esparsa? Ou algo sem estrutura? O que pretende fazer com os dados? É pouca informação para sugerir algo. Ao menos para mim
  16. Pode até escrever assim, mas não é comum. Quando se acessa a estrutura por endereço se usa ->. Mas claro que se cad é um ponteiro (*cad) é o valor e então pode usar '.' Já *cad é o que se chama de instância da estrutura apontada por cad. Ao menos não estava usando o Code::Blocks. Muito importante isso que fez, porque a versão de 1989 é, digamos, de 1989. E não dá pra imaginar que nada tenha melhorado depois. E melhorou muito. Não tenho a menor ideia do que possa ser isso. Pode explicar de outro modo? Que seria "cpp no meio"? Imagino que já saiba agora porque eu te mostrei um exemplo. E retornar void como eu disse em geral é um desperdício ou um erro mesmo. Veja que você pode por exemplo ter uma função Cliente* fabrica(); que faz o contrário: não tem argumentos, mas a cada vez que você chama ela cria e devolve um item de cadastro completo. Muito conveniente, porque pode ser um registro de teste ou um de verdade e faz toda a diferença no desenvolvimento e na produção. Não. Pois é: talvez devesse mudar desses ambientes mais antigos... CLion da jetbrains é sensacional. VS Code da Microsoft é muito bom, Visual Studio é o padrão no planeta. Eclipse é legal. Evite o Dev-C++. E se não te pagarem bem ou te apontarem uma arma ou te obrigarem de algum modo, evite o Code::Blocks. Quanto a isso: Isso É um exemplo! Pra que vai procurar um exemplo de um exemplo? O que não entendeu? Basta ler o código: um cadastro tem um vetor de clientes. limite marca, digamos, o limite: quantos cabem. total marca quantos tem dentro. Em geral se usa ao invés de Cliente[30] que está fixo, um vetor de clientes e você aloca dinamicamente e poe o quanto alocou em limite. Porque? Bem, digamos que se alocou 40 então 40 é o limite e total é zero já que não nenhum ainda, ao criar. É só isso: uma abstração da realidade. E cada Cliente[] é um... Cliente. Acho que já imaginava. Assim tem no exemplo 30 clientes e cada cliente tem esses 4 campos... email, nome, telefone e codigo. E como acessar eu te mostrei também. Não acho que precise de outro exemplo da mesma coisa. Como preencher eu também te mostrei. tu fez isso para não precisar mais escrever struct para passar como parametro? ou para declarar? As duas coisas. Assim você define um tipo e não precisa ficar repetindo struct toda hora. Mas também fica livre para mudar a definição do campo sem ter que mexer no resto do programa Exato. porque a realidade é assim: o cadastro tem clientes. Então ao invés de usar um vetor de clientes você passa um cadastro e põe os clientes dentro. E aí pode passar outras coisas, como o total de caras que tem dentro, o máximo que pode ter , o nome da loja, endereço e coisas assim. Pode ter um vetor de cadastros para todas as lojas, por exemplo, e mesmo assim não ter que mexer nas funções nem declarar um monte de variáveis. Isso é algo chamado na literatura de encapsulamento. Desse modo você pode inicializar só algumas variáveis da struct, as que precisa para o teste, e em qualquer ordem. É muito mais prático. Como deve ter visto, com o ponto você define o campo e depois dá o valor. Cliente é assim: typedef struct { int codigo; char nome[31]; int telefone; char email[51]; } Cliente; Então se você só quer preencher o vetor pra testar a função de cadastro sem perder tempo lendo da tela pode só criar isso modelo1 e modelo2 Cliente modelo2 = { 13,"cliente 13" }; //por que aqui está sem o .codigo e .nome Esse é o modo tradicional de inicializar, onde você põe os valores na ordem em que foram declarados na struct. Usando o ponto como antes você pode escrever em qualquer ordem, claro, já está dizendo o nome do campo... Exemplo mais enjoado, e muito mais útil Imagine que você quer criar um cadastro de teste com 3 clientes para testar seu programa. E tem lá a rotina novoCadastro() como antes. Você pode declarar um cadastro com 3 caras e preencher direto: Cadastro teste = { .cl[2] = { 13, "cliente 2", 2, "email" }, // o terceiro cliente .limite = 30, .total = 3, // os campos de controle fora de ordem .cl[1] = { -9813, "cliente um", 2, "email sdslk" }, // o segundo cliente .cl[0] = { .email = "[email protected]", .nome = "Jhonny Cash", .telefone = 912348765, .codigo = 3245 } // o primeiro cliente com os valores fora de ordem }; Você só escreve o que você quer e o compilador se vira. Muito prático e se usa assim há décadas. Não sei porque não ensinam há décadas... Veja o exemplo usando isso: Cadastro teste = { .cl[2] = { 13, "cliente 2", 2, "email" }, // o terceiro cliente .limite = 30, .total = 3, // os campos de controle fora de ordem .cl[1] = { -9813, "cliente um", 2, "email sdslk" }, // o segundo cliente .cl[0] = { .email = "[email protected]", .nome = "Jhonny Cash", .telefone = 912348765, .codigo = 3245 } // o primeiro cliente com os valores fora de ordem }; imprimirLista(&teste); E veja o que mostra: cadastro tem 3 de 30 clientes: 3245 -9813 13 Quer mostrar os detalhes do cadastro? Muda imprimirLista(). Entende como é muito mais produtivo? O exemplo todo adicionado 1 minuto depois Isso eu não entendi. Pode explicar qual o problema?
  17. teste o programa que eu mostrei. E veja essa estrutura que te mostrei: Você não precisa sequer abrir a linha do csv. Apenas leia a linha toda para o vetor e copie o campo do sort para o outro campo do registro. typedef struct { int chave_sort; // o campo para classificar char L[200]; // e a linha } Registro; Só isso. E na hora do sort ao invés de comparar as linhas compare as chaves. E se for para inverter inverta AS LINHAS junto. E via estar tudo classificado. E veja a rotina de bubble sort que eu postei. Tem uma versão animada com umas barrinhas coloridas mas tem uma normal que só classifica um vetor espero que melhorem, você e sua irmã. Cuidado.
  18. Que significa? Mas qual a sua dificuldade afinal? Sobre o programa: O IDE que usa não cria as definições pra você automaticamente? Apenas use parâmetros nas funções. E os valores de retorno. Nunca use void ou funções sem argumentos. É difícil não ser um erro. Exemplos void novoCadastro() Isso é um buraco negro. Como não recebe nada nem retorna nada provavelmente não faz nada também. Ou depende de variáveis globais, o que é outra bobagem: sempre vai dar m#$d@. Imagine que tivesse declarado assim, sem ponteiros nem nada, só um exemplo: typedef struct { int codigo; char nome[31]; int telefone; char email[51]; } Cliente; typedef struct { int limite; int total; Cliente cl[30]; } Cadastro; int main() { Cadastro cad; cad.total = 0; // marca o cadastro como vazio cad.limite = 30; ... Então antes de escrever algo já tem claro que um cadastro tem um certo número de itens. Começa vazio e vai até um limite. Então novo cadastro podia ser int novoCadastro(Cadastro*); E imprimir cadastro? Que tal void imprimirLista(Cadastro*); E talvez pudesse então ler valores para o cadastro e retornar o total ... Entende a diferença? Veja essa função de teste int novoCadastro(Cadastro* cad) { Cliente modelo1 = { .codigo = 12, .nome = "cliente 12" }; Cliente modelo2 = { 13,"cliente 13" }; cad->cl[0] = modelo1; cad->cl[1] = modelo2; cad->cl[2] = modelo2; cad->cl[3] = modelo1; cad->total = 4; cad->limite = 30; return 4; }; São duas maneiras de declarar um cliente para colocar num cadastro e retornar preenchido Veja essa para imprimir void imprimirLista(Cadastro* cad) { printf("cadastro tem %d de %d clientes\n\n", cad->total, cad->limite); for (int i = 0; i < cad->total; i += 1) printf("%d ", cad->cl[i].codigo); return; } Entende como é mais simples? Veja a saída cadastro tem 4 de 30 clientes 12 13 13 12 Desse programa copiado do seu em minutos #include <stdio.h> typedef struct { int codigo; char nome[31]; int telefone; char email[51]; } Cliente; typedef struct { int limite; int total; Cliente cl[30]; } Cadastro; void imprimirLista(Cadastro*); int novoCadastro(Cadastro*); int main() { Cadastro cad; novoCadastro(&cad); imprimirLista(&cad); return 0; }; void imprimirLista(Cadastro* cad) { printf("cadastro tem %d de %d clientes\n\n", cad->total, cad->limite); for (int i = 0; i < cad->total; i += 1) printf("%d ", cad->cl[i].codigo); return; } int novoCadastro(Cadastro* cad) { Cliente modelo1 = { .codigo = 12, .nome = "cliente 12" }; Cliente modelo2 = { 13,"cliente 13" }; cad->cl[0] = modelo1; cad->cl[1] = modelo2; cad->cl[2] = modelo2; cad->cl[3] = modelo1; cad->total = 4; cad->limite = 30; return 4; }; Escreva assim em torno dos dados. É mais simples e seguro. Use argumentos. Retorne valores. Não use globais. Não escreva menus antes de testar a lógica. Use constantes e teste tudo antes.
  19. Porque não ajuda os outros a ajudar você e posta umas 3 ou 4 linhas do csv apenas? E explica um pouco da sua dificuldade. E veja talvez o que foi dito aqui E esses aqui tem referência a soluções que eu postei sobre isso Qual a sua dificuldade em particular? Esse código base não é muito bom. E pouco útil.
  20. Sabe que podia postar apenas umas 3 ou 4 linhas do csv, certo? Ao menos não postou um link como os seus colegas. Você viu os outros vários tópicos sobre isso aqui? de ontem, hoje e da semana toda? Eu postei um programa que pode ajudar e algumas notas que tem a ver com seu programa. Uma coisa que posso repetir já: porque está se preocupando com a estrutura dos campos e usando strtok() para ler um cada um? Não é uma boa ideia e parece que todos vocês tiveram a mesma. csv é uma tabela MxN onde M é o número de registros e N o número de campos em cada registro. E o nome dos campos aqui é irrelevante, de modo que pode dispensar a primeira linha. E o número de cammpos também. Veja essa estrutura: typedef struct { int chave_sort; // o campo para classificar char L[200]; // e a linha } Registro; typedef struct { int N; Registro R[300]; } CSV; CSV tabela; Entende como pode ser muito mais simples? Você só precisa ler as linhas para a tabela e depois classificar pelo número que está no campo chave_sort. Bem mais simples. Eu postei um programa que faz isso. E tempos atrás postei um programa nesse mesmo forum com umas implementações de Bubble Sort, algumas com animações e outras sem interface, exatamente como precis aqui. Pode só pegar a que usa o vetor e estará ok. Juntando os dois dá mais do que você precisa....
  21. Sim. É até engraçado. chamar system já é meio ingênuo. Mas chamar system() para criar um shell para rodar um script .bat eu nunca tinha visto. Não pode simplesmente executar o que tem no .BAT no programa em C ou C++? Entendeu o que te falei sobre as alternativas? Como criar um task associado a um evento? Ou usar CreateProcess()?
  22. arfneto

    C IF, Else com resposta

    Apenas use uma função para cada nível de menu e retorne a opção. A linguagem faz o resto: retornar
  23. Parece um longo caminho para executar um batch file. Não pode programar direto em C++ o que tem lá? Chamar system() para fazer algo, e usando C ou C++, é algo estranho: não está de fato fazendo nada. Apenas chamando o interpretador de comandos do sistema para executar uma linha de comando. E no seu caso é para executar uma linha de comando que chama uma linha de comando para abrir um arquivo de comandos... E está fazendo isso em um programa na linguagem que foi usada para escrever o próprio sistema... Não pode usar CreateProcess() e rodar isso? Não pode incorporar a funcionalidade do batch em seu programa? Uma opção seria talvez também criar uma tarefa com o agendador de tarefas e de seu programa pedir pra executar pelo nome dela?
  24. Esse é o link de ontem. E tem referência a outros dois. E a um programa de teste completo.
  25. Olá Há vários tópicos sobre esse mesmo problema nesse mesmo forum. Veja o tópico de ontem que tem links para uma solução que postei. E alguns comentários que se aplicam também ao seu programa Sobre seu programa Porque postou um link para uma planilha que tem os dados? E porque importou como texto? Talvez não tenha entendido o propósito de um arquivo csv... De todo modo seria melhor para quem quer te ajudar se você tivesse postado algumas linhas do arquivo direto aqui, certo? Assim não seria preciso eu abrir um link pra abrir uma planilha onde o arquivo csv sequer foi importado... Veja a diferença: TERRA INDНGENA;ETNIA;UF;MUNICНPIO;SUPERFНCIE(ha);FASE DO PROCEDIMENTO;MODALIDADE Acapuri de Cima;Kokama;AM;Fonte Boa;19.885,04;Declarada;Tradicionalmente ocupada Acimг;Apurinг;AM;Lбbrea;40.686,03;Regularizada;Tradicionalmente ocupada Aconг;Tingui-Botу;AL;Traipu;267,7862;Encaminhada RI;Reserva Indнgena Бgua Preta/Inari;Apurinг;AM;Pauini;139.763,67;Regularizada;Tradicionalmente ocupada Бguas Belas;Pataxу;BA;Prado;1.189,06;Regularizada;Tradicionalmente ocupada Бguas Claras;Guarani Mbya;SC;Major Gercino;165,4162;Regularizada;Reserva Indнgena Veja como funciona isso num programa na prática Em EXCEL No Google Planilhas Esse é o propósito de um arquivo csv: um formato de intercâmbio. Você não abre a planilha com o csv perdido lá dentro. Você cria uma planilha a partir dos dados. Com um comando só. Ou importa para o banco de dados. Qualquer um. Ou imprime etiquetas com seu programa de mala direta a partir do csv É para isso. De volta ao seu programa Pois é: não precisa mesmo verificar todas as opções. Mas não precisa verificar nenhuma. Você pode apenas ler as linhas para a memória. Você já sabe o que quer fazer. Pra que ler os campos? Não vai classificar pelo primeiro campo como todos os outros tópicos aqui? Ou por um campo fixo? Algo simples assim já serviria: typedef struct { char C[30]; // o campo para classificar char L[200]; // e a linha } Registro; typedef struct { int N; Registro R[300]; } CSV; CSV tabela; E use insertion sort enquanto lê... Assim ao final o arquivo estará classificado. E o que houve com a função Ler_arquivo? Sobre esse trecho... while (fgets(buf, 1024, file)) { field_count = 0; row++; if (row == 1) { continue; } Não acha esquisito demais? Depois do primeiro registro nunca mais vai ler o primeiro registro, mas vai testar toda vez... Não podia ter ao menos escrito fgets(buf, 1024, file); // a linha dos headers while (fgets(buf, 1024, file)) { field_count = 0; row++; // ... } ?

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!