2013-07-30 5 views
0

루비의 현재 위치에서 2 바이트 뒤로 검색하려고합니다. 다음 코드는 이전 행의 끝을 찾으려고 시도합니다.파일의 현재 위치에서 음수를 찾는 방법은 무엇입니까?

1.9.3-p448 :003 > while file.getc != '\n' 
    1.9.3-p448 :004?> file.seek(-2,IO::SEEK_CUR) 
    1.9.3-p448 :005?> end 
    Errno::EINVAL: Invalid argument - test 
    from (irb):4:in `seek' 
    from (irb):4 
    from /usr/local/rvm/rubies/ruby-1.9.3-p448/bin/irb:16:in `<main>' 

왜이 오류가 발생하는지 이해할 수 없습니다. 그것은 완벽하게 외부 루프를 추구합니다 (같은 문장). test는 파일 이름입니다.

+0

왜 텍스트 파일에서 읽을 때'getc '를 사용하는지 궁금합니다. 라인을 읽고 마지막 몇 라인의 메모리에 작은 버퍼를 유지하는 것이 더 쉽고 빠르며, 버퍼를 통해 앞으로/뒤로 이동하는 것은 디스크의 문자 일치 인'getc '에 의존하는 것보다 쉽습니다. 파일 위치 지정. 코드 샘플은 냄새와 같이 매우 "C"합니다. 매우 특정한 (희귀 한) 경우를 제외하고는 루비에서 파일 I/O를 수행하는 방식이 아닙니다. –

답변

0

나는 파일에 아직 2 바이트가 없다는 것이 문제라고 생각합니다. 난 그냥 간단한 텍스트 파일로 이런 짓을 :

>> fp = File.new('pancakes.txt', 'r') 
>> fp.readline 
>> fp.seek(-2, IO::SEEK_CUR) 
=> 0 
>> fp.seek(-20, IO::SEEK_CUR) 
Errno::EINVAL: Invalid argument - x.txt 

파일의 첫 번째 줄은 너무 오래 -20이 파일의 시작 전에 저를 넣어 시도 할 것입니다 만 몇 자했다.

pos 체크를 던질 필요가 있다고 생각합니다. file.pos == 0이면 처음에 부정적인 추구가 예외를 발생시킵니다.

+0

네가 맞아.하지만 왜 '\ n'과 일치하지 않는거야? – mlemboy

+0

파일에 무엇이 있습니까? 루프를 시작할 때'file.pos' 란 무엇입니까? –

+0

이것은 루프 file.seek (-2, IO :: SEEK_END) – mlemboy

관련 문제