paulo1205
(usa Ubuntu)
Enviado em 15/09/2014 - 15:47h
NewWave escreveu:
Boa tarde, experts!
Estou a desenvolver uma aplicaçãozinha em C++, mas esbarrei em uma dúvida, que por sinal já googlei e nada.
Todo mundo aqui sabe que se nós abrirmos um arquivo texto plano, feito no bloco de notas do windows, no linux, ele não manterá a formatação original, pelo menos na quebra de linha. Aparecerá um quadrado no lugar do caractere de quebra de linha. Isso significa que o win e o linux usam caracteres diferentes para quebrar a linha.
Mais do que simplesmente caracteres diferentes, são convenções diferentes: o mundo POSIX/UNIX/Linux usa apenas um caráter, que é aquele indicado no ASCII como
line feed (ou LF, correspondente em C a '\n'), enquanto o mundo Microsoft usa dois caracteres combinados, que são sempre o ASCII
carriage return (ou CR, correspondente em C a '\r') seguido pelo LF.
Esse negócio de "quadrado" geralmente não acontece no Linux. Acho que você provavelmente está confundindo com o que o Notepad do Windows mostra quando você tenta abrir um arquivo de texto gerado no Linux. Se for o caso, você trocou o sentido da observação.
Acontece que eu preciso analisar um txt feito no win numa aplicação minha compilada e rodada no linux. Obviamente, na hora que eu esbarrar com a quebra de linha, em vez de ele tratar esta como quebra de linha (\n) ele não vai achar o caratere usado no linux para tal e o programa vai se comportar de forma insperada.
Errado. Ele vai achar o LF que vem logo depois do CR, e vai começar a linha nova exatamente no mesmo ponto em que o Windows começaria. A diferença é que pode haver um CR sobrando no final de cada linha. Esse CR geralmente é categorizado como caráter de espaçamento (ver função
isblank()), e não provoca efeito visível se você simplesmente reproduzir o conteúdo do arquivo num terminal de texto ou impressora (se tudo estver configurado corretamente, claro).
A pergunta é: qual o caratere usado pelo windows para quebra de linha para que eu possa implementar a função de forma correta? Qual o seu código?
Está respondido acima.
Aproveitando, EOF em linux e win são a mesma coisa?
EOF não é um caráter, mas um código de sinalização de erro devolvido por várias funções da biblioteca de I/O. O símbolo
EOF geralmente tem o valor inteiro
-1,
que é diferente do valor de caráter com sinal -1, ainda que os dois sejam silenciosamente convertidos de caráter para inteiro ou vice-versa, se você não tomar os devidos cuidados, mas você não precisa -- nem deve! -- se preocupar com o valor por trás do símbolo: use sempre o símbolo.
Obrigado a todos.
PS: O cuidado que você tem de ter para não perder a sinalização de EOF, confundindo-a com um caráter qualquer, é prestar atenção ao fato de que as funções que fazem entrada e saída (mas especialmente entrada) de caracteres individuais sempre devolvem valores inteiros, e não um do tipo
char. Você, por conseguinte, tem de usar também variáveis inteiras na hora de receber tais valores, e só tentar extrair um caráter de dentro delas depois de ter certeza de que o valor retornado não é
EOF.
PS2: Eu acho muito pouco provável que não haja explicações bem melhores do que a minha na Internet. Se você procurou no Google e não encontrou resposta, seus termos de pesquisa não devem ter sido muito bons.