Como colocar um getline c++ dentro de um for? [RESOLVIDO]

1. Como colocar um getline c++ dentro de um for? [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 13/07/2020 - 17:51h

Deveria ser uma coisa simples, mas não consigo entender porque não quer aceitar!
Eu sempre preferi for ao invés do while, motivo pelo qual estou tentando fazer funcionar isso!

Isso abaixo funciona! Mas preciso agora ler linha a linha, ao invés de caracter a caracter!
for(std::string Caracter; Caracter = MyFile.get(), !MyFile.eof(); EdTagsSuggestion_Value->append(Caracter.c_str())); 

É o mesmo comando acima, a única mudança é a forma como estou lendo, aqui linha a linha, mas o compilador não quer aceitar isso!
for(std::string Line; getline(MyFile, Line), !MyFile.eof(); EdTagsSuggestion_Value->append(Line.c_str()));
/* ERRO
Encyclopedia.cpp:666:4: error: this ‘for’ clause does not guard... [-Werror=misleading-indentation]
666 | for(std::string Line; getline(MyFile, Line), !MyFile.eof(); EdTagsSuggestion_Value->append(Line.c_str()));
| ^~~
Encyclopedia.cpp:671:7: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘for’
671 | MyFile.close();
| ^~~~~~
cc1plus: all warnings being treated as errors *\

Eu entendi que ele reclama que o for não está protegido, mas porque? Se antes estava, porque agora não está?
OBS Ele reclama mesmo que eu tire EdTags de dentro do for para colocar embaixo... OU seja ele reclama de tudo!
OBS 2 Eu sei que se eu remover -Werror a linha compila, mas ignorar o erro não é meu objetivo, a idéia é fazer direito! Eu compilo com as opções: -O3 -Wall -pedantic -pedantic-errors -Werror


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/07/2020 - 05:17h

A mensagem seria de warning, em vez de erro, mas como você usou (devidamente — não pare de usar) a opção -Werror, ele transformou o aviso em erro.

O que a mensagem diz é que o recuo de texto que você usou na linha 671 pode dar a entender visualmente que o comando dessa linha estaria sob a guarda do for da linha 666, quando, na verdade, sintaticamente não está.

Para saber por que esse aviso/erro é bom, procure no Google por “Apple goto fail bug”.

Uma coisa que eu passei a fazer nos meus programas que resolvem tudo dentro dos parênteses do for foi passar da forma
for(/* ... */);  // Ponto e vírgula na mesa linha. 

para esta seguinte.
for(/* ... */)
; // Ponto e vírgula na linha seguinte, e com uma tabulação a mais.


Se isso será suficiente para livrá-lo da mensagem de código perigoso por recuos visualmente enganosos, não sei. Possivelmente se a linha 671 também estiver com o mesmo nível (ou nível maior ainda) de recuo, a mensagem continue aparecendo.

Eu acho importante você usar recuo de forma consistente em todos os seus programas.

Eu uso como regra para mim usar recuos sempre com o caráter de tabulação; muito raramente uso espaços(†). Tem gente que prefere o contrário (sempre espaços, nunca tabulação). Isso é questão de gosto, embora alguns projetos obriguem um estilo ou outro (por exemplo, o Python força usar espaços, o kernel do Linux força usar tabulações). O importante, no entanto, é a consistência. E isso, às vezes (talvez muitas vezes), passa pela configuração do editor de texto. Alguns editores têm configurações que automaticamente substituem um certo número de espaços por um caráter de tabulação ou vice-versa, incluindo editores comuns, como o vim, o que pode comprometer a consistência se algum dia o mesmo código for manipulado com outro editor. É bom conhecer as ferramentas que se usa no dia a dia, e escolher entre adaptar-se ao seu funcionamento ou reconfigurá-los para garantir que eles não vão estragar o seu estilo preferido.

----

(†) Quando o faço, geralmente é dentro de comentários, ou então quando escrevo código em formulários web, como aqui neste fórum, já que a tecla tab dentro do navegador normalmente não funciona do mesmo jeito que o editor de texto.

... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts