Ir ao conteúdo
  • Cadastre-se

C++ Erro ao Importar um Arquivo Grande


Danielsf850

Posts recomendados

Boa tarde estou desenvolvendo uma aplicação em C++ onde preciso importar um arquivo com cerca de 340Mb onde são aproximadamente. 3.500.000 de linhas

estou tentando armazenar o conteúdo em um objeto da classe string. Porém durante a importação ocorre o erro "abort has been called".

 

Segue o trecho de codigo que estou usando para a manipulação dos Arquivos. Por favor quem tiver conhecimento me ajude. Obrigado.

 

bool ArquivoTexto::abrir(string nomeArquivo, TipoDeAcesso modo) {
	this->nomeArquivo = nomeArquivo;

	// Abre o arquivo segundo o modo de abertura.
	switch (modo) {
	case ACRESCENTAR: outputFile.open(nomeArquivo, ios::app);
		if (outputFile.is_open()) return true;
		break;

	case ESCRITA: outputFile.open(nomeArquivo, ios::out);
		if (outputFile.is_open()) return true;
		break;

	case LEITURA: inputFile.open(nomeArquivo, ios::in);
		/* O teste abaixo verifica se foi retornado um ponteiro válido, diferente de nulo, se sim o teste é true indicando que o arquivo foi aberto com sucesso.
			 Caso contrário, um ponteiro nulo indica que houve erro ao tentar abrir o arquivo.
		 */
		if (inputFile) return true;
	}
	return false;
} // abrir()

/* Lê o conteúdo do arquivo texto.
 * Retorna um objeto string com todo o conteúdo do arquivo texto.
 * Em caso de erro retorna um objeto string com o valor literal "NULL".
 */
string ArquivoTexto::ler() {
	char linha[128];

	// Verifica se ocorreu erro ao acessar o arquivo.
	if (!inputFile) return "NULL";

	// Lê o conteúdo do arquivo até atingir o fim do arquivo.
	do { // Lê o conteúdo de uma linha limitada a 127 caracteres ou até encontrar o caractere nova linha ('\n'). 
		inputFile.getline(linha, 128);

		// Verifica se atingiu o fim do arquivo. Se não, armazena as linhas lidas do texto em um objeto string.
		if (!inputFile.eof()) {
			texto.append(linha);
			texto.append("\n");
		}
	} while (!inputFile.eof());
	return texto;
} // ler()

 

Link para o comentário
Compartilhar em outros sites

A clase string al parecer tem um limite, esse limite vem explicado aqui: http://www.cplusplus.com/reference/string/string/max_size/

Ao parecer o tamanho máximo que pode alcançar é de 4294967291 letras, certamente você está estourando esse limite e por isso mostra esse erro.
A solução a seu problema poderia passar por usar memória dinâmica, já que com isso você teoricamente poderia alocar toda a memória livre contida no sistema.
Se alguém tiver algo mais que aportar também gostaria de ver a solução.

 

Se fosse possível disponibilizar o arquivo e o programa completo para fazer provas...

Link para o comentário
Compartilhar em outros sites

Simples assim como disse o vangodp:

Alocação de memória deve resolver seu problema.

Vou te passar um exemplo que tenho aqui e que acabei de testar,

com ele abri um arquivo de mais de 4777000 de linhas,

com quase 120MB. de tamanho.

Note que eu aloquei memória com malloc, e liberei no final com free()

Provavelmente você terá de fazer alguns ajustes, mas nada difícil.

#include <stdio.h>
#include <string.h>
#include <conio.h>
//isto aqui varia de acordo com o tamanho do arquivo
#define SIZE 4693240

int main ( ) {
	system ( "title ARQUIVO - LEITURA EM ARQUIVO DE TEXTOS PESADOS" );
	int a = 0, i;
	FILE *arq;
	char **lin;
	lin = ( char** ) malloc ( SIZE * sizeof ( char* ) );
	if ( ( arq = fopen ( "H:\\eclipse luna_two\\"
			"PROJETO\\PROJETO\\src\\codigos.txt", "r" ) ) == NULL ) {
		textcolor ( LIGHTBLUE );
		gotoxy ( 21 , 3 );
		printf ( "Houve um erro na abertura do arquivo" );
		getche ( );
		exit ( 0 );
	}
	textbackground ( WHITE );
	textcolor ( LIGHTRED );
	gotoxy ( 21 , 3 );
	printf ( "ARQUIVO - LEITURA EM ARQUIVO DE TEXTOS PESADOS" );
	for ( i = 0; i < SIZE ; i++ ) {
		//Esta divisão de SIZE por este número inteiro
		//também deverá ser ajustado.
		line [ i ] = ( char* ) malloc ( SIZE / 20000 );
		fgets ( lin [ i ] , 80 , arq );
	}
	for ( i = 0; i < SIZE; i++ ) {
		a = i;
		textcolor ( LIGHTRED );
		gotoxy ( 1 , a + 6 );
		printf ( "%d" , a );
		textcolor ( LIGHTBLUE );
		gotoxy ( 7 , i + 6 );
		printf ( "  %s" , lin [ i ] );
	}
	fclose ( arq );
	getche ( );
	free ( lin );
	exit ( 0 );	
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Vou testar esse arquivo agora, eu sabia que estava estourando o limite, porém não sabia se haveria algum tipo de solução para o problema, vou tentar alocar dinamicamente, o arquivo que preciso importar tem cerce de 342Mb e cerca de 350 trilhoes de caracteres. Vou em breve, agradeço a atenção dos membros.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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