Ir ao conteúdo

Posts recomendados

Postado

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?

Postado

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?

Postado

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);	
}

 

Postado

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  

Postado

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

Postado

Olá Vitor,

 

A linha de código

arq.seekp(9, ios::end);

pula para a décima posição a partir do fim, não do início. Tenta assim:

arq.seekp(9, ios::beg);

A linha de código acima pula para a décima posição a partir do início do arquivo.

Postado
17 horas atrás, danieltm64 disse:

Olá Vitor,

 

A linha de código


arq.seekp(9, ios::end);

pula para a décima posição a partir do fim, não do início. Tenta assim:


arq.seekp(9, ios::beg);

A linha de código acima pula para a décima posição a partir do início do arquivo.

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

Postado

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?  

Visitante
Este tópico está impedido de receber novas respostas.

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