Bytestring 라이브러리의 Data.ByteString.Lazy.Char8 라이브러리에 대한 질문이 있습니다. 특히, 내 질문에 다음과 같이 설명되어있는 readFile 함수를 관련이 있습니다.Windows에서 Data.ByteString.Lazy.Char8 개행 변환 --- 문서가 오도 된 것입니까?
ByteString lazily 전체 파일을 읽습니다. Windows에서 '텍스트 모드'를 사용하여 개행 문자를 해석하십시오.
이 함수는 '뉴 라인을 해석하기 위해 텍스트 모드를 사용합니다.'라는 주장에 관심이 있습니다. 그래서 openFile
기능 (openBinaryFile
반대)를 사용하고 있으며, :
-- | Read an entire file /lazily/ into a 'ByteString'. Use 'text mode'
-- on Windows to interpret newlines
readFile :: FilePath -> IO ByteString
readFile f = openFile f ReadMode >>= hGetContents
을 우리는 어떤 의미에서, 문서의 주장이 완벽하게 사실입니다 것을 볼 다음과 같이 함수에 대한 소스 코드는 파일에 개행 변환이 사용 가능하게됩니다.
하지만 파일은 hGetContents로 전달됩니다. 그러면 소스 코드 here과 here 인 Data.ByteString.hGetNonBlocking
이 호출됩니다.이 소스 코드는 Data.ByteString.hGet
의 비 차단 버전입니다 (the documentation 참조). (최종적으로) Data.ByteString.hGet
은 GHC.IO.Handle.hGetBuf
(the documentation 또는 the source code 참조)이라고합니다. 이 기능의 documentation는
hGetBuf는 손잡이가 현재 사용하고있는 어떤 TextEncoding 무시하고 기본 입출력 장치에서 직접 바이트를 읽어 있다고 말한다. 우리가 오히려
readBinaryFile
보다readFile
을 사용하여 파일을 열었다는 사실이 관련이 있음을 시사
: 데이터는 질문의 시작 부분에 언급 된 문서의 주장에도 불구하고, 변환 줄 바꿈없이 읽을 수 있습니다.
그래서 질문의 핵심 : 1. 뭔가 빠졌습니까? 'Data.ByteString.Lazy.Char8.readFile에서 줄 바꿈을 해석하기 위해 Windows에서 텍스트 모드를 사용하는'진술은 사실입니까? 아니면 설명서가 오도 된 것입니까?
P. 테스트는 또한 적어도이 기능을 사용하면서 순진하게 사용하면 Windows에서 줄 바꿈을 수행하지 않는다는 것을 나타냅니다. 소스에 또 하나 개의 층을 파고
Text.hs에 대한 합리적인 링크는 http://git.megacz.com/?p=ghc-base.git;a=tree;f=GHC/IO/Handle에 있습니다. hb = HEAD –
코드가 원시 바이트를 읽었 음을 확인해 주셔서 감사합니다! (비록 내 발굴 후 99 % 확신 :-)) 이것은 분명히 문서 오류라고 생각 하는가, 아니면 텍스트 모드를 설정하는 것이 내가 모르는 다른 목적을 가지고 있는가? hGetBuf 사용? 문서 버그 인 경우 Data.ByteString.Lazy.Char8의 docstring을 변경하기위한 패치를 제출하는 절차는 무엇인지 알고 있습니까? –
bytestring 패키지의 readFile에 대한 문서 오류와 같은 것 같습니다. 전자 메일 주소가있는 두 명의 관리자가 http://hackage.haskell.org/package/bytestring에 나열되어 있으며이 목록을 수정하면 도움이 될 수 있습니다. –