Ir ao conteúdo
  • Cadastre-se

Vitor Avancini

Membro Pleno
  • Posts

    23
  • Cadastrado em

  • Última visita

Tudo que Vitor Avancini postou

  1. Tenho uma variável static "fieldOrder" que seleciona a ordem dos campos no registro, exemplo: name, cpf, phone, course, age, active ou poderia ser cpf, age, name, course, phone, active, o usuário do sistema vai decidir isso. Gostaria de armazená-lo em um buffer, com um caractere especial separando cada campo, para então guardar em um arquivo(mas guardar no arquivo não vem ao caso agora). O problema aqui é que entra nos cases corretamente (testei isso), porém o buffer não está recebendo gets. Não sei o porque acontece isso ou como fazer isso funcionar. Alguma ideia? Fiz algo errado? Aqui vai o método: public String registroOrdemCampo(Student std) { String buffer = null; for (int i = 0; i < 6; i++) { /*name = 1 -- cpf = 2 -- phone = 3 -- course = 4 -- age = 5 -- active = 6*/ switch (Descriptor.fieldOrder[i]) { case 1: buffer = std.getName(); break; case 2: buffer = std.getCpf(); break; case 3: buffer = std.getPhone(); break; case 4: buffer = std.getCourse(); break; case 5: buffer = Integer.toString(std.getAge()); break; case 6: buffer = Integer.toString(std.getActive()); break; default: System.out.println("ERRO!"); } if(i < 6) buffer = Descriptor.fieldSeparator; } return buffer; }
  2. Boa noite, galera! Preciso fazer um programa que lê e escreve objetos em um arquivo (.txt), no qual existe um arquivo .ini que define algumas parametrizações para o software. Uma dessas configurações é em qual ordem os campos serão salvos no arquivo (FieldOrder: ordem dos atributos no arquivo: name / cpf / phone / course / age / active). Tenho um método chamado "generate" que cria um objeto, solicita as entradas ao usuário e grava no arquivo. A dúvida aqui é, como eu faço para colocar na ordem definida por esse .ini O .ini é lido e cada configuração é uma variável public class Descriptor { public static final char registerType = 'a'; public static final String fieldSeparator = "a"; public static final String fieldOrder = "name/cpf/phone/course/age/active"; public static final String registerSeparator = "a"; public static final int blockSize = 0; public static final char blockingType = 'a'; public static final char blockingMethod = 'a'; public static final String blockingPath = "a"; public static final int maxNumberOfRecordsInMemory = 0; } Inicializei dessa forma, para depois fazer a leitura do arquivo e setar cada variável. Eu poderia trocar os campos de lugares para seguir qualquer ordem para armazenar no txt. Como eu poderia fazer um método que conseguiria ler o fieldOrder e assim armazenar o objeto em um buffer (uma variavel do tipo string) com a ordem escolhida e assim guardar no arquivo?
  3. Ah sim, me desculpe. Não sabia que colchetes era operador
  4. eu tentei inicializar a matriz colocando 0 em todas as posições, não foi isso que aconteceu?
  5. Quando a função Imprimir é chamada o programa simplesmente fecha
  6. O que está dando problema agora é a função para imprimir o tabuleiro
  7. Código completo: main.c: #include<stdio.h> #include "cabecalho.h" void main () { int i, j, ri, rj; int teste = 1; int **tabuleiro; int **matrizAdj; int n, qtdRainhas = 0; int p1, p2, op; int verifica; printf("Insira o tamanho do tabuleiro e a quantidade de rainhas (N): "); scanf("%i", &n); construirMatriz(tabuleiro, n); printf("\nConstruiu tabuleiro\n"); printf ("\nInsira o metodo de insercao: "); printf("\n1 - Manual"); printf("\n2 - XGH"); printf("\n3 - Heurística"); printf("\n"); scanf ("%i", &op); switch (op) { case 1: while (qtdRainhas < n) { printf("\nInsira a linha: "); scanf("%i", &ri); printf("\nInsira a coluna: "); scanf("%i", &rj); verifica = verificaConflitos(ri-1, rj-1, tabuleiro, n); printf("verificou"); if (verifica == 0) { printf("\nentrou if\n"); tabuleiro[ri][rj] = 1; printf("Inseriu rainha %i" , i); qtdRainhas++; } else printf("\nPosicao invalida, insira novamente!"); } printf("\n"); Imprimir(tabuleiro, n); break; case 2: while(qtdRainhas < n) { for (i = 0; i < n; i++) { for(j = 0; j < n; j++) { if (!verificaConflitos(i-1, j-1, tabuleiro, n)) { tabuleiro [i] [j] = 1; printf("\nInseriu rainha"); qtdRainhas++; } } } } printf("\n"); Imprimir(tabuleiro, n); break; case 3: while (qtdRainhas < n) { if (testaLinha(tabuleiro, i-1, j-1, n)) { if (testaColuna(tabuleiro, i-1, j-1, n)) { if (!verificaConflitos(i-1, j-1, tabuleiro, n)) { tabuleiro[i] [j] = 1; qtdRainhas++; printf("Inseriu rainha "); } } else j++; } else i++; } printf("\n"); Imprimir(tabuleiro, n); break; default: printf("\nOpcao invalida!"); } LiberarMatriz(n, tabuleiro); } cabecalho.h #ifndef CABECALHO_H_INCLUDED #define CABECALHO_H_INCLUDED #include "funcoes.c" /**Imprime todas as posições do tabuleiro*/ void Imprimir(int **tabuleiro, int n); /**VERIFICA SE É POSSÍVEL POSICIONAR A RAINHA EM matriz(ri, rj). RETORNA 1 SE NÃO É POSSÍVEL E 0 SE FOR POSSÍVEL*/ int verificaConflitos (int ri, int rj, int **tabuleiro, int n); /**ALOCA A MATRIZ DINAMICAMENTE DE TAMANHO N*N*/ void construirMatriz(int **tabuleiro, int n); /*TESTAR SE EXISTE RAINHA NA LINHA RETORNA 1 SE NÃO EXISTE RAINHA NA LINHA*/ int testaLinha(int **tabuleiro, int ri, int rj, int n); /*TESTA SE EXISTE RAINHA NA COLUNA RETORNA 1 SE NÃO EXISTE RAINHA NA LINHA COLUNA*/ int testaColuna(int **tabuleiro, int ri, int rj, int n); /*LIBERA A MEMÓRIA*/ void LiberarMatriz(int n, int **matriz); #endif // CABECALHO_H_INCLUDED funcoes.c #include<stdio.h> #include <stdlib.h> #include "cabecalho.h" void construirMatriz(int **tabuleiro, int n) { int i, j; tabuleiro = (int**) malloc (n * sizeof(int*)); for (i = 0; i < n; i++) tabuleiro[i] = (int *) malloc (n * sizeof(int)); for (i = 0; i < n; i++) for (j = 0; j < n; j++) tabuleiro[i] [j] = 0; } int testaLinha(int **tabuleiro, int ri, int rj, int n) { int i, teste; /**TESTA SE EXISTE ALGUMA RAINHA NA MESMA LINHA*/ for (i = 0; i < n; i++) { if (tabuleiro[ri][i] == 1) return 0;//EXISTE RAINHA NA LINHA(POSIÇÃO INVÁLIDA) } return 1;//NÃO EXISTE RAINHA NA LINHA(POSIÇÃO VÁLIDA) } int testaColuna(int **tabuleiro, int ri, int rj, int n) { int i, teste; /**TESTA SE EXISTE ALGUMA RAINHA NA COLUNA*/ for (i = 0; i < n; i++) { if (tabuleiro[i][rj] == 1) return 0;//EXISTE RAINHA NA COLUNA(POSIÇÃO INVÁLIDA) } return 1;//NÃO EXISTE RAINHA NA COLUNA(POSIÇÃO VÁLIDA) } int verificaConflitos (int ri, int rj, int **tabuleiro, int n) { int i, i1, i2, j, j1, j2; int teste = 0; i1 = ri; i2 = ri; j1 = rj; j2 = rj; printf("\nentrou verificaConflito"); /**TESTA SE EXISTE ALGUMA NA MESMA LINHA OU COLUNA*/ for (i = 0; i < n; i++) { printf("\nentrou for"); if (tabuleiro[ri][i] == 1 || tabuleiro[i][rj] == 1) { teste = 1; printf("\nentrou if"); break; } printf("\nsaiu for"); } printf("\ntestou linha e coluna"); if (teste == 0) { /**ACHA INICIO DA DIAGONAL PRINCIPAL*/ while (i1 > 0 && j1 > 0) { i1--; j1--; } /**ACHA INICIO DA DIAGONAL SECUNDÁRIA*/ while (i2 > 0 && j2 < (n-1)) { i2--; j2++; } /**TESTE DIAGONAL PRINCIPAL*/ for (i = i1; i < ((n-1) - i1); i++, j1++)/**LINHA E COLUNA*/ { if (i != ri && j1 != rj && tabuleiro[i][j1] == 1) { teste = 1; break; } } printf("\ntestou diagonal primaria"); /**TESTE DIAGONAL SECUNDARIA*/ for (i = i2; i < ((n-1) - i2); i++, j2--)/**LINHA E COLUNA*/ { if (i != ri && j2 != rj && tabuleiro[i][j2] == 1) { teste = 1; break; } } printf("\ntestou diagonal secundaria"); } return teste; } void Imprimir(int **tabuleiro, int n) { int i, j; printf("\n"); for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) printf("%i ", tabuleiro[i][j]); printf("\n"); } } void LiberarMatriz(int n, int **matriz) { int i; if (matriz == NULL) return; for (i = 0; i < n; i++) free (matriz[i]);/* LIBERA AS LINHAS DA MATRIZ*/ free (matriz);/* LIBERA A MATRIZ */ }
  8. Quando chega na parte que comentei que da erro, o programa fecha. Gostaria de entender o erro e saber qual a maneira correta. adicionado 2 minutos depois A execução do programa fica assim:
  9. Como comparar uma determinada posição de uma matriz através de colchetes sendo que passei como ponteiro de ponteiro (int **matriz) Main: while (qtdRainhas < n) { printf("\nInsira a linha: "); scanf("%i", &ri); printf("\nInsira a coluna: "); scanf("%i", &rj); verifica = verificaConflitos(ri-1, rj-1, tabuleiro, n); printf("verificou"); if (verifica == 0) { printf("\nentrou if\n"); tabuleiro[ri][rj] = 1; printf("Inseriu rainha %i" , i); qtdRainhas++; } else printf("\nPosicao invalida, insira novamente!"); } printf("\n"); Imprimir(tabuleiro, n); .h /**Imprime todas as posições do tabuleiro*/ void Imprimir(int **tabuleiro, int n); /**VERIFICA SE É POSSÍVEL POSICIONAR A RAINHA EM matriz(ri, rj). RETORNA 1 SE NÃO É POSSÍVEL E 0 SE FOR POSSÍVEL*/ int verificaConflitos (int ri, int rj, int **tabuleiro , int n); funcoes.c int verificaConflitos (int ri, int rj, int **tabuleiro, int n) { int i, i1, i2, j, j1, j2; int teste = 0; i1 = ri; i2 = ri; j1 = rj; j2 = rj; printf("\nentrou verificaConflito"); /**TESTA SE EXISTE ALGUMA NA MESMA LINHA OU COLUNA*/ for (i = 0; i < n; i++) { printf("\nentrou for"); if (tabuleiro[ri][i] == 1 || tabuleiro[i][rj] == 1)//o erro acontece aqui! { teste = 1; printf("\nentrou if"); break; } printf("\nsaiu for"); }
  10. Meu programa tá ficando com cara de gambiarra kkkkkkkkkkk mas valeu pela ajuda!
  11. Mas eu preciso reservar essas 10 posições uma única vez, porém o método "writeEA" será chamado a cada nova inserção.
  12. Então, @vangodp, o meu problema determina que eu comece a escrever no arquivo a partir da décima posição, ou seja, não posso utilizar as 10 primeiras posição. Caso você esteja curioso para saber o porque devo não utilizar as 10 primeiras posições a resposta é que nesse local não utilizado eu irei preencher com outras informações, por exemplo o tamanho total do arquivo, o "endereço" para um registro excluído etc. Bom, acredito que deu pra entender o que quis dizer. Há alguma forma de escrever no arquivo pulando as 10 primeiras posições?
  13. O que eu me pergunto é: por que o seekp não funciona? arq.seekp(9, ios::beg) isso deveria ser responsável por mexer com os ponteiros do arquivo, ou estou errado?
  14. Boa tarde @danieltm64 , fiz essa modificação, porém não ocorre o esperado e a escrita ocorre a partir da primeira posição. desde já agradeço
  15. Eu tenho essa estrutura: class EstagioAluno { private: int matricula; char nomeCompleto [50]; char tipoEstagio[13]; char nomeEmpresa[20]; char cnpj[20]; char nomeSupervisor[50]; char dataInicio[11]; char dataFim[11]; char dataEntregaRelatorioParcial[11]; char situacao[11]; int horasPrevistas; int horasTotalizadas; char parecerFinal[401]; public: //declaração dos métodos }; e preencho ela desta forma: void EstagioAluno::PreencherEA() { cout << "Matricula: "; cin >> matricula; cout << "Nome Completo: "; cin.ignore(); cin.getline(nomeCompleto, 50); cout << "Tipo de Estagio: "; /*cin.ignore();*/ cin.getline(tipoEstagio, 13); cout << "Nome da Empresa: "; /*cin.ignore();*/ cin.getline(nomeEmpresa, 20); cout << "CNPJ: "; /*cin.ignore();*/ cin.getline(cnpj, 20); cout << "Nome do supervisor do estagio: "; /*cin.ignore();*/ cin.getline(nomeSupervisor, 50); cout << "Data de inicio: "; /*cin.ignore();*/ cin.getline(dataInicio, 11); cout << "Data Final: "; /*cin.ignore();*/ cin.getline(dataFim, 11); cout << "Data de entrega do relatorio parcial: "; /*cin.ignore();*/ cin.getline(dataEntregaRelatorioParcial, 11); cout << "Situacao do estagio: "; /*cin.ignore();*/ cin.getline(situacao, 11); cout << "Quantidade de horas previstas: "; /*cin.ignore();*/ cin >> horasPrevistas; cout << "Quantidade de horas totalizadas: "; /*cin.ignore();*/ cin >> horasTotalizadas; cout << "Parecer final do coordenador de estagio: "; cin.ignore(); cin.getline(parecerFinal, 401); } primeiro passo para o arquivo uma variável short que indica o tamanho do registro (registro é o conjunto de atributos que pertencem a um mesmo objeto) e logo após junto em um buffer todos os atributos com "|" separando cada campo, desta forma: void EstagioAluno::writeEA (ofstream &arq) { char buffer [1000]; char aux [20]; short length; itoa(matricula, buffer, 10); strcat(buffer, "|"); strcat(buffer, nomeCompleto); strcat(buffer, "|"); strcat(buffer, tipoEstagio); strcat(buffer, "|"); strcat(buffer, nomeEmpresa); strcat(buffer, "|"); strcat(buffer, cnpj); strcat(buffer, "|"); strcat(buffer, nomeSupervisor); strcat(buffer, "|"); strcat(buffer, dataInicio); strcat(buffer, "|"); strcat(buffer, dataFim); strcat(buffer, "|"); strcat(buffer, dataEntregaRelatorioParcial); strcat(buffer, "|"); strcat(buffer, situacao); strcat(buffer, "|"); itoa(horasPrevistas, aux, 10);//converte int em char na base 10 e passa para aux strcat(buffer, aux); strcat(buffer, "|"); itoa(horasTotalizadas, aux, 10);//converte int em char na base 10 e passa para aux strcat(buffer, aux); strcat(buffer, "|"); strcat(buffer, parecerFinal); strcat(buffer, "|"); length = (short) strlen(buffer); arq.seekp(9, ios::end);//reserva os 10 primeiros bytes para o cabeçalho cout << arq.tellp() << endl; cout << buffer << endl; //campo flag de excluido (avail list) arq.write((char*)&length, sizeof(length)); arq.write(buffer, length); cout << arq.tellp() << endl; } Gostaria de escrever o primeiro registro na decima posição do arquivo e não na primeira, por isso o seekp. Porém no atual momento a escrita ocorre na primeira posição
  16. O problema é o seguinte, eu preciso de reservar as 10 primeiras posições do arquivo para usar posteriormente como o cabeçalho do arquivo, então gostaria de pular as 10 primeiras posições e escrever a partir da décima, agora deu pra entender? Os dados ficariam dessa forma: 1ª inserção: { 1328413|vitor avancini cabral|curricular|qualquer|123456|thiago|13/02/2016|14/07/2016|20/07/2016|concluido|200|200|tudo 2ª inserção x 123|seila silva souza|em andamento|casa da mae joana|123456|thiago |12/12/12|20/03/13|25/03/13|concluido|100|110|sucesso|ok| sendo que a "{" deverá ficar na décima posição. A "{" na verdade é um short que indica o tamanho do meu registro
  17. MAIN: #include <string> #include <cstring> #include <cstdlib> #include <ostream> #include <fstream> #include <iostream> #include "Estagio.h" using namespace std; int main () { EstagioAluno ea; ofstream arq1; ifstream arq2; int op = 0; do{ printf("\n___________________________\n"); printf(" ESTAGIOS |\n"); printf("___________________________|\n"); printf("1 - Adicionar Estagio\t |"); printf("\n2 - Ler arquivo\t\t |"); printf("\n0 - Sair\t\t |"); printf("\n___________________________|\n"); printf("\nDigite a opcao: "); setbuf(stdin, NULL); scanf("%d", &op); switch(op) { case 0: printf("Fechando sistema!"); break; case 1: arq1.open ("estagios.txt", ios::binary|ios::app); if (!arq1.good()) { cerr<< "Não foi possível abrir o arquivo."<<endl; exit(1); } ea.PreencherEA(); ea.writeEA(arq1); arq1.close(); break; case 2: arq2.open("estagios.txt", ios::binary); if (!arq2.good()) { cerr<< "Nao foi possivel abrir o arquivo."<<endl; exit(2); } ea.readEA(arq2); arq2.close(); break; default: printf("Opcao invalida."); break; } }while (op != 0); }
  18. nãos custa, achei que fosse desnecessário, vou colocar o código de função de leitura e escrita ESCRITA: void EstagioAluno::writeEA (ofstream &arq) { char buffer [1000]; char aux [20]; short length; itoa(matricula, buffer, 10); strcat(buffer, "|"); strcat(buffer, nomeCompleto); strcat(buffer, "|"); strcat(buffer, tipoEstagio); strcat(buffer, "|"); strcat(buffer, nomeEmpresa); strcat(buffer, "|"); strcat(buffer, cnpj); strcat(buffer, "|"); strcat(buffer, nomeSupervisor); strcat(buffer, "|"); strcat(buffer, dataInicio); strcat(buffer, "|"); strcat(buffer, dataFim); strcat(buffer, "|"); strcat(buffer, dataEntregaRelatorioParcial); strcat(buffer, "|"); strcat(buffer, situacao); strcat(buffer, "|"); itoa(horasPrevistas, aux, 10);//converte int em char na base 10 e passa para aux strcat(buffer, aux); strcat(buffer, "|"); itoa(horasTotalizadas, aux, 10);//converte int em char na base 10 e passa para aux strcat(buffer, aux); strcat(buffer, "|"); strcat(buffer, parecerFinal); strcat(buffer, "|"); length = (short) strlen(buffer); arq.seekp(9, ios::end);//reserva os 10 primeiros bytes para o cabeçalho cout << arq.tellp() << endl; cout << buffer << endl; //campo flag de excluido (avail list) arq.write((char*)&length, sizeof(length)); arq.write(buffer, length); cout << arq.tellp() << endl; } LEITURA: void EstagioAluno::readEA(ifstream &arq) { short lenght; char *buffer; arq.seekg(9);//aponta para o décimo bytes while(!arq.eof()) { arq.read((char*)&lenght, sizeof(lenght)); buffer = new char[lenght]; buffer[lenght] = '\0'; arq.read(buffer, lenght); cout << buffer << endl; } } Consegue me ajudar?
  19. Essas linhas deveriam ser responsável por colocar o ponteiro na decima posição do meu arquivo e assim escrever o conteúdo de "lenght" que é um short no arquivo e depois escrever o conteúdo de "buffer" no arquivo. arq.seekp(9, ios::end);//reserva os 10 primeiros bytes para o cabeçalho //cout << arq.tellp() << endl; //cout << buffer << endl; //campo flag de excluido (avail list) arq.write((char*)&length, sizeof(length)); arq.write(buffer, length); //cout << arq.tellp() << endl; Porém ele escreve na primeira posição, simplesmente ignorando o seekp... Há algo de errado ai?
  20. Esse código faz o seguinte: pega a segunda metade de um arquivo e passa para outro, porém após adicionar a segunda metade ele também adiciona um espaço e um lixo, por exemplo: deste.txt{0123456789} paraEste.txt{56789 ç} Alguma ideia de como retirar esse lixo? /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ /* * File: main.cpp * Author: Vitor * * Created on 7 de Maio de 2016, 19:41 */ #include <cstdlib> #include <iostream> #include <stdio.h> using namespace std; /* * */ int main(int argc, char** argv) { FILE *arq1; FILE *arq2; long lSize, lHalfSize; char *buffer; arq1 = fopen("deste.txt", "rb"); if (arq1 == NULL) { cout << "Arquivo 1 não abriu!"; exit (1); } arq2 = fopen("paraEste.txt", "wb"); if (arq2 == NULL) { cout << "Arquivo 2 não abriu!"; exit (2); } //obtain half file size fseek (arq1, 0, SEEK_END); lSize = ftell (arq1); lHalfSize = lSize/2; fseek (arq1, lHalfSize, SEEK_SET); // allocate memory to contain the whole file: buffer = (char*) malloc (sizeof(char)*(lSize)); if (buffer == NULL) { fputs ("Erro de memória",stderr); exit (3); } // copy the file into the buffer: fread (buffer, sizeof(int), sizeof(buffer), arq1); fwrite (buffer , sizeof(int), sizeof(buffer), arq2); fclose (arq1); fclose (arq2); free (buffer); return 0; }
  21. qual é o erro?, o programa está fechando quando executa a seguinte função: void preenche_palavra (char palavra [70], char palavra_chute [70], char palpite) { int i, j; j = strlen(palavra); for (i = 0; i <= j; i++) { if (palavra == palpite) palavra_chute = palpite; } }

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!