• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

yugi-fan

Ler string de um ficheiro de um ficheiro

8 mensagens neste tópico

Boas,

Estou a tentar construir um projecto para um corrector ortográfico em C++, ja defini as classes e muitos métodos, mas o método para carregar o dicionário de um ficheiro *txt está com problemas...

int CLetra::CarregaDicionario(char *NomeFich){
    ifstream ff;
ff.open(NomeFich, ios::binary);
int dim;
        int j;
        char palavra[25];
    
    
if(ff.fail()){                                             //verificar se o ficheiro foi aberto com sucesso
	cout<<"Erro ao abrir o Ficheiro de leitura ."<<endl;
	return 0;
}
    // Calcula o comprimento (em octetos) do ficheiro
    ff.seekg (0, ios::end);
    dim = ff.tellg();
    ff.seekg (0, ios::beg);
       
for(j = 0; !ff.eof()&&j<dim;  j++){ //lendo e aramazenado cada palavra 
                ff.getline(palavra, 25, '\n');
	InsereItem(palavra);
                 j++;
	ff.peek();
}

ff.close();

return j;
}

O problema penso eu não ser do método InsereItem, mas sim desta função. Dêem as vossas opiniões  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porque é que fazes o ff.peek() aí? acho que isso, no caso do ifstream, mete o ponteiro get nesse caracter, para ser o próximo a ser extraído, acho que não precisas disso se vais a ler linha a linha até EOF. Já agora, qual o erro que te dá?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é só ler a linha, eu preciso é de ler palavras que estao numa linha com ate 25 caracteres. Não percebi bem o que querias dizer com isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A mim, também me está a fazer um pouco de confusão esse "dim" aí.

Antes do ciclo, determinas o tamanho do ficheiro (em bytes) com o tellg(), mas depois tentas usar o número de bytes para terminar um ciclo for que supostamente incrementa "j" linha a linha. Porquê comparar o tamanho em bytes com o número de linhas? Se estás a ler de um ficheiro ASCII, de certeza que precisas de usar ios::binary?

Para além de que não precisas de pré-determinar o limite de caracteres na linha: existe um getline() de âmbito global que usa streams. Tal como o Metalium disse, não precisas sequer de usar seekg() ou tellg().

Pessoalmente, eu utilizaria uma string (que podes sempre converter para char* no resto da tua classe), não me preocupava mais com limites arbitrários e faria esse último ciclo assim:

    string palavra;
    int j = 0;

//...

do {
  getline(ff,palavra);
  if(!palavra.empty())
  {
    InsereItem(palavra.c_str()); j++;
  }
}while(!ff.eof());
ff.close();
return j;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

O dim, e esse método de saber o nº de linhas estava a mais foi-me sugerido mas não tinha utilidade, fiz assim:

int CLetra::CarregaDicionario(char *NomeFich){
    ifstream leitura;
leitura.open(NomeFich);
int j;
    char palavra[25];
    
    
if(leitura.fail()){//verificando se o ficheiro foi aberto com sucesso
	cout<<"Erro ao abrir o Ficheiro de leitura ."<<endl;
	return 0;
}

    
 for (j = 0; !leitura.eof(); ++j ){
                leitura.getline(palavra, sizeof(palavra));
                InsereItem(palavra);
                leitura.peek();     // activa flag eof (\’ultimo caracter e’ ’\n’)
             }

leitura.close();

return j;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deves ser de eng electrotecnia da fctuc, (tb to a fazer um projc assim pa eda).

eu fiz +- assim:

void CLista::Dic(CLista D){

string linha;


fstream fic ("DicPortugues.txt");

	if (! fic) 
		cout << "Erro ao abrir o ficheiro!" << endl;



while (! fic.eof())
{

	getline(fic,linha);
	D.InsereItem(linha);

}

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lol, por acaso até sou. Que projecto é que escolheste? O Scrabble é de dar a volta à cabeça  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tb escolhi o corrector de texto,pareceme muito mais facil que o scrabble

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora