Ir ao conteúdo
  • Cadastre-se

isrnick

Membro Pleno
  • Posts

    1.548
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. Por causa do modo como você fez seu programa isso é uma pergunta sobre linux não de linguagem C. Você está usando a função system() para executar o programa cat do linux para concatenar os arquivos, mas para pular linha você poderia mudar para o programa tail com parâmetro -qn +2 para pular para a segunda linha de cada arquivo. Por exemplo: tail -qn +2 arquivo1.csv aquivo2.csv arquivo3.csv > saida.csv Vai concatenar os 3 arquivos na saída sempre começando a partir da segunda linha. https://superuser.com/questions/62970/unix-cat-starting-from-line Note que isto faria com que não tenha nenhum cabeçalho na saída, nem mesmo o primeiro cabeçalho. Então se fizer assim terá que fazer algo a mais se quiser colocar o cabeçalho no começo do arquivo.
  2. Mude essa linha: copia[i] = entrada[j]; Para: copia[j] = entrada[i]; Assim só vai copiar a letra da entrada que já está minúscula.
  3. Já fez impressão de matrizes? Seria como imprimir apenas a metade triangular inferior de uma matriz. Pense em cada degrau da escada como uma linha, e cada letra do nome como uma coluna. O primeiro for é responsável por contar as linhas apenas (logo, nele é impresso o caractere nova linha '\n'), e o segundo for é responsável por contar as colunas de cada linha (logo, nele são impressas as letras do nome). O nome tem tam letras então haverão tam linhas, e o número de colunas impressas em cada linha é igual ao número da linha (= índice da linha + 1) atual.
  4. Sim, no meu código estou assumindo que o arq_ent não foi fechado com fclose(), aí uso rewind para voltar ao início do arquivo e aí é só ler dês do início com fgets() novamente. Talvez você também deva adicionar esse alltrim() e Converte() ao meu código para processar o texto do registro...
  5. Seria algo assim depois do "system(comandoJuntarArqs);" : rewind(arq_ent); while (fgets(registro, 400, arq_ent) != NULL) //Ler todos os arquivos de dentro do arquivo que o programa criou. { strcpy(registroAux, "/caminho/da/pasta/de/backup/"); strcat(registroAux, registro); rename(registro, registroAux); } Assumindo que eu esteja entendendo corretamente o seu código e a organização dos arquivos.
  6. Isso é só parte do código certo? Você usou fclose() para fechar o "arquivo" aberto com fopen() em algum lugar do código? Se ainda estiver aberto depois do "system(comandoJuntarArqs);" daria para colocar um "rewind(arquivo);" para retornar ao início do arquivo e então fazer outro loop com fgets() para ler os nomes dos arquivos novamente, e usá-los no rename(). Como exatamente estão as pastas do programa, dos arquivos, dos arquivos combinados, dos arquivos já processados e movidos? Especificamente quais são os endereços delas? Pergunto pois ls -R é recursivo, e isso pode ser um problema se estiverem em subpastas da pasta com os arquivos .csv . Porque escolheu usar -R?
  7. Primeiro, o arquivo unificado já deveria ser gerado dentro da pasta final, então pode colocar o nome da subpasta já no strftime: strftime(vetordechar, comprimentodovetor, " > PastaComOArquivoUnificado/ArqsJuntos_Data%F_Hora%Hh%Mm%Ss.csv", localtime(&agora)); Obs: A pasta já deve existir, ele não vai criar a pasta. Mas a parte de mover cada arquivo depende de ter todos os nomes dos arquivos, e fazer um ciclo usar rename() para mover cada um. Como você está pegando os nomes dos arquivos? Eles seguem um padrão? Está usando dirent.h?
  8. O jeito mais simples de mover um arquivo na mesma unidade de armazenamento é usar a função rename() para "renomear o arquivo para uma outra pasta". Tipo: rename("arquivo.txt", "subpasta/arquivo.txt"); Nessa caso move para uma subpasta da pasta atual, mas poderia usar caminhos relativos (ex: "../pastaparalela/arquivo.txt"), ou caminhos completos/absolutos (ex: "C:/caminho/da/pasta/arquivo.txt"). Mas isso só funciona na mesma unidade, se for mover para outra unidade tem que usar outros métodos.
  9. Simplesmente não deveria ter o segundo for... #include <stdio.h> #include <stdlib.h> int main() { int i,fat=1,j,num; printf("Ate que numero deseja saber o fatorial?:"); scanf("%d%*c",&num); for(i=1;i<=num;i++){ //for(j=1;j<=i;j++) // fat*=j; fat*=i; printf("Fatorial de %d é=%d\n",i,fat); } return 0; } O problema é que ele estava multiplicando o fatorial anterior por todos os números novamente.
  10. isrnick

    C++ alguem pode me ajudar

    O problema está na declaração das variáveis, você as declarou como 1 único char, ou seja só dá pra armazenar 1 caractere em cada variável, então quando você digita um texto cada cin do seu código vai lendo 1 caractere e guardando em uma respectiva variável, então seu código todo é executado até o fim. Você poderia declarar vetores de caracteres como "char result[100]" nesse caso podendo armazenar até 100 caracteres. Mas o melhor seria declará-las como objetos da classe string: string result, nome, estado, cidade, estado_nasceu, nome_login, senha, senha_login; Que pode armazenar quantidades aleatórias de caracteres.
  11. isrnick

    C data e hora no Arquivo

    Primeiro, coloque a declaração das variáveis no começo junto com as outras declarações de variáveis: char nomeArquivo[100]; size_t comprimentoVetor = 100; time_t agora; (Também não se esqueça de incluir as bibliotecas necessárias: time.h e stdlib.h .) E para ficar claro, era para tirar o printf do meu código, e substituir o vetor nomeArquivo no strcat do seu programa para concatenar o nome do arquivo com data, no comandoJuntarArqs: agora = time(NULL); strftime(nomeArquivo, comprimentoVetor, " > ArqsJuntosData%FHora%Hh%Mm%Ss.csv", localtime(&agora)); strcat(comandoJuntarArqs, nomeArquivo);
  12. isrnick

    C data e hora no Arquivo

    @DanyloKesley Isso é um problema que tem acontecido quando copia um código aqui do fórum, as vezes um caractere não reconhecido é adicionado ao texto do código quando você copia e cola no editor, aí dá esse tipo de erro quando tenta compilar, é necessário encontrar e apagar o caractere anômalo nas linhas indicadas para corrigir isso. Aqui, postei o código nesse site tente copiar de lá e ver se evita esse problema: https://onlinegdb.com/rJC9be8fS
  13. isrnick

    C data e hora no Arquivo

    Não foi isso que eu já fiz isso no post anterior?? Bastaria usar o vetor com a string gerada no strcat, ao invés de imprimir com printf como fiz no meu programa.
  14. isrnick

    C data e hora no Arquivo

    Os caracteres / e : não podem ser usado em nomes de arquivos. Então teria que ser um nome assim: ArqsJuntosData23-07-2019Hora16h00m00s.csv Mas seria melhor assim: ArqsJuntosData2019-07-23Hora16h00m00s.csv Com ano no começo e dia no fim, para que a ordem alfabética seja igual a ordem cronológica. Note que adicionei segundos, pois do contrário se houverem 2 arquivos gerados no mesmo minuto um vai sobrepor o outro, mas 1 segundo ainda é um tempo muito longo para o computador, e se o seu programa gerar vários arquivos rapidamente em sequência pode ser necessário também adicionar frações de segundos ao nome. E a função strftime serve para gerar strings formatadas com data e hora: https://en.cppreference.com/w/c/chrono/strftime No caso usaria com especificadores %F para a data inteira no formato 2019-07-23, e %H para hora, %M para minutos, e %S para segundos. #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { char vetordechar[100]; size_t comprimentodovetor = 100; time_t agora = time(NULL); strftime(vetordechar, comprimentodovetor, " > ArqsJuntosData%FHora%Hh%Mm%Ss.csv", localtime(&agora)); printf("%s\n", vetordechar); return 0; }
  15. Dá pra fazer todas as somas percorrendo a matriz uma única vez: for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ sLinha[i] += matriz[i][j]; //Soma da linha i sColuna[j] += matriz[i][j]; //Soma da coluna j if (i == j){ //Se for da diagonal principal: sDiag1 += matriz[i][j]; //Soma da diagonal principal } if (i + j == N-1) { //Se for da diagonal secundaria: sDiag2 += matriz[i][j]; //Soma da diagonal secundaria } } } Aí é só comparar os resultados.
  16. Além do i = RU, o x += 1 entre o while e o segundo for também não deveria estar aí, pois ao contrário do primeiro for está usando x++ dentro do while ao invés de x = i, então já foi incrementado +1 e não precisa desse x += 1. Fora isso também é preciso colocar o '\0' no fim da str3. E também removendo os & dos 2 primeiros scanfs o código fica assim: #include <stdio.h> #include <stdlib.h> int main() { char str1[100], str2[100], str3[100]; int RU, i, x; printf("Digite seu primeiro nome: "); //salva o primeiro nome scanf("%s", str1); //Não vai & printf("Digite seu segundo nome: "); // salva o segundo nome scanf("%s", str2); //Não vai & printf("Digite uma posicao: "); //salva a posicao para concatenar scanf("%d", &RU); // salva a parte concatenada de str1 em str3 x = 0; for (i = 0; i < RU; i++) { str3[i] = str1[i]; x = i; } // concatena str2 com str3 x += 1; i = 0; while (str2[i] != '\0') { str3[x] = str2[i]; x++; i++; } // deveria concatenar o restante de str1 par str3 //x += 1; for (i = RU; str1[i] != '\0'; i++) { //i = RU str3[x] = str1[i]; x++; } str3[x] = '\0'; //Coloca o caractere nulo no fim printf("%s\n", str3); // resultado printf("%d\n", x); // mostra o indice x printf("%d\n", i); // mostra o indice i system("pause"); return 0; }
  17. No último for i deve começar igual a RU não RU+1. E não vai & antes de str1 e str2 nos dos primeiros scanfs.
  18. Eu apontei que a única coisa que precisa modificar para funcionar são as dimensões da matriz e dos vetores, colocando números fixos nas dimensões, e só precisam ser grandes o suficiente, por exemplo matriz e vetores comprimento 100 em cada dimensão já seria mais do que grande o suficiente pois é improvável que você vá testar matrizes tão grandes ou maiores que isso, principalmente considerando que é um programa de começo de curso e não é esperado que seu programa considere todas as possibilidades imagináveis. Já tem um código pronto em mãos, se não conseguiu resolver com essa informação então o problema é outro, e você ainda não entendeu algum dos conceitos fundamentais do C, nesse caso seria melhor você postar sua tentativa (idealmente em um novo tópico seu) para podermos te ajudar, afinal o objetivo desse fórum é auxiliar no seu aprendizado tirando dúvidas e/ou corrigindo seu código, e não podemos dar soluções prontas.
  19. Alocação dinâmica faz sentido apenas quando deseja-se guardar muitos dados na memória, ou quando a quantidade de dados é indeterminada podendo ser arbitrariamente grande. Este programa usa apenas 1 variável da struct para fazer qualquer coisa, ou seja apenas dados sobre 1 filme está na memória da struct a qualquer momento, nunca lê e armazena em um vetor de structs o arquivo de filmes inteiro, o programa apenas pega do arquivo os dados de 1 filme por vez e realiza as operações necessárias (impressão, alteração, comparação, etc). Então pela lógica usada no programa não é necessário alocar memória dinamicamente, e não faz sentido fazê-lo. Mudar a lógica para trabalhar com todos os dados dos filmes na memória em um vetor de struct alocado dinamicamente, ao invés de lendo 1 por 1 do arquivo toda vez, basicamente requer mudar a lógica do código inteiro, o que seria quase o mesmo que fazer o programa do zero... Mas fazer programas para outros os usuários não é a proposta desse fórum, podemos apenas te ajudar tirando dúvidas ou fazendo correções no seu código. Notei também que esse código na verdade é basicamente este código antigo de 2013 modificado: E não consta a autoria original no seu código.
  20. O que você quer alocar dinamicamente? Leia minha assinatura abaixo para ver como postar código no fórum e manter a formatação do código.
  21. É o típico problema de ficar sobrando um '\n' após o scanf anterior ao scanf onde o usuário digita o nome, e aí ele o scanf lê esse caractere como a entrada digitada, ao invés de esperar que o usuário digite algo novo... Então uma solução parcial seria colocar um espaço antes do especificador %[ da string de especificadores do scanf: scanf(" %49[^\n]", id.name); Assim serão descartados todos os espaços vazios (espaço em branco ' ', nova linha '\n', tabulação '\t', etc) antes de ler uma nova entrada. Note que também mudei para 49 o limitador de caracteres, pois como o vetor name tem 50 posições então só é possível guardar no máximo 49 caracteres não nulos, pois nesse caso extremo a última posição deverá guardar o caractere nulo '\0'. Uma solução mais completa seria colocar uma função como essa no código: void limpastdin(){ int ch; while((ch = getchar()) != '\n' && ch != EOF); } E chamar a função após cada scanf para limpar quaisquer caracteres que ficarem sobrando na entrada padrão. scanf("%i", &employerquant); limpastdin();
  22. O MinGW/GCC permite o uso de arranjos/vetores de dimensão variável no código C++, funcionando como uma extensão a norma. Se quiser fazer código 100% conforme a norma ISO para maximizar a portabilidade para outro compilador que seja conformante com a norma, pode usar a flag de compilação -Wpedantic (ou -pedantic) para gerar Warnings/Avisos de não-conformidade com a norma, ou então usar -pedantic-errors para que identifique as não-conformidades como erros, impedindo que compile o código. (Use em combinação com -std=c++11, -std=c++14, -std=c++17, -std=c++2a, ou etc, para indicar a norma a ser respeitada.) Fazendo isso os arranjos/vetores de dimensão variáveis (VLA) serão identificados corretamente como algo anômalo a norma do C++ no GCC.
  23. O compilador provavelmente reclamou desta linha: int matriz[lin][col], somalin[col], somacol[lin],somadiag1=0, somadiag2=0; Pois usa matriz/vetores de comprimento variável, ou seja, os comprimentos das dimensões da matriz/vetor são definidos por variáveis, ao invés de serem valores fixos. O compilador MSVC do Visual Studio só tem conformidade com a versão C89/C90 (de 1989/1990) da linguagem C, e não conforma as versões mais recentes da linguagem, entretanto vetores de comprimento variável foram adicionados na versão C99 da linguagem C. (O C++ foi criado baseando-se na versão C89/C90 da linguagem C, e não possui vetores de comprimento variável, existem outros recursos próprios do C++ para fazer algo similar.) A Microsoft não tem interesse em implementar as versões mais recentes da linguagem C, pois o interesse deles para o Visual Studio é o C++ (a parte do compilador C basicamente está lá mais para disponibilizar os recursos do C que também fazem parte do C++). Então você tem algumas opções... Você poderia por exemplo colocar valores fixos nas dimensões dessa matriz e vetores para conseguir compilar no MSVC, desde que sejam grandes o suficiente o programa funcionará corretamente. Ou então, precisará usar outro compilador que tenha conformidade com versões mais recentes da linguagem como o MinGW/GCC ou Clang, que é a única opção se quiser programar usando recursos atuais da linguagem C.
  24. O nome do aluno não é um número com ponto flutuante. E precisa rever a condições dos ifs no fim do programa, vai entrar em mais de 1 if imprimindo mais de uma mensagem, e sempre imprimirá que o aluno foi reprovado. E em C o operador de comparação de igualdade é == (o operador = é o operador de atribuição).

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!