2012-02-04 3 views
0

입력 한 이름의 파일에 콘솔 입력을 쓰는 간단한 프로그램을 작성하고 싶습니다.Ruby - 콘솔 입력을 파일에 쓰는 법

file_name = ARGV[0] 
of = File.open(file_name, 'w') 

while a = gets.chomp 
    puts a 
    of.puts a 
end 

# 루비 write_script.rb의 file_name.txt

반환 : main: undefined method chomp for nil:NilClass (NoMethodError)

업데이트 :

file_name = ARGV[0] 
File.open(file_name, 'w') do |file| 
    while (a = gets) 
    print a 
    file.write a 
    end 
end 

이 코드를 실행 한 후 - 빈 파일이 생성 프로그램이 시작에서 종료 및 .

올바른 방법은 무엇입니까?

답변

1

다음 코드는 나를 위해 작동 :

begin 
    File.open(ARGV.shift, 'w') do |f| 
    while a = gets.chomp 
     p a 
     break if a == 'exit' 
     f.puts a 
    end 
    end 
rescue SignalException 
    puts 
    puts "#Completed#" 
    exit 
end 

STDIN에 이동하기 전에 ARG에 무엇이든 액세스 할 후자 gets를 사용하는 경우 때문에 나는 ARG.shift 대신 ARG[0]로 사용하고 있음을 주목해야한다. ARG.shift은 원래 인수를 제거합니다.

+0

Beatiful solution과 저는 ctr-c에 문제가있었습니다. 고마워요) –

+0

하지만 ctr-c, puts : ** 가져 오기 오류 : 인터럽트 ** –

+1

오류로 인해 중단되는 것이 정상입니다. ctr-c를 사용할 때도 깨끗한 마무리를 원한다면 그 오류를 잡아야합니다. 위의 코드를 캐치하도록 업데이트했습니다. –

0

코드에 chomp의 철자가 chop으로 잘못 입력되었습니다.

+0

감사합니다.하지만 주된 문제는 아닙니다. –

0

여기에있는 방법은 chomp이며, 줄 바꿈 줄 문자 \n에서 문자열 (stdin을 gets()으로 찍은 것)을 제거합니다.

0

코드 :

file_name = ARGV[0] 
of = File.open(file_name, 'w') 

while a = STDIN.gets 
    print a 
    of.write a 
end 
of.close 

귀하의 문제 즉 당신이 표준 입력의 끝 부분에 도착하면 반환 nil을 가져옵니다.

+0

죄송합니다. 제 iPhone으로 인해 코드를 제대로 포맷 할 수 없게되었습니다. 그 이유는 확실하지 않습니다. –

+0

답변 주셔서 감사하지만, ** ruby ​​write_script.rb file_name을 사용하여 해당 코드를 실행 한 후 직접 시도했습니다.txt ** 프로그램 종료 및 빈 파일 ** file_name.txt ** 생성 –

+0

참고 : 프로그램이 끝나면 파일을 닫아야합니다! File.open의 블록 형식을 사용하는 것이 가장 좋습니다 (내 대답 참조). – Phrogz

2

제가 생각하기에는 문제는 사실 puts이 장면 뒤에서 몇 가지 작업을한다고 생각합니다. 특히 파일 이름이 명령 행 인수 인 경우 gets은 해당 파일에서 다음 행을 읽습니다 (이 문서의 Ruby docs, Kernel:gets 참조).

그래서, 한 줄 스크립트 경우 :

puts gets 

가 ...이 ruby onelinescript.rb some_file.txt 같은 CLI 인수로 호출됩니다, 그것은 some_file.txt의 첫 번째 줄을 인쇄합니다.

필자의 경우 문제는 쓰기 위해 CLI 인수 목록에서 먼저 파일을 연 다음 암시 적으로 읽기 위해 열려고 시도하므로 작동하지 않는다는 것입니다. 이 문제를 해결하려면, 당신은 명시 적으로에 gets를 호출 IO 객체를 명시해야한다 : 내가 잘못 경우

file_name = ARGV[0] 
of = File.open(file_name, 'w') 

while a = STDIN.gets.chomp 
    puts a 
    of.puts a 
end 

P. S., 즉 지적 주시기 바랍니다.

+0

고마워요. 사실 일 것 같습니다. –

관련 문제