sábado, 3 de agosto de 2013

C++ Working with Big files...


#include
#include
#include
#include
#include

int ConverteArquivo();

void load(unsigned long n, int q);


struct pessoa
{
char ID[8];
char CPF[13];
char nome[50];
char meio[10];
char sobrenome[50];
};

//converte uma string em um objeto Pessoa
struct pessoa *StrToPessoa(char str[]){

struct pessoa *p;
p = (pessoa *) malloc(sizeof(struct pessoa));
if(p==NULL){
printf("[error] - Falha na alocacao de memoria!");
exit(1);
}

char * pch;

pch = strtok (str," ");
strcpy(p->ID,pch);
pch = strtok (NULL, " ");
strcpy(p->CPF,pch);
pch = strtok (NULL, " ");
strcpy(p->nome,pch);
pch = strtok (NULL, " ");
strcpy(p->meio,pch);
pch = strtok (NULL, " ");
strcpy(p->sobrenome,pch);
return p;
}


void show(int q){
FILE *fpOrigem;

if((fpOrigem=fopen("c:\\TEMP\\ListaTemporario.txt","rb")) == NULL){
printf("[error] - o arquivo de Origem pode ser aberto.\n");
exit(0);
}



printf("\nLista de pessoas");
printf("\n----------------");

struct pessoa *p;

for(int i=0;i
fread(p, sizeof(struct pessoa), 1, fpOrigem);
printf("\n %d ID:%s CPF:%s Nome:%s Meio: %s SobreNome: %s", (i+1), p->ID, p->CPF, p->nome, p->meio, p->sobrenome);
free(p);

}

free(p);
fclose(fpOrigem);

}

int main ()
{
//ConverteArquivo() //opcional
clrscr();
unsigned long n = 0;
int q = 0;

printf("\nDigite N:");
scanf("%ld",&n);

printf("\nDigite Q:");
scanf("%d",&q);

load(n,q);



show(q);

getche();
return 0;

}


//Executa a leitura dos N arquivos para Memoria
void load(unsigned long n, int q){
FILE *fp;
FILE *fpTemporario;

if((fp=fopen("c:\\TEMP\\ListaDestino.txt","rb")) == NULL){
printf("[error] - o arquivo nao pode ser aberto.\n");
exit(0);
}

struct pessoa *p = (pessoa *) malloc(sizeof(struct pessoa));


fseek(fp, n * sizeof(struct pessoa), SEEK_SET);


if((fpTemporario=fopen("c:\\TEMP\\ListaTemporario.txt","wb"))==NULL)
{

printf("\n [error] - O arquivo nao pode ser aberto");

}


for(int i=0;i
fread(p, sizeof(struct pessoa), 1, fp);
if(fwrite(p, sizeof(struct pessoa),1,fpTemporario)!=1){
printf("[error] Falha ao gravar");
}

}

fclose(fp);
fclose(fpTemporario);

}


//Rotina auxiliar de conversao do arquivo, utilizado para gerar o arquivo
//de Struct para melhorar a performance de FSEEK
int ConverteArquivo(){
FILE *fpOrigem;
FILE *fpDestino;

if((fpDestino=fopen("c:\\TEMP\\ListaDestino.txt","wb"))==NULL)
{

printf("\n [error] - O arquivo nao pode ser aberto");

}


if((fpOrigem=fopen("c:\\TEMP\\ListaOrigem.txt","rb")) == NULL){
printf("[error] - o arquivo de Origem pode ser aberto.\n");
return 0;
}

char str[100];
char buf[2];
strcpy(str,"\0");
char ch;
unsigned long count = 0;

while(!feof(fpOrigem)){

ch = getc(fpOrigem);
buf[0] = ch;
buf[1] = '\0';
strcat(str,buf);

if(ch=='\n'){

struct pessoa *p= StrToPessoa(str);
clrscr();
printf("%ld - %s",count, str);
count++;


if(fwrite(p, sizeof(struct pessoa),1,fpDestino)!=1)
{
printf("[error] Falha ao gravar");
}
free(p);
strcpy(str,"\0");
}


}


fclose(fpOrigem);
fclose(fpDestino);

return 1;

}
Postar um comentário