Ler um trecho especifico de um .txt

1. Ler um trecho especifico de um .txt

William Lima
willdoidao

(usa Ubuntu)

Enviado em 02/03/2015 - 10:39h

Pessoal,

Estou com uma duvida, preciso ler um trecho especifico de um .txt. O arquivo vem na seguinte estrutura:

[ @ Periodo]

[localhost @ Periodo]
Primeiro grau
Segundo grau
Terceiro grau

[ @ alunos]

[localhost @ alunos]
maria
joão
joaquim
manuel

[end]



A quantidade pode variar (alunos e período), preciso pegar tudo que está entre: [ @ alunos] e [end]

Começei a fazer mas não consegui sair de um loop infinito:

#include <iostream>
#include <fstream>
#include <string>
#include <list>
using namespace std;


std::list<std::string> ma_liste;

int main () {
string line;
ifstream myfile ("c:\\whitelst.ini"); // ifstream = padrão ios:in
if (myfile.is_open())
{
while (! myfile.eof() ) //enquanto end of file for false continua
{
getline (myfile,line); // como foi aberto em modo texto(padrão)
//e não binário(ios::bin) pega cada linha


//ma_liste.push_back(line);

while(line == "[ @ Files]" && line != "[end]")
cout << line << endl;
}
myfile.close();
}
else cout << "Unable to open file";


system("pause");
return 0;
}




  


2. Re: Ler um trecho especifico de um .txt

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/03/2015 - 04:09h

Caro Will,

Preste atenção no seu loop. Você manda ele ler e repetir enquanto foi igual "[ @ Files]" e diferente de "[end]".

- Se é igual a "[ @ Files]", necessariamente é diferente de "[end]"; não precisa testar as duas coisas.

- O que acontece se a linha lida não for nenhuma das duas coisas?

- E o que acontece se for justamente "[ @ Files]" (dica: dentro do loop, você não muda o valor da variável de controle)?

- Você não quis dizer "[ @ alunos]", em lugar de "[ @ Files]"?

- (Dúvida sincera, para quem souber responder) No comentário do programa, você diz “como foi aberto em modo texto(padrão) e não binário(ios::bin) pega cada linha”. No mundo Unix, não há distinção, do ponto de vista das bibliotecas do C e C++, entre arquivo binários e de texto. E eu sempre achei que, nos sistemas onde tal distinção existe (mundo DOS-Windows, por exemplo), ela fosse somente (ou principalmente) com relação ao tratamento da marca de fim de linha (na escrita, '\n' se transforma na sequência "\r\n", e vice-versa na hora da leitura; se a leitura encontrar um '\n' ou um '\r' isolados, eles não são considerados especiais, e acabam sendo incorporados ipsis litteris à string ou buffer de destino da leitura). Existe algum outro caráter ou sequência de caracteres que confunda as operações de I/O ou sejam tratadas de modo especial?


Se o arquivo tiver uma ordem conhecida de seções e não tiver repetições, você pode dividir seu problema em três partes separadas: (1) o que fazer antes de encontrar o início do bloco de interesse; (2) o que fazer até encontrar o fim desse bloco; e (3) o que fazer depois de ter passado o fim do bloco. Se, no entanto, a ordem não for previamente conhecida ou a seção de interesse ocorrer múltiplas vezes, você pode usar um loop só e uma variável que indique se você está dentro do bloco de interesse; o valor dessa variável mudaria de falso para verdadeiro quando você encontrasse o texto inicial, e de verdadeiro para falso ao encontrar o texto final.