그래서 당신은 당신이 필요로하는 의미있는 텍스트 파일을 처리하고 모든 텍스트를 읽고, 심지어 파일의 끝에서 개행 문자를 보존하려고합니다.
ReadLine()
은 파일이 1로 끝나지 않더라도 올바르게 처리됩니다. 사실 ReadLine()
은 파일이 끝에서 두 번째 줄을 읽은 후에 이 true
인 경우 마지막 캐리지 리턴을 사용합니다. ReadAllText()
also eats the last newline. 잠재적으로 대용량 파일을 처리 할 때 메모리에서 전체 파일을 한 번에 읽지 않으려 고합니다.
UTF-16과 같이 문자를 인코딩 할 때 둘 이상의 바이트를 사용하는 인코딩이 있기 때문에 파일의 마지막 두 바이트를 비교할 수도 없습니다. 따라서 인코딩을 인식하는 파일을 읽어야합니다. StreamReader는 그 일을합니다. 이 \n
에 종료 여부를
public static class StreamReaderExtensions
{
public static string ReadLineWithNewLine(this StreamReader reader)
{
var builder = new StringBuilder();
while (!reader.EndOfStream)
{
int c = reader.Read();
builder.Append((char) c);
if (c == 10)
{
break;
}
}
return builder.ToString();
}
}
그런 다음 마지막 반환 라인을 확인할 수 있습니다
그래서 해결책은 마지막에 개행 문자 (들)을 포함 ReadLine()
의 자신의 버전을 생성하는 것입니다 : StreamReader
가 많이 최적화되어 있지만
string line = "";
using (var stream = new StreamReader(@"D:\Temp\NewlineAtEnd.txt"))
{
while (!stream.EndOfStream)
{
line = stream.ReadLineWithNewLine();
Console.Write(line);
}
}
Console.WriteLine();
if (line.EndsWith("\n"))
{
Console.WriteLine("Newline at end of file");
}
else
{
Console.WriteLine("No newline at end of file");
}
, 나는 한 번에 하나 개의 문자를 읽기의 성능에 대한 신뢰도를 보장 할 수 없습니다. 두 개의 동일한 100MB 텍스트 파일을 사용한 빠른 테스트는 ReadLine()
(~ 1800 대 ~ 400ms)에 비해 상당히 급격한 속도 저하를 나타 냈습니다.
이 접근법은 원래 줄 끝을 유지하지만, \n
을 \r\n
또는 그 반대로 모두 변경하지 않고이 확장 메서드에서 반환 한 문자열을 사용하여 안전하게 파일을 다시 쓸 수 있습니다.
어쨌든 전체 내용을 읽어야하는 경우 왜 ReadToEnd() 사용에 대해 걱정합니까? – PhillipH
ReadToEnd()가 파일의 전체 내용을 반환하기 때문에 @PhillipH. – CodeCaster
".txt 파일 처리"의 의미는 무엇입니까? 한 줄씩 그것을 읽고, 약간의 처리를하고 아마도 마지막에 여분의 빈 줄을 읽는 것일까? – Alexei