Class: ARGF
- Inherits:
-
Object
- Object
- ARGF
- Includes:
- Enumerable
- Defined in:
- io.c,
io.c
Overview
ARGF is a stream designed for use in scripts that process files given as command-line arguments or passed in via STDIN.
The arguments passed to your script are stored in the ARGV Array, one argument per element. ARGF assumes that any arguments that aren't filenames have been removed from ARGV. For example:
$ ruby argf.rb --verbose file1 file2
ARGV #=> ["--verbose", "file1", "file2"]
option = ARGV.shift #=> "--verbose"
ARGV #=> ["file1", "file2"]
You can now use ARGF to work with a concatenation of each of these named files. For instance, ARGF.read will return the contents of file1 followed by the contents of file2.
After a file in ARGV has been read ARGF removes it from the Array. Thus, after all files have been read ARGV will be empty.
You can manipulate ARGV yourself to control what ARGF operates on. If you remove a file from ARGV, it is ignored by ARGF; if you add files to ARGV, they are treated as if they were named on the command line. For example:
ARGV.replace ["file1"]
ARGF.readlines # Returns the contents of file1 as an Array
ARGV #=> []
ARGV.replace ["file2", "file3"]
ARGF.read # Returns the contents of file2 and file3
If ARGV is empty, ARGF acts as if it contained STDIN, i.e. the data piped to your script. For example:
$ echo "glark" | ruby -e 'p ARGF.read'
"glark\n"
Instance Method Summary (collapse)
-
- (Object) argv
Returns the ARGV array, which contains the arguments passed to your script, one per element.
-
- (Object) binmode
Puts ARGF into binary mode.
-
- (Boolean) binmode?
Returns true if ARGF is being read in binary mode; false otherwise.
-
- (Object) bytes
This is a deprecated alias for each_byte.
-
- (Object) chars
This is a deprecated alias for each_char.
-
- (Object) close
Closes the current file and skips to the next in the stream.
-
- (Boolean) closed?
Returns true if the current file has been closed; false otherwise.
-
- (Object) codepoints
This is a deprecated alias for each_codepoint.
-
- (Object) each
ARGF.each_line(sep=$/) {|line| block } -> ARGF.
-
- (Object) each_byte
ARGF.each_byte {|byte| block } -> ARGF.
-
- (Object) each_char
Iterates over each character of each file in ARGF.
-
- (Object) each_codepoint
Iterates over each codepoint of each file in ARGF.
-
- (Object) each_line
ARGF.each_line(sep=$/) {|line| block } -> ARGF.
-
- (Object) eof
Returns true if the current file in ARGF is at end of file, i.e.
-
- (Boolean) eof?
Returns true if the current file in ARGF is at end of file, i.e.
-
- (Encoding) external_encoding
Returns the external encoding for files read from ARGF as an Encoding object.
-
- (File object) file
Returns the current file as an IO or File object.
-
- (Object) filename
Returns the current filename.
-
- (Object) fileno
Returns an integer representing the numeric file descriptor for the current file.
-
- (Fixnum?) getbyte
Gets the next 8-bit byte (0..255) from ARGF.
-
- (String?) getc
Reads the next character from ARGF and returns it as a String.
-
- (Object) gets
Returns the next line from the current file in ARGF.
-
- (Object) initialize
constructor
:nodoc:.
-
- (Object) initialize_copy
:nodoc:.
-
- (String) inplace_mode
Returns the file extension appended to the names of modified files under inplace-edit mode.
-
- (Object) inplace_mode=(ext)
Sets the filename extension for inplace editing mode to the given String.
-
- (Encoding) internal_encoding
Returns the internal encoding for strings read from ARGF as an Encoding object.
-
- (Integer) lineno
Returns the current line number of ARGF as a whole.
-
- (Integer) lineno=(integer)
Sets the line number of ARGF as a whole to the given Integer.
-
- (Object) lines
This is a deprecated alias for each_line.
-
- (Object) path
Returns the current filename.
-
- (Object) pos
Returns the current offset (in bytes) of the current file in ARGF.
-
- (Integer) pos=(position)
Seeks to the position given by position (in bytes) in ARGF.
-
- (Object) print
Writes the given object(s) to ios.
-
- (nil) printf(format_string[, obj, ...])
Formats and writes to ios, converting parameters under control of the format string.
-
- (Object) putc(obj)
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.
-
- (nil) puts(obj, ...)
Writes the given objects to ios as with IO#print.
-
- (String?) read([length [, outbuf]])
Reads length bytes from ARGF.
-
- (Object) read_nonblock
Reads at most maxlen bytes from the ARGF stream in non-blocking mode.
-
- (Fixnum) readbyte
Reads the next 8-bit byte from ARGF and returns it as a Fixnum.
-
- (String?) readchar
Reads the next character from ARGF and returns it as a String.
-
- (Object) readline
Returns the next line from the current file in ARGF.
-
- (Object) readlines
ARGF.to_a(sep=$/) -> array.
-
- (Object) readpartial
Reads at most maxlen bytes from the ARGF stream.
-
- (0) rewind
Positions the current file to the beginning of input, resetting ARGF.lineno to zero.
-
- (0) seek(amount, whence = IO::SEEK_SET)
Seeks to offset amount (an Integer) in the ARGF stream according to the value of whence.
-
- (Object) set_encoding
If single argument is specified, strings read from ARGF are tagged with the encoding specified.
-
- (Object) skip
Sets the current file to the next file in ARGV.
-
- (Object) tell
Returns the current offset (in bytes) of the current file in ARGF.
-
- (Object) to_a
ARGF.to_a(sep=$/) -> array.
-
- (Object) to_i
Returns an integer representing the numeric file descriptor for the current file.
-
- (Object) to_io
Returns an IO object representing the current file.
-
- (String) to_s
(also: #inspect)
Returns "ARGF".
-
- (IO) to_write_io
Returns IO instance tied to ARGF for writing if inplace mode is enabled.
-
- (Integer) write(string)
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, #lazy, #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
- (Object) initialize
:nodoc:
7469 7470 7471 7472 7473 7474 7475 7476 |
# File 'io.c', line 7469
static VALUE
argf_initialize(VALUE argf, VALUE argv)
{
memset(&ARGF, 0, sizeof(ARGF));
argf_init(&ARGF, argv);
return argf;
}
|
Instance Method Details
- (Object) argv
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"]
11367 11368 11369 11370 11371 |
# File 'io.c', line 11367
static VALUE
argf_argv(VALUE argf)
{
return ARGF.argv;
}
|
- (Object) binmode
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.
11163 11164 11165 11166 11167 11168 11169 11170 11171 |
# File 'io.c', line 11163
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;
}
|
- (Boolean) binmode?
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
11186 11187 11188 11189 11190 |
# File 'io.c', line 11186
static VALUE
argf_binmode_p(VALUE argf)
{
return ARGF.binmode ? Qtrue : Qfalse;
}
|
- (Object) bytes
This is a deprecated alias for each_byte.
11003 11004 11005 11006 11007 11008 11009 11010 |
# File 'io.c', line 11003
static VALUE
argf_bytes(VALUE argf)
{
rb_warn("ARGF#bytes is deprecated; use #each_byte instead");
if (!rb_block_given_p())
return rb_enumeratorize(argf, ID2SYM(rb_intern("each_byte")), 0, 0);
return argf_each_byte(argf);
}
|
- (Object) chars
This is a deprecated alias for each_char.
11043 11044 11045 11046 11047 11048 11049 11050 |
# File 'io.c', line 11043
static VALUE
argf_chars(VALUE argf)
{
rb_warn("ARGF#chars is deprecated; use #each_char instead");
if (!rb_block_given_p())
return rb_enumeratorize(argf, ID2SYM(rb_intern("each_char")), 0, 0);
return argf_each_char(argf);
}
|
- (Object) close
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)
11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 |
# File 'io.c', line 11234
static VALUE
argf_close_m(VALUE argf)
{
next_argv();
argf_close(ARGF.current_file);
if (ARGF.next_p != -1) {
ARGF.next_p = 1;
}
ARGF.lineno = 0;
return argf;
}
|
- (Boolean) closed?
Returns true if the current file has been closed; false otherwise. Use ARGF.close to actually close the current file.
11253 11254 11255 11256 11257 11258 11259 |
# File 'io.c', line 11253
static VALUE
argf_closed(VALUE argf)
{
next_argv();
ARGF_FORWARD(0, 0);
return rb_io_closed(ARGF.current_file);
}
|
- (Object) codepoints
This is a deprecated alias for each_codepoint.
11083 11084 11085 11086 11087 11088 11089 11090 |
# File 'io.c', line 11083
static VALUE
argf_codepoints(VALUE argf)
{
rb_warn("ARGF#codepoints is deprecated; use #each_codepoint instead");
if (!rb_block_given_p())
return rb_enumeratorize(argf, ID2SYM(rb_intern("each_codepoint")), 0, 0);
return argf_each_codepoint(argf);
}
|
- (Object) each(sep = $/) {|line| ... } - (Object) each(sep = $/, limit) {|line| ... } - (Object) each(...)
ARGF.each_line(sep=$/) {|line| block } -> ARGF
ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF
ARGF.each_line(...) -> 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
10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 |
# File 'io.c', line 10940
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;
}
}
|
- (Object) bytes {|byte| ... } - (Object) bytes
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]
10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 |
# File 'io.c', line 10988
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;
}
}
|
- (Object) each_char {|char| ... } - (Object) each_char
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.
11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 |
# File 'io.c', line 11028
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;
}
}
|
- (Object) each_codepoint {|codepoint| ... } - (Object) each_codepoint
Iterates over each codepoint 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 codepoint of the first file has been returned, the first codepoint of the second file is returned. The ARGF.filename method can be used to determine the name of the file in which the current codepoint appears.
If no block is given, an enumerator is returned instead.
11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 |
# File 'io.c', line 11068
static VALUE
argf_each_codepoint(VALUE argf)
{
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
rb_block_call(ARGF.current_file, rb_intern("each_codepoint"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
}
|
- (Object) each(sep = $/) {|line| ... } - (Object) each(sep = $/, limit) {|line| ... } - (Object) each(...)
ARGF.each_line(sep=$/) {|line| block } -> ARGF
ARGF.each_line(sep=$/,limit) {|line| block } -> ARGF
ARGF.each_line(...) -> 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
10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 |
# File 'io.c', line 10940
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;
}
}
|
- (Boolean) eof? - (Boolean) eof
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
10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 |
# File 'io.c', line 10545
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;
}
}
return Qfalse;
}
|
- (Boolean) eof? - (Boolean) eof
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
10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 |
# File 'io.c', line 10545
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;
}
}
return Qfalse;
}
|
- (Encoding) external_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>
10329 10330 10331 10332 10333 10334 10335 10336 |
# File 'io.c', line 10329
static VALUE
argf_external_encoding(VALUE argf)
{
if (!RTEST(ARGF.current_file)) {
return rb_enc_from_encoding(rb_default_external_encoding());
}
return rb_io_external_encoding(rb_io_check_io(ARGF.current_file));
}
|
- (File object) file
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>
11145 11146 11147 11148 11149 11150 |
# File 'io.c', line 11145
static VALUE
argf_file(VALUE argf)
{
next_argv();
return ARGF.current_file;
}
|
- (String) filename - (String) path
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"
11114 11115 11116 11117 11118 11119 |
# File 'io.c', line 11114
static VALUE
argf_filename(VALUE argf)
{
next_argv();
return ARGF.filename;
}
|
- (Fixnum) fileno - (Fixnum) to_i
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
10497 10498 10499 10500 10501 10502 10503 10504 10505 |
# File 'io.c', line 10497
static VALUE
argf_fileno(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream");
}
ARGF_FORWARD(0, 0);
return rb_io_fileno(ARGF.current_file);
}
|
- (Fixnum?) getbyte
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
10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 |
# File 'io.c', line 10815
static VALUE
argf_getbyte(VALUE argf)
{
VALUE ch;
retry:
if (!next_argv()) return Qnil;
if (!RB_TYPE_P(ARGF.current_file, T_FILE)) {
ch = rb_funcall3(ARGF.current_file, rb_intern("getbyte"), 0, 0);
}
else {
ch = rb_io_getbyte(ARGF.current_file);
}
if (NIL_P(ch) && ARGF.next_p != -1) {
argf_close(ARGF.current_file);
ARGF.next_p = 1;
goto retry;
}
return ch;
}
|
- (String?) getc
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
10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 |
# File 'io.c', line 10775
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);
}
else {
ch = rb_io_getc(ARGF.current_file);
}
if (NIL_P(ch) && ARGF.next_p != -1) {
argf_close(ARGF.current_file);
ARGF.next_p = 1;
goto retry;
}
return ch;
}
|
- (String) gets(sep = $/) - (String) gets(limit) - (String) gets(sep, limit)
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.
7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 |
# File 'io.c', line 7836
static VALUE
argf_gets(int argc, VALUE *argv, VALUE argf)
{
VALUE line;
line = argf_getline(argc, argv, argf);
rb_lastline_set(line);
return line;
}
|
- (Object) initialize_copy
:nodoc:
7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 |
# File 'io.c', line 7479
static VALUE
argf_initialize_copy(VALUE argf, VALUE orig)
{
if (!OBJ_INIT_COPY(argf, orig)) return argf;
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);
}
return argf;
}
|
- (String) inplace_mode
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.
11281 11282 11283 11284 11285 11286 |
# File 'io.c', line 11281
static VALUE
argf_inplace_mode_get(VALUE argf)
{
if (!ARGF.inplace) return Qnil;
return rb_str_new2(ARGF.inplace);
}
|
- (Object) inplace_mode=(ext)
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.
11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 |
# File 'io.c', line 11314
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;
}
else {
StringValue(val);
if (ARGF.inplace) free(ARGF.inplace);
ARGF.inplace = 0;
ARGF.inplace = strdup(RSTRING_PTR(val));
}
return argf;
}
|
- (Encoding) internal_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.
10351 10352 10353 10354 10355 10356 10357 10358 |
# File 'io.c', line 10351
static VALUE
argf_internal_encoding(VALUE argf)
{
if (!RTEST(ARGF.current_file)) {
return rb_enc_from_encoding(rb_default_external_encoding());
}
return rb_io_internal_encoding(rb_io_check_io(ARGF.current_file));
}
|
- (Integer) lineno
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
7532 7533 7534 7535 7536 |
# File 'io.c', line 7532
static VALUE
argf_lineno(VALUE argf)
{
return INT2FIX(ARGF.lineno);
}
|
- (Integer) lineno=(integer)
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 #=> 0
ARGF.lineno #=> 0
7511 7512 7513 7514 7515 7516 7517 |
# File 'io.c', line 7511
static VALUE
argf_set_lineno(VALUE argf, VALUE val)
{
ARGF.lineno = NUM2INT(val);
ARGF.last_lineno = ARGF.lineno;
return Qnil;
}
|
- (Object) lines
This is a deprecated alias for each_line.
10955 10956 10957 10958 10959 10960 10961 10962 |
# File 'io.c', line 10955
static VALUE
argf_lines(int argc, VALUE *argv, VALUE argf)
{
rb_warn("ARGF#lines is deprecated; use #each_line instead");
if (!rb_block_given_p())
return rb_enumeratorize(argf, ID2SYM(rb_intern("each_line")), argc, argv);
return argf_each_line(argc, argv, argf);
}
|
- (String) filename - (String) path
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"
11114 11115 11116 11117 11118 11119 |
# File 'io.c', line 11114
static VALUE
argf_filename(VALUE argf)
{
next_argv();
return ARGF.filename;
}
|
- (Integer) tell - (Integer) pos
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
10417 10418 10419 10420 10421 10422 10423 10424 10425 |
# File 'io.c', line 10417
static VALUE
argf_tell(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to tell");
}
ARGF_FORWARD(0, 0);
return rb_io_tell(ARGF.current_file);
}
|
- (Integer) pos=(position)
Seeks to the position given by position (in bytes) in ARGF.
For example:
ARGF.pos = 17
ARGF.gets #=> "This is line two\n"
10455 10456 10457 10458 10459 10460 10461 10462 10463 |
# File 'io.c', line 10455
static VALUE
argf_set_pos(VALUE argf, VALUE offset)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to set position");
}
ARGF_FORWARD(1, &offset);
return rb_io_set_pos(ARGF.current_file, offset);
}
|
- (nil) print - (nil) print(obj, ...)
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 ($\</code>) is not <code>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.
6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 |
# File 'io.c', line 6652
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;
}
for (i=0; i<argc; i++) {
if (!NIL_P(rb_output_fs) && i>0) {
rb_io_write(out, rb_output_fs);
}
rb_io_write(out, argv[i]);
}
if (argc > 0 && !NIL_P(rb_output_rs)) {
rb_io_write(out, rb_output_rs);
}
return Qnil;
}
|
- (nil) printf(format_string[, obj, ...])
Formats and writes to ios, converting parameters under control of the format string. See Kernel#sprintf for details.
6593 6594 6595 6596 6597 6598 |
# File 'io.c', line 6593
VALUE
rb_io_printf(int argc, VALUE *argv, VALUE out)
{
rb_io_write(out, rb_f_sprintf(argc, argv));
return Qnil;
}
|
- (Object) putc(obj)
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
6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 |
# File 'io.c', line 6725
static VALUE
rb_io_putc(VALUE io, VALUE ch)
{
VALUE str;
if (RB_TYPE_P(ch, T_STRING)) {
str = rb_str_substr(ch, 0, 1);
}
else {
char c = NUM2CHR(ch);
str = rb_str_new(&c, 1);
}
rb_io_write(io, str);
return ch;
}
|
- (nil) puts(obj, ...)
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
6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 |
# File 'io.c', line 6817
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;
}
for (i=0; i<argc; i++) {
if (RB_TYPE_P(argv[i], T_STRING)) {
line = argv[i];
goto string;
}
if (rb_exec_recursive(io_puts_ary, argv[i], out)) {
continue;
}
line = rb_obj_as_string(argv[i]);
string:
rb_io_write(out, line);
if (RSTRING_LEN(line) == 0 ||
!str_end_with_asciichar(line, '\n')) {
rb_io_write(out, rb_default_rs);
}
}
return Qnil;
}
|
- (String?) read([length [, outbuf]])
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 outbuf argument is present, it must reference a String, which will receive the data. The outbuf will contain only the received data after the method call even if it is not empty at the beginning.
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.
10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 |
# File 'io.c', line 10599
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]);
}
if (!NIL_P(str)) {
StringValue(str);
rb_str_resize(str,0);
argv[1] = Qnil;
}
retry:
if (!next_argv()) {
return str;
}
if (ARGF_GENERIC_INPUT_P()) {
tmp = argf_forward(argc, argv, argf);
}
else {
tmp = io_read(argc, argv, ARGF.current_file);
}
if (NIL_P(str)) str = tmp;
else if (!NIL_P(tmp)) rb_str_append(str, tmp);
if (NIL_P(tmp) || NIL_P(length)) {
if (ARGF.next_p != -1) {
argf_close(ARGF.current_file);
ARGF.next_p = 1;
goto retry;
}
}
else if (argc >= 1) {
if (RSTRING_LEN(str) < len) {
len -= RSTRING_LEN(str);
argv[0] = INT2NUM(len);
goto retry;
}
}
return str;
}
|
- (String) read_nonblock(maxlen) - (Object) read_nonblock(maxlen, outbuf)
Reads at most maxlen bytes from the ARGF stream in non-blocking mode.
10705 10706 10707 10708 10709 |
# File 'io.c', line 10705
static VALUE
argf_read_nonblock(int argc, VALUE *argv, VALUE argf)
{
return argf_getpartial(argc, argv, argf, 1);
}
|
- (Fixnum) readbyte
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)
10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 |
# File 'io.c', line 10895
static VALUE
argf_readbyte(VALUE argf)
{
VALUE c;
NEXT_ARGF_FORWARD(0, 0);
c = argf_getbyte(argf);
if (NIL_P(c)) {
rb_eof_error();
}
return c;
}
|
- (String?) readchar
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)
10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 |
# File 'io.c', line 10855
static VALUE
argf_readchar(VALUE argf)
{
VALUE ch;
retry:
if (!next_argv()) rb_eof_error();
if (!RB_TYPE_P(ARGF.current_file, T_FILE)) {
ch = rb_funcall3(ARGF.current_file, rb_intern("getc"), 0, 0);
}
else {
ch = rb_io_getc(ARGF.current_file);
}
if (NIL_P(ch) && ARGF.next_p != -1) {
argf_close(ARGF.current_file);
ARGF.next_p = 1;
goto retry;
}
return ch;
}
|
- (String) readline(sep = $/) - (String) readline(limit) - (String) readline(sep, limit)
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.
7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 |
# File 'io.c', line 7911
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();
}
return line;
}
|
- (Array) readlines(sep = $/) - (Array) readlines(limit) - (Array) readlines(sep, limit)
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"
7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 |
# File 'io.c', line 7963
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);
}
else {
lines = rb_io_readlines(argc, argv, ARGF.current_file);
argf_close(ARGF.current_file);
}
ARGF.next_p = 1;
rb_ary_concat(ary, lines);
ARGF.lineno = lineno + RARRAY_LEN(ary);
ARGF.last_lineno = ARGF.lineno;
}
ARGF.init_p = 0;
return ary;
}
|
- (String) readpartial(maxlen) - (Object) readpartial(maxlen, outbuf)
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. The outbuf will contain only the received data after the method call even if it is not empty at the beginning. 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.
10691 10692 10693 10694 10695 |
# File 'io.c', line 10691
static VALUE
argf_readpartial(int argc, VALUE *argv, VALUE argf)
{
return argf_getpartial(argc, argv, argf, 0);
}
|
- (0) rewind
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"
10477 10478 10479 10480 10481 10482 10483 10484 10485 |
# File 'io.c', line 10477
static VALUE
argf_rewind(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to rewind");
}
ARGF_FORWARD(0, 0);
return rb_io_rewind(ARGF.current_file);
}
|
- (0) seek(amount, whence = IO::SEEK_SET)
Seeks to offset amount (an Integer) in the ARGF stream according to the value of whence. See IO#seek for further details.
10434 10435 10436 10437 10438 10439 10440 10441 10442 |
# File 'io.c', line 10434
static VALUE
argf_seek_m(int argc, VALUE *argv, VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to seek");
}
ARGF_FORWARD(argc, argv);
return rb_io_seek_m(argc, argv, ARGF.current_file);
}
|
- (Object) 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)
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.
10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 |
# File 'io.c', line 10391
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");
}
rb_io_set_encoding(argc, argv, ARGF.current_file);
GetOpenFile(ARGF.current_file, fptr);
ARGF.encs = fptr->encs;
return argf;
}
|
- (Object) skip
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"
11206 11207 11208 11209 11210 11211 11212 11213 11214 |
# File 'io.c', line 11206
static VALUE
argf_skip(VALUE argf)
{
if (ARGF.init_p && ARGF.next_p == 0) {
argf_close(ARGF.current_file);
ARGF.next_p = 1;
}
return argf;
}
|
- (Integer) tell - (Integer) pos
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
10417 10418 10419 10420 10421 10422 10423 10424 10425 |
# File 'io.c', line 10417
static VALUE
argf_tell(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream to tell");
}
ARGF_FORWARD(0, 0);
return rb_io_tell(ARGF.current_file);
}
|
- (Array) readlines(sep = $/) - (Array) readlines(limit) - (Array) readlines(sep, limit)
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"
7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 |
# File 'io.c', line 7963
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);
}
else {
lines = rb_io_readlines(argc, argv, ARGF.current_file);
argf_close(ARGF.current_file);
}
ARGF.next_p = 1;
rb_ary_concat(ary, lines);
ARGF.lineno = lineno + RARRAY_LEN(ary);
ARGF.last_lineno = ARGF.lineno;
}
ARGF.init_p = 0;
return ary;
}
|
- (Fixnum) fileno - (Fixnum) to_i
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
10497 10498 10499 10500 10501 10502 10503 10504 10505 |
# File 'io.c', line 10497
static VALUE
argf_fileno(VALUE argf)
{
if (!next_argv()) {
rb_raise(rb_eArgError, "no stream");
}
ARGF_FORWARD(0, 0);
return rb_io_fileno(ARGF.current_file);
}
|
- (Object) to_io
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>>
10519 10520 10521 10522 10523 10524 10525 |
# File 'io.c', line 10519
static VALUE
argf_to_io(VALUE argf)
{
next_argv();
ARGF_FORWARD(0, 0);
return ARGF.current_file;
}
|
- (String) to_s Also known as: inspect
Returns "ARGF".
11267 11268 11269 11270 11271 |
# File 'io.c', line 11267
static VALUE
argf_to_s(VALUE argf)
{
return rb_str_new2("ARGF");
}
|
- (IO) to_write_io
Returns IO instance tied to ARGF for writing if inplace mode is enabled.
11392 11393 11394 11395 11396 11397 11398 11399 |
# File 'io.c', line 11392
static VALUE
argf_write_io(VALUE argf)
{
if (!RTEST(ARGF.current_file)) {
rb_raise(rb_eIOError, "not opened for writing");
}
return GetWriteIO(ARGF.current_file);
}
|
- (Integer) write(string)
Writes string if inplace mode.
11407 11408 11409 11410 11411 |
# File 'io.c', line 11407
static VALUE
argf_write(VALUE argf, VALUE str)
{
return rb_io_write(argf_write_io(argf), str);
}
|