Class: ARGF
Instance Method Summary collapse
-
#argv ⇒ Object
Returns the
ARGV
array, which contains the arguments passed to your script, one per element. -
#binmode ⇒ Object
Puts
ARGF
into binary mode. -
#binmode? ⇒ Boolean
Returns true if
ARGF
is being read in binary mode; false otherwise. -
#bytes ⇒ Object
ARGF.each_byte {|byte| block } -> ARGF ARGF.each_byte -> an_enumerator.
-
#chars ⇒ Object
ARGF.each_char {|char| block } -> ARGF ARGF.each_char -> an_enumerator.
-
#close ⇒ Object
Closes the current file and skips to the next in the stream.
-
#closed? ⇒ Boolean
Returns true if the current file has been closed; false otherwise.
-
#each ⇒ Object
ARGF.each_line(sep=$/) {|line| block } -> ARGF ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF ARGF.each_line(...) -> an_enumerator.
-
#each_byte ⇒ Object
ARGF.each_byte {|byte| block } -> ARGF ARGF.each_byte -> an_enumerator.
-
#each_char ⇒ Object
ARGF.each_char {|char| block } -> ARGF ARGF.each_char -> an_enumerator.
-
#each_line ⇒ Object
ARGF.each_line(sep=$/) {|line| block } -> ARGF ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF ARGF.each_line(...) -> an_enumerator.
-
#eof ⇒ Object
Returns true if the current file in
ARGF
is at end of file, i.e. -
#eof? ⇒ Object
Returns true if the current file in
ARGF
is at end of file, i.e. -
#external_encoding ⇒ Encoding
Returns the external encoding for files read from
ARGF
as anEncoding
object. -
#file ⇒ File object
Returns the current file as an
IO
orFile
object. -
#filename ⇒ Object
Returns the current filename.
-
#fileno ⇒ Object
Returns an integer representing the numeric file descriptor for the current file.
-
#getbyte ⇒ Fixnum?
Gets the next 8-bit byte (0..255) from
ARGF
. -
#getc ⇒ String?
Reads the next character from
ARGF
and returns it as aString
. -
#gets ⇒ Object
Returns the next line from the current file in
ARGF
. -
#initialize ⇒ Object
constructor
:nodoc:.
-
#initialize_copy ⇒ Object
:nodoc:.
-
#inplace_mode ⇒ String
Returns the file extension appended to the names of modified files under inplace-edit mode.
-
#inplace_mode=(ext) ⇒ Object
Sets the filename extension for inplace editing mode to the given String.
-
#internal_encoding ⇒ Encoding
Returns the internal encoding for strings read from
ARGF
as anEncoding
object. -
#lineno ⇒ Integer
Returns the current line number of ARGF as a whole.
-
#lineno=(number) ⇒ nil
Sets the line number of
ARGF
as a whole to the givenInteger
. -
#lines ⇒ Object
ARGF.each_line(sep=$/) {|line| block } -> ARGF ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF ARGF.each_line(...) -> an_enumerator.
-
#path ⇒ Object
Returns the current filename.
-
#pos ⇒ Object
Returns the current offset (in bytes) of the current file in
ARGF
. -
#pos=(position) ⇒ Integer
Seeks to the position given by position (in bytes) in
ARGF
. -
#print ⇒ Object
Writes the given object(s) to ios.
-
#printf(format_string[, obj, ...]) ⇒ nil
Formats and writes to ios, converting parameters under control of the format string.
-
#putc(obj) ⇒ Object
If obj is
Numeric
, write the character whose code is the least-significant byte of obj, otherwise write the first byte of the string representation of obj to ios. -
#puts(obj, ...) ⇒ nil
Writes the given objects to ios as with
IO#print
. -
#read([length [, buffer]]) ⇒ String?
Reads length bytes from ARGF.
-
#read_nonblock ⇒ Object
Reads at most maxlen bytes from the ARGF stream in non-blocking mode.
-
#readbyte ⇒ Fixnum
Reads the next 8-bit byte from ARGF and returns it as a
Fixnum
. -
#readchar ⇒ String?
Reads the next character from
ARGF
and returns it as aString
. -
#readline ⇒ Object
Returns the next line from the current file in
ARGF
. -
#readlines ⇒ Object
ARGF.to_a(sep=$/) -> array ARGF.to_a(limit) -> array ARGF.to_a(sep, limit) -> array.
-
#readpartial ⇒ Object
Reads at most maxlen bytes from the ARGF stream.
-
#rewind ⇒ 0
Positions the current file to the beginning of input, resetting
ARGF.lineno
to zero. -
#seek(amount, whence = IO::SEEK_SET) ⇒ 0
Seeks to offset amount (an
Integer
) in theARGF
stream according to the value of whence. -
#set_encoding ⇒ Object
If single argument is specified, strings read from ARGF are tagged with the encoding specified.
-
#skip ⇒ Object
Sets the current file to the next file in ARGV.
-
#tell ⇒ Object
Returns the current offset (in bytes) of the current file in
ARGF
. -
#to_a ⇒ Object
ARGF.to_a(sep=$/) -> array ARGF.to_a(limit) -> array ARGF.to_a(sep, limit) -> array.
-
#to_i ⇒ Object
Returns an integer representing the numeric file descriptor for the current file.
-
#to_io ⇒ Object
Returns an
IO
object representing the current file. -
#to_s ⇒ String
Returns "ARGF".
-
#to_write_io ⇒ IO
Returns IO instance tied to ARGF for writing if inplace mode is enabled.
-
#write(string) ⇒ Integer
Writes string if inplace mode.
Methods included from Enumerable
#all?, #any?, #chunk, #collect, #collect_concat, #count, #cycle, #detect, #drop, #drop_while, #each_cons, #each_entry, #each_slice, #each_with_index, #each_with_object, #entries, #find, #find_all, #find_index, #first, #flat_map, #grep, #group_by, #include?, #inject, #map, #max, #max_by, #member?, #min, #min_by, #minmax, #minmax_by, #none?, #one?, #partition, #reduce, #reject, #reverse_each, #select, #slice_before, #sort, #sort_by, #take, #take_while, #zip
Constructor Details
#initialize ⇒ Object
:nodoc:
|
# File 'io.c'
static VALUE
argf_initialize(VALUE argf, VALUE argv)
{
memset(&ARGF, 0, sizeof(ARGF));
argf_init(&ARGF, argv);
return argf;
}
|
Instance Method Details
#argv ⇒ Object
Returns the ARGV
array, which contains the arguments passed to your script, one per element.
For example:
$ ruby argf.rb -v glark.txt
ARGF.argv #=> ["-v", "glark.txt"]
|
# File 'io.c'
static VALUE
argf_argv(VALUE argf)
{
return ARGF.argv;
}
|
#binmode ⇒ Object
Puts ARGF
into binary mode. Once a stream is in binary mode, it cannot be reset to non-binary mode. This option has the following effects:
-
Newline conversion is disabled.
-
Encoding conversion is disabled.
-
Content is treated as ASCII-8BIT.
|
# File 'io.c'
static VALUE
argf_binmode_m(VALUE argf)
{
ARGF.binmode = 1;
next_argv();
ARGF_FORWARD(0, 0);
rb_io_ascii8bit_binmode(ARGF.current_file);
return argf;
}
|
#binmode? ⇒ Boolean
Returns true if ARGF
is being read in binary mode; false otherwise. (To enable binary mode use ARGF.binmode
.
For example:
ARGF.binmode? #=> false
ARGF.binmode
ARGF.binmode? #=> true
|
# File 'io.c'
static VALUE
argf_binmode_p(VALUE argf)
{
return ARGF.binmode ? Qtrue : Qfalse;
}
|
#bytes {|byte| ... } ⇒ Object #bytes ⇒ Object
ARGF.each_byte {|byte| block } -> ARGF
ARGF.each_byte -> an_enumerator
Iterates over each byte of each file in ARGV
. A byte is returned as a Fixnum
in the range 0..255.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last byte of the first file has been returned, the first byte of the second file is returned. The ARGF.filename
method can be used to determine the filename of the current byte.
If no block is given, an enumerator is returned instead.
For example:
ARGF.bytes.to_a #=> [35, 32, ... 95, 10]
|
# File 'io.c'
static VALUE
argf_each_byte(VALUE argf)
{
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_byte"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
|
#chars {|char| ... } ⇒ Object #chars ⇒ Object
ARGF.each_char {|char| block } -> ARGF
ARGF.each_char -> an_enumerator
Iterates over each character of each file in ARGF
.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last character of the first file has been returned, the first character of the second file is returned. The ARGF.filename
method can be used to determine the name of the file in which the current character appears.
If no block is given, an enumerator is returned instead.
|
# File 'io.c'
static VALUE
argf_each_char(VALUE argf)
{
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_char"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
|
#close ⇒ Object
Closes the current file and skips to the next in the stream. Trying to close a file that has already been closed causes an IOError
to be raised.
For example:
$ ruby argf.rb foo bar
ARGF.filename #=> "foo"
ARGF.close
ARGF.filename #=> "bar"
ARGF.close
ARGF.close #=> closed stream (IOError)
|
# File 'io.c'
static VALUE
argf_close_m(VALUE argf)
{
next_argv();
argf_close(ARGF.current_file);
if (ARGF.next_p != -1) {
ARGF.next_p = 1;
}
|
#closed? ⇒ Boolean
Returns true if the current file has been closed; false otherwise. Use ARGF.close
to actually close the current file.
|
# File 'io.c'
static VALUE
argf_closed(VALUE argf)
{
next_argv();
ARGF_FORWARD(0, 0);
return rb_io_closed(ARGF.current_file);
}
|
#each(sep = $/) {|line| ... } ⇒ Object #each(sep = $/, limit) {|line| ... } ⇒ Object #each(...) ⇒ Object
ARGF.each_line(sep=$/) {|line| block } -> ARGF
ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF
ARGF.each_line(...) -> an_enumerator
ARGF.lines(sep=$/) {|line| block } -> ARGF
ARGF.lines(sep=$/,limit) {|line| block } -> ARGF
ARGF.lines(...) -> an_enumerator
Returns an enumerator which iterates over each line (separated by sep, which defaults to your platform's newline character) of each file in ARGV
. If a block is supplied, each line in turn will be yielded to the block, otherwise an enumerator is returned. The optional limit argument is a Fixnum
specifying the maximum length of each line; longer lines will be split according to this limit.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last line of the first file has been returned, the first line of the second file is returned. The ARGF.filename
and ARGF.lineno
methods can be used to determine the filename and line number, respectively, of the current line.
For example, the following code prints out each line of each named file prefixed with its line number, displaying the filename once per file:
ARGF.lines do |line|
puts ARGF.filename if ARGF.lineno == 1
puts "#{ARGF.lineno}: #{line}"
end
|
# File 'io.c'
static VALUE
argf_each_line(int argc, VALUE *argv, VALUE argf)
{
RETURN_ENUMERATOR(argf, argc, argv);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, 0, 0);
ARGF.next_p = 1;
}
|
#bytes {|byte| ... } ⇒ Object #bytes ⇒ Object
ARGF.each_byte {|byte| block } -> ARGF
ARGF.each_byte -> an_enumerator
Iterates over each byte of each file in ARGV
. A byte is returned as a Fixnum
in the range 0..255.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last byte of the first file has been returned, the first byte of the second file is returned. The ARGF.filename
method can be used to determine the filename of the current byte.
If no block is given, an enumerator is returned instead.
For example:
ARGF.bytes.to_a #=> [35, 32, ... 95, 10]
|
# File 'io.c'
static VALUE
argf_each_byte(VALUE argf)
{
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_byte"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
|
#chars {|char| ... } ⇒ Object #chars ⇒ Object
ARGF.each_char {|char| block } -> ARGF
ARGF.each_char -> an_enumerator
Iterates over each character of each file in ARGF
.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last character of the first file has been returned, the first character of the second file is returned. The ARGF.filename
method can be used to determine the name of the file in which the current character appears.
If no block is given, an enumerator is returned instead.
|
# File 'io.c'
static VALUE
argf_each_char(VALUE argf)
{
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_char"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
|
#each(sep = $/) {|line| ... } ⇒ Object #each(sep = $/, limit) {|line| ... } ⇒ Object #each(...) ⇒ Object
ARGF.each_line(sep=$/) {|line| block } -> ARGF
ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF
ARGF.each_line(...) -> an_enumerator
ARGF.lines(sep=$/) {|line| block } -> ARGF
ARGF.lines(sep=$/,limit) {|line| block } -> ARGF
ARGF.lines(...) -> an_enumerator
Returns an enumerator which iterates over each line (separated by sep, which defaults to your platform's newline character) of each file in ARGV
. If a block is supplied, each line in turn will be yielded to the block, otherwise an enumerator is returned. The optional limit argument is a Fixnum
specifying the maximum length of each line; longer lines will be split according to this limit.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last line of the first file has been returned, the first line of the second file is returned. The ARGF.filename
and ARGF.lineno
methods can be used to determine the filename and line number, respectively, of the current line.
For example, the following code prints out each line of each named file prefixed with its line number, displaying the filename once per file:
ARGF.lines do |line|
puts ARGF.filename if ARGF.lineno == 1
puts "#{ARGF.lineno}: #{line}"
end
|
# File 'io.c'
static VALUE
argf_each_line(int argc, VALUE *argv, VALUE argf)
{
RETURN_ENUMERATOR(argf, argc, argv);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, 0, 0);
ARGF.next_p = 1;
}
|
#eof? ⇒ Boolean #eof ⇒ Boolean
Returns true if the current file in ARGF
is at end of file, i.e. it has no data to read. The stream must be opened for reading or an IOError
will be raised.
$ echo "eof" | ruby argf.rb
ARGF.eof? #=> false
3.times { ARGF.readchar }
ARGF.eof? #=> false
ARGF.readchar #=> "\n"
ARGF.eof? #=> true
|
# File 'io.c'
static VALUE
argf_eof(VALUE argf)
{
next_argv();
if (RTEST(ARGF.current_file)) {
if (ARGF.init_p == 0) return Qtrue;
next_argv();
ARGF_FORWARD(0, 0);
if (rb_io_eof(ARGF.current_file)) {
return Qtrue;
}
|
#eof? ⇒ Boolean #eof ⇒ Boolean
Returns true if the current file in ARGF
is at end of file, i.e. it has no data to read. The stream must be opened for reading or an IOError
will be raised.
$ echo "eof" | ruby argf.rb
ARGF.eof? #=> false
3.times { ARGF.readchar }
ARGF.eof? #=> false
ARGF.readchar #=> "\n"
ARGF.eof? #=> true
|
# File 'io.c'
static VALUE
argf_eof(VALUE argf)
{
next_argv();
if (RTEST(ARGF.current_file)) {
if (ARGF.init_p == 0) return Qtrue;
next_argv();
ARGF_FORWARD(0, 0);
if (rb_io_eof(ARGF.current_file)) {
return Qtrue;
}
|
#external_encoding ⇒ Encoding
Returns the external encoding for files read from ARGF
as an Encoding
object. The external encoding is the encoding of the text as stored in a file. Contrast with ARGF.internal_encoding
, which is the encoding used to represent this text within Ruby.
To set the external encoding use ARGF.set_encoding
.
For example:
ARGF.external_encoding #=> #<Encoding:UTF-8>
|
# File 'io.c'
static VALUE
argf_external_encoding(VALUE argf)
{
if (!RTEST(ARGF.current_file)) {
return rb_enc_from_encoding(rb_default_external_encoding());
}
|
#file ⇒ File object
Returns the current file as an IO
or File
object. #<IO:<STDIN>> is returned when the current file is STDIN.
For example:
$ echo "foo" > foo
$ echo "bar" > bar
$ ruby argf.rb foo bar
ARGF.file #=> #<File:foo>
ARGF.read(5) #=> "foo\nb"
ARGF.file #=> #<File:bar>
|
# File 'io.c'
static VALUE
argf_file(VALUE argf)
{
next_argv();
return ARGF.current_file;
}
|
#filename ⇒ String #path ⇒ String
Returns the current filename. "-" is returned when the current file is STDIN.
For example:
$ echo "foo" > foo
$ echo "bar" > bar
$ echo "glark" > glark
$ ruby argf.rb foo bar glark
ARGF.filename #=> "foo"
ARGF.read(5) #=> "foo\nb"
ARGF.filename #=> "bar"
ARGF.skip
ARGF.filename #=> "glark"
|
# File 'io.c'
static VALUE
argf_filename(VALUE argf)
{
next_argv();
return ARGF.filename;
}
|
#fileno ⇒ Fixnum #to_i ⇒ Fixnum
Returns an integer representing the numeric file descriptor for the current file. Raises an ArgumentError
if there isn't a current file.
ARGF.fileno #=> 3
|
# File 'io.c'
static VALUE
argf_fileno(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream");
}
|
#getbyte ⇒ Fixnum?
Gets the next 8-bit byte (0..255) from ARGF
. Returns nil
if called at the end of the stream.
For example:
$ echo "foo" > file
$ ruby argf.rb file
ARGF.getbyte #=> 102
ARGF.getbyte #=> 111
ARGF.getbyte #=> 111
ARGF.getbyte #=> 10
ARGF.getbyte #=> nil
|
# File 'io.c'
static VALUE
argf_getbyte(VALUE argf)
{
VALUE ch;
retry:
if (!next_argv()) return Qnil;
if (TYPE(ARGF.current_file) != T_FILE) {
ch = rb_funcall3(ARGF.current_file, rb_intern("getbyte"), 0, 0);
}
|
#getc ⇒ String?
Reads the next character from ARGF
and returns it as a String
. Returns nil
at the end of the stream.
ARGF
treats the files named on the command line as a single file created by concatenating their contents. After returning the last character of the first file, it returns the first character of the second file, and so on.
For example:
$ echo "foo" > file
$ ruby argf.rb file
ARGF.getc #=> "f"
ARGF.getc #=> "o"
ARGF.getc #=> "o"
ARGF.getc #=> "\n"
ARGF.getc #=> nil
ARGF.getc #=> nil
|
# File 'io.c'
static VALUE
argf_getc(VALUE argf)
{
VALUE ch;
retry:
if (!next_argv()) return Qnil;
if (ARGF_GENERIC_INPUT_P()) {
ch = rb_funcall3(ARGF.current_file, rb_intern("getc"), 0, 0);
}
|
#gets(sep = $/) ⇒ String #gets(limit) ⇒ String #gets(sep, limit) ⇒ String
Returns the next line from the current file in ARGF
.
By default lines are assumed to be separated by $/; to use a different character as a separator, supply it as a String
for the sep argument.
The optional limit argument specifies how many characters of each line to return. By default all characters are returned.
|
# File 'io.c'
static VALUE
argf_gets(int argc, VALUE *argv, VALUE argf)
{
VALUE line;
line = argf_getline(argc, argv, argf);
rb_lastline_set(line);
return line;
}
|
#initialize_copy ⇒ Object
:nodoc:
|
# File 'io.c'
static VALUE
argf_initialize_copy(VALUE argf, VALUE orig)
{
ARGF = argf_of(orig);
ARGF.argv = rb_obj_dup(ARGF.argv);
if (ARGF.inplace) {
const char *inplace = ARGF.inplace;
ARGF.inplace = 0;
ARGF.inplace = ruby_strdup(inplace);
}
|
#inplace_mode ⇒ String
Returns the file extension appended to the names of modified files under inplace-edit mode. This value can be set using ARGF.inplace_mode=
or passing the -i
switch to the Ruby binary.
|
# File 'io.c'
static VALUE
argf_inplace_mode_get(VALUE argf)
{
if (!ARGF.inplace) return Qnil;
return rb_str_new2(ARGF.inplace);
}
|
#inplace_mode=(ext) ⇒ Object
Sets the filename extension for inplace editing mode to the given String. Each file being edited has this value appended to its filename. The modified file is saved under this new name.
For example:
$ ruby argf.rb file.txt
ARGF.inplace_mode = '.bak'
ARGF.lines do |line|
print line.sub("foo","bar")
end
Each line of file.txt has the first occurrence of "foo" replaced with "bar", then the new line is written out to file.txt.bak.
|
# File 'io.c'
static VALUE
argf_inplace_mode_set(VALUE argf, VALUE val)
{
if (rb_safe_level() >= 1 && OBJ_TAINTED(val))
rb_insecure_operation();
if (!RTEST(val)) {
if (ARGF.inplace) free(ARGF.inplace);
ARGF.inplace = 0;
}
|
#internal_encoding ⇒ Encoding
Returns the internal encoding for strings read from ARGF
as an Encoding
object.
If ARGF.set_encoding
has been called with two encoding names, the second is returned. Otherwise, if Encoding.default_external
has been set, that value is returned. Failing that, if a default external encoding was specified on the command-line, that value is used. If the encoding is unknown, nil is returned.
|
# File 'io.c'
static VALUE
argf_internal_encoding(VALUE argf)
{
if (!RTEST(ARGF.current_file)) {
return rb_enc_from_encoding(rb_default_external_encoding());
}
|
#lineno ⇒ Integer
Returns the current line number of ARGF as a whole. This value can be set manually with ARGF.lineno=
.
For example:
ARGF.lineno #=> 0
ARGF.readline #=> "This is line 1\n"
ARGF.lineno #=> 1
|
# File 'io.c'
static VALUE
argf_lineno(VALUE argf)
{
return INT2FIX(ARGF.lineno);
}
|
#lineno=(number) ⇒ nil
Sets the line number of ARGF
as a whole to the given Integer
.
ARGF
sets the line number automatically as you read data, so normally you will not need to set it explicitly. To access the current line number use ARGF.lineno
.
For example:
ARGF.lineno #=> 0
ARGF.readline #=> "This is line 1\n"
ARGF.lineno #=> 1
ARGF.lineno = 0 #=> nil
ARGF.lineno #=> 0
|
# File 'io.c'
static VALUE
argf_set_lineno(VALUE argf, VALUE val)
{
ARGF.lineno = NUM2INT(val);
ARGF.last_lineno = ARGF.lineno;
return Qnil;
}
|
#each(sep = $/) {|line| ... } ⇒ Object #each(sep = $/, limit) {|line| ... } ⇒ Object #each(...) ⇒ Object
ARGF.each_line(sep=$/) {|line| block } -> ARGF
ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF
ARGF.each_line(...) -> an_enumerator
ARGF.lines(sep=$/) {|line| block } -> ARGF
ARGF.lines(sep=$/,limit) {|line| block } -> ARGF
ARGF.lines(...) -> an_enumerator
Returns an enumerator which iterates over each line (separated by sep, which defaults to your platform's newline character) of each file in ARGV
. If a block is supplied, each line in turn will be yielded to the block, otherwise an enumerator is returned. The optional limit argument is a Fixnum
specifying the maximum length of each line; longer lines will be split according to this limit.
This method allows you to treat the files supplied on the command line as a single file consisting of the concatenation of each named file. After the last line of the first file has been returned, the first line of the second file is returned. The ARGF.filename
and ARGF.lineno
methods can be used to determine the filename and line number, respectively, of the current line.
For example, the following code prints out each line of each named file prefixed with its line number, displaying the filename once per file:
ARGF.lines do |line|
puts ARGF.filename if ARGF.lineno == 1
puts "#{ARGF.lineno}: #{line}"
end
|
# File 'io.c'
static VALUE
argf_each_line(int argc, VALUE *argv, VALUE argf)
{
RETURN_ENUMERATOR(argf, argc, argv);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, 0, 0);
ARGF.next_p = 1;
}
|
#filename ⇒ String #path ⇒ String
Returns the current filename. "-" is returned when the current file is STDIN.
For example:
$ echo "foo" > foo
$ echo "bar" > bar
$ echo "glark" > glark
$ ruby argf.rb foo bar glark
ARGF.filename #=> "foo"
ARGF.read(5) #=> "foo\nb"
ARGF.filename #=> "bar"
ARGF.skip
ARGF.filename #=> "glark"
|
# File 'io.c'
static VALUE
argf_filename(VALUE argf)
{
next_argv();
return ARGF.filename;
}
|
#tell ⇒ Integer #pos ⇒ Integer
Returns the current offset (in bytes) of the current file in ARGF
.
ARGF.pos #=> 0
ARGF.gets #=> "This is line one\n"
ARGF.pos #=> 17
|
# File 'io.c'
static VALUE
argf_tell(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to tell");
}
|
#pos=(position) ⇒ Integer
Seeks to the position given by position (in bytes) in ARGF
.
For example:
ARGF.pos = 17
ARGF.gets #=> "This is line two\n"
|
# File 'io.c'
static VALUE
argf_set_pos(VALUE argf, VALUE offset)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to set position");
}
|
#print ⇒ nil #print(obj, ...) ⇒ nil
Writes the given object(s) to ios. The stream must be opened for writing. If the output field separator ($,
) is not nil
, it will be inserted between each object. If the output record separator ($\
) is not nil
, it will be appended to the output. If no arguments are given, prints $_
. Objects that aren't strings will be converted by calling their to_s
method. With no argument, prints the contents of the variable $_
. Returns nil
.
$stdout.print("This is ", 100, " percent.\n")
produces:
This is 100 percent.
|
# File 'io.c'
VALUE
rb_io_print(int argc, VALUE *argv, VALUE out)
{
int i;
VALUE line;
/* if no argument given, print `$_' */
if (argc == 0) {
argc = 1;
line = rb_lastline_get();
argv = &line;
}
|
#printf(format_string[, obj, ...]) ⇒ nil
Formats and writes to ios, converting parameters under control of the format string. See Kernel#sprintf
for details.
|
# File 'io.c'
VALUE
rb_io_printf(int argc, VALUE *argv, VALUE out)
{
rb_io_write(out, rb_f_sprintf(argc, argv));
return Qnil;
}
|
#putc(obj) ⇒ Object
If obj is Numeric
, write the character whose code is the least-significant byte of obj, otherwise write the first byte of the string representation of obj to ios. Note: This method is not safe for use with multi-byte characters as it will truncate them.
$stdout.putc "A"
$stdout.putc 65
produces:
AA
|
# File 'io.c'
static VALUE
rb_io_putc(VALUE io, VALUE ch)
{
VALUE str;
if (TYPE(ch) == T_STRING) {
str = rb_str_substr(ch, 0, 1);
}
|
#puts(obj, ...) ⇒ nil
Writes the given objects to ios as with IO#print
. Writes a record separator (typically a newline) after any that do not already end with a newline sequence. If called with an array argument, writes each element on a new line. If called without arguments, outputs a single record separator.
$stdout.puts("this", "is", "a", "test")
produces:
this
is
a
test
|
# File 'io.c'
VALUE
rb_io_puts(int argc, VALUE *argv, VALUE out)
{
int i;
VALUE line;
/* if no argument given, print newline. */
if (argc == 0) {
rb_io_write(out, rb_default_rs);
return Qnil;
}
|
#read([length [, buffer]]) ⇒ String?
Reads length bytes from ARGF. The files named on the command line are concatenated and treated as a single file by this method, so when called without arguments the contents of this pseudo file are returned in their entirety.
length must be a non-negative integer or nil. If it is a positive integer, read
tries to read at most length bytes. It returns nil if an EOF was encountered before anything could be read. Fewer than length bytes may be returned if an EOF is encountered during the read.
If length is omitted or is nil, it reads until EOF. A String is returned even if EOF is encountered before any data is read.
If length is zero, it returns _""_.
If the optional buffer argument is present, it must reference a String, which will receive the data.
For example:
$ echo "small" > small.txt
$ echo "large" > large.txt
$ ./glark.rb small.txt large.txt
ARGF.read #=> "small\nlarge"
ARGF.read(200) #=> "small\nlarge"
ARGF.read(2) #=> "sm"
ARGF.read(0) #=> ""
Note that this method behaves like fread() function in C. If you need the behavior like read(2) system call, consider ARGF.readpartial
.
|
# File 'io.c'
static VALUE
argf_read(int argc, VALUE *argv, VALUE argf)
{
VALUE tmp, str, length;
long len = 0;
rb_scan_args(argc, argv, "02", &length, &str);
if (!NIL_P(length)) {
len = NUM2LONG(argv[0]);
}
|
#read_nonblock(maxlen) ⇒ String #read_nonblock(maxlen, outbuf) ⇒ Object
Reads at most maxlen bytes from the ARGF stream in non-blocking mode.
|
# File 'io.c'
static VALUE
argf_read_nonblock(int argc, VALUE *argv, VALUE argf)
{
return argf_getpartial(argc, argv, argf, 1);
}
|
#readbyte ⇒ Fixnum
Reads the next 8-bit byte from ARGF and returns it as a Fixnum
. Raises an EOFError
after the last byte of the last file has been read.
For example:
$ echo "foo" > file
$ ruby argf.rb file
ARGF.readbyte #=> 102
ARGF.readbyte #=> 111
ARGF.readbyte #=> 111
ARGF.readbyte #=> 10
ARGF.readbyte #=> end of file reached (EOFError)
|
# File 'io.c'
static VALUE
argf_readbyte(VALUE argf)
{
VALUE c;
NEXT_ARGF_FORWARD(0, 0);
c = argf_getbyte(argf);
if (NIL_P(c)) {
rb_eof_error();
}
|
#readchar ⇒ String?
Reads the next character from ARGF
and returns it as a String
. Raises an EOFError
after the last character of the last file has been read.
For example:
$ echo "foo" > file
$ ruby argf.rb file
ARGF.readchar #=> "f"
ARGF.readchar #=> "o"
ARGF.readchar #=> "o"
ARGF.readchar #=> "\n"
ARGF.readchar #=> end of file reached (EOFError)
|
# File 'io.c'
static VALUE
argf_readchar(VALUE argf)
{
VALUE ch;
retry:
if (!next_argv()) rb_eof_error();
if (TYPE(ARGF.current_file) != T_FILE) {
ch = rb_funcall3(ARGF.current_file, rb_intern("getc"), 0, 0);
}
|
#readline(sep = $/) ⇒ String #readline(limit) ⇒ String #readline(sep, limit) ⇒ String
Returns the next line from the current file in ARGF
.
By default lines are assumed to be separated by $/; to use a different character as a separator, supply it as a String
for the sep argument.
The optional limit argument specifies how many characters of each line to return. By default all characters are returned.
An EOFError
is raised at the end of the file.
|
# File 'io.c'
static VALUE
argf_readline(int argc, VALUE *argv, VALUE argf)
{
VALUE line;
if (!next_argv()) rb_eof_error();
ARGF_FORWARD(argc, argv);
line = argf_gets(argc, argv, argf);
if (NIL_P(line)) {
rb_eof_error();
}
|
#readlines(sep = $/) ⇒ Array #readlines(limit) ⇒ Array #readlines(sep, limit) ⇒ Array
ARGF.to_a(sep=$/) -> array
ARGF.to_a(limit) -> array
ARGF.to_a(sep, limit) -> array
Reads ARGF
's current file in its entirety, returning an Array
of its lines, one line per element. Lines are assumed to be separated by sep.
lines = ARGF.readlines
lines[0] #=> "This is line one\n"
|
# File 'io.c'
static VALUE
argf_readlines(int argc, VALUE *argv, VALUE argf)
{
long lineno = ARGF.lineno;
VALUE lines, ary;
ary = rb_ary_new();
while (next_argv()) {
if (ARGF_GENERIC_INPUT_P()) {
lines = rb_funcall3(ARGF.current_file, rb_intern("readlines"), argc, argv);
}
|
#readpartial(maxlen) ⇒ String #readpartial(maxlen, outbuf) ⇒ Object
Reads at most maxlen bytes from the ARGF stream. It blocks only if ARGF
has no data immediately available. If the optional outbuf argument is present, it must reference a String, which will receive the data. It raises EOFError
on end of file.
readpartial
is designed for streams such as pipes, sockets, and ttys. It blocks only when no data is immediately available. This means that it blocks only when following all conditions hold:
-
The byte buffer in the
IO
object is empty. -
The content of the stream is empty.
-
The stream has not reached EOF.
When readpartial
blocks, it waits for data or EOF. If some data is read, readpartial
returns with the data. If EOF is reached, readpartial raises an EOFError
.
When readpartial
doesn't block, it returns or raises immediately. If the byte buffer is not empty, it returns the data in the buffer. Otherwise, if the stream has some content, it returns the data in the stream. If the stream reaches EOF an EOFError
is raised.
|
# File 'io.c'
static VALUE
argf_readpartial(int argc, VALUE *argv, VALUE argf)
{
return argf_getpartial(argc, argv, argf, 0);
}
|
#rewind ⇒ 0
Positions the current file to the beginning of input, resetting ARGF.lineno
to zero.
ARGF.readline #=> "This is line one\n"
ARGF.rewind #=> 0
ARGF.lineno #=> 0
ARGF.readline #=> "This is line one\n"
|
# File 'io.c'
static VALUE
argf_rewind(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to rewind");
}
|
#seek(amount, whence = IO::SEEK_SET) ⇒ 0
Seeks to offset amount (an Integer
) in the ARGF
stream according to the value of whence. See IO#seek for further details.
|
# File 'io.c'
static VALUE
argf_seek_m(int argc, VALUE *argv, VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to seek");
}
|
#set_encoding(ext_enc) ⇒ Object #set_encoding("ext_enc:int_enc") ⇒ Object #set_encoding(ext_enc, int_enc) ⇒ Object #set_encoding("ext_enc:int_enc", opt) ⇒ Object #set_encoding(ext_enc, int_enc, opt) ⇒ Object
If single argument is specified, strings read from ARGF are tagged with the encoding specified.
If two encoding names separated by a colon are given, e.g. "ascii:utf-8", the read string is converted from the first encoding (external encoding) to the second encoding (internal encoding), then tagged with the second encoding.
If two arguments are specified, they must be encoding objects or encoding names. Again, the first specifies the external encoding; the second specifies the internal encoding.
If the external encoding and the internal encoding are specified, the optional Hash
argument can be used to adjust the conversion process. The structure of this hash is explained in the String#encode documentation.
For example:
ARGF.set_encoding('ascii') # Tag the input as US-ASCII text
ARGF.set_encoding(Encoding::UTF_8) # Tag the input as UTF-8 text
ARGF.set_encoding('utf-8','ascii') # Transcode the input from US-ASCII
# to UTF-8.
|
# File 'io.c'
static VALUE
argf_set_encoding(int argc, VALUE *argv, VALUE argf)
{
rb_io_t *fptr;
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to set encoding");
}
|
#skip ⇒ Object
Sets the current file to the next file in ARGV. If there aren't any more files it has no effect.
For example:
$ ruby argf.rb foo bar
ARGF.filename #=> "foo"
ARGF.skip
ARGF.filename #=> "bar"
|
# File 'io.c'
static VALUE
argf_skip(VALUE argf)
{
if (ARGF.init_p && ARGF.next_p == 0) {
argf_close(ARGF.current_file);
ARGF.next_p = 1;
}
|
#tell ⇒ Integer #pos ⇒ Integer
Returns the current offset (in bytes) of the current file in ARGF
.
ARGF.pos #=> 0
ARGF.gets #=> "This is line one\n"
ARGF.pos #=> 17
|
# File 'io.c'
static VALUE
argf_tell(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to tell");
}
|
#readlines(sep = $/) ⇒ Array #readlines(limit) ⇒ Array #readlines(sep, limit) ⇒ Array
ARGF.to_a(sep=$/) -> array
ARGF.to_a(limit) -> array
ARGF.to_a(sep, limit) -> array
Reads ARGF
's current file in its entirety, returning an Array
of its lines, one line per element. Lines are assumed to be separated by sep.
lines = ARGF.readlines
lines[0] #=> "This is line one\n"
|
# File 'io.c'
static VALUE
argf_readlines(int argc, VALUE *argv, VALUE argf)
{
long lineno = ARGF.lineno;
VALUE lines, ary;
ary = rb_ary_new();
while (next_argv()) {
if (ARGF_GENERIC_INPUT_P()) {
lines = rb_funcall3(ARGF.current_file, rb_intern("readlines"), argc, argv);
}
|
#fileno ⇒ Fixnum #to_i ⇒ Fixnum
Returns an integer representing the numeric file descriptor for the current file. Raises an ArgumentError
if there isn't a current file.
ARGF.fileno #=> 3
|
# File 'io.c'
static VALUE
argf_fileno(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream");
}
|
#to_io ⇒ Object
Returns an IO
object representing the current file. This will be a File
object unless the current file is a stream such as STDIN.
For example:
ARGF.to_io #=> #<File:glark.txt>
ARGF.to_io #=> #<IO:<STDIN>>
|
# File 'io.c'
static VALUE
argf_to_io(VALUE argf)
{
next_argv();
ARGF_FORWARD(0, 0);
return ARGF.current_file;
}
|
#to_s ⇒ String
Returns "ARGF".
|
# File 'io.c'
static VALUE
argf_to_s(VALUE argf)
{
return rb_str_new2("ARGF");
}
|
#to_write_io ⇒ IO
Returns IO instance tied to ARGF for writing if inplace mode is enabled.
|
# File 'io.c'
static VALUE
argf_write_io(VALUE argf)
{
if (!RTEST(ARGF.current_file)) {
rb_raise(rb_eIOError, "not opened for writing");
}
|
#write(string) ⇒ Integer
Writes string if inplace mode.
|
# File 'io.c'
static VALUE
argf_write(VALUE argf, VALUE str)
{
return rb_io_write(argf_write_io(argf), str);
}
|