Logo Hardware.com.br
herriot
herriot Novo Membro Registrado
4 Mensagens 0 Curtidas

Última linha duplicada ao ler arquivos em C++

#1 Por herriot 13/11/2015 - 17:42
Olá, meu povo

Eu vi que o problema é recorrente, mas não consegui achar uma solução.
Quando colocamos um arquivo para ser lido dentro do while sob a condição:
while(!arq.fail()), ou mesmo while(!arq.eof()), acaba que q ao ler a última linha do arquivo, as funções eof( ) ou fail( ) ainda retornam FALSE, permitindo que o loop seja executado novamente e então o "arq>>" vai fazer a leitura do EOF, mas sem receber novos dados, e por isso acaba repetindo a última linha lida.
Estou preparando uma aula pra ministrar sobre isso, por isso não dá mais tempo de mudar a estrutura de leitura e escrita...
Segue abaixo o algoritmo q estou usando, e fico muito grato por qualquer dica q eu receber:
(o programa salvou uma lista de personagens com os animes aos quais esses personagens pertencem, agora quer exibir os dados)

void exibe_arquivo( ){
string anime1, nome1;
ifstream arq;
arq.open("C:\\ListaPersonagem.txt", ios::in);
if(arq.fail()){
cout<<"Erro na abertura do arquivo!"< cout<<"Impossível ler!"< }
else{
while(!arq.fail( )){
arq>>nome1;
cout<<"Personagem: "< arq>>anime1;
cout<<"Anime: "< }
}
arq.close();
}
cin.ignore(); getchar();
}

(putz, ficou tudo alhinhado à direita aqui, e não consegui mudar... foi mal)
Pirituba
Pirituba Super Participante Registrado
355 Mensagens 91 Curtidas
#2 Por Pirituba
13/11/2015 - 18:48
Blz, cara o código com !arq.eof() funcionou aqui perfeitamente.
[code=C]#include
#include
#include

using namespace std;

void exibe_arquivo( ){
string anime1, nome1;
ifstream arq;

arq.open("C:\\Users\\pcsantos\\Desktop\\ListaPersonagem.txt", ios::in);
if (!arq){
cout << "Erro na abertura do arquivo!" << endl;
cout<<"Impossível ler!"< }
else{
while( !arq.eof() ){
arq >> nome1;
cout << "Personagem: " << nome1 <<" | ";
arq >> anime1;
cout << "Anime: " << anime1 << endl;
}
}
arq.close();
}

int main() {

exibe_arquivo();
return 0;
}
[/code]

O problema esta no arquivo texto que vc esta usando, faz o seguinte, vai no final dele e tira qualquer caractere depois da última palavra, seja um \n, pq aih esta o problema com o EOF, se tiver mais uma linha, ele vai ler essa linha que só tem um \n como válida e vai ocorrer o erro, exemplo:
Agora com o .fail tem que olhar melhor e verificar no man o seu funcionamento.

Perna Loney
Pato Loney <- bem aqui, seu arquivo deve terminar aqui, se tiver uma quebra de linha aqui o EOF ainda não é NULL.
Abraço
"O mundo é um moinho."
– Cartola

“A primeira coisa a entender é que você não entende."
– Soren Aabye Kierkegaard
herriot
herriot Novo Membro Registrado
4 Mensagens 0 Curtidas
#3 Por herriot
13/11/2015 - 19:11
Pirituba disse:
Blz, cara o código com !arq.eof() funcionou aqui perfeitamente.
[code=C]#include
#include
#include

using namespace std;

void exibe_arquivo( ){
string anime1, nome1;
ifstream arq;

arq.open("C:\\Users\\pcsantos\\Desktop\\ListaPersonagem.txt", ios::in);
if (!arq){
cout << "Erro na abertura do arquivo!" << endl;
cout<<"Impossível ler!"< }
else{
while( !arq.eof() ){
arq >> nome1;
cout << "Personagem: " << nome1 <<" | ";
arq >> anime1;
cout << "Anime: " << anime1 << endl;
}
}
arq.close();
}

int main() {

exibe_arquivo();
return 0;
}
[/code]

O problema esta no arquivo texto que vc esta usando, faz o seguinte, vai no final dele e tira qualquer caractere depois da última palavra, seja um \n, pq aih esta o problema com o EOF, se tiver mais uma linha, ele vai ler essa linha que só tem um \n como válida e vai ocorrer o erro, exemplo:
Agora com o .fail tem que olhar melhor e verificar no man o seu funcionamento.

Perna Loney
Pato Loney <- bem aqui, seu arquivo deve terminar aqui, se tiver uma quebra de linha aqui o EOF ainda não é NULL.
Abraço


Putz... Era exatamente isso... Eu dava um 'endl' depois de salvar os arquivos na hora de gerar o arquivo, e não me tocava disso!
Vlw, cara... Vlw muito mesmo.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal