
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.