Spec-Zone.ru › Ruby 3

класс ARGF

Родитель:
Объект
Включенные модули:
Enumerable

ARGF — это поток, предназначенный для использования в скриптах, обрабатывающих файлы, переданные в качестве аргументов командной строки или через STDIN.

Аргументы, переданные вашему скрипту, хранятся в ARGV Array, по одному аргументу на элемент. ARGF предполагает, что любые аргументы, которые не являются именами файлов, были удалены из ARGV. Например:

$ ruby argf.rb --verbose file1 file2

ARGV  #=> ["--verbose", "file1", "file2"]
option = ARGV.shift #=> "--verbose"
ARGV  #=> ["file1", "file2"]

Теперь вы можете использовать ARGF для работы с объединением каждого из этих именованных файлов. Например, ARGF.read вернёт содержимое file1, за которым следует содержимое file2.

После того, как файл в ARGV был прочитан, ARGF удаляет его из Array. Таким образом, после чтения всех файлов ARGV будет пустым.

Вы можете самостоятельно манипулировать ARGV для управления тем, с чем ARGF работает. Если вы удалите файл из ARGV, он будет проигнорирован ARGF; если вы добавите файлы в ARGV, они будут обработаны так, как будто они были указаны в командной строке. Например:

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

Если ARGV пустой, ARGF ведет себя так, как если бы он содержал STDIN, то есть данные, перенаправленные в ваш скрипт. Например:

$ echo "glark" | ruby -e 'p ARGF.read'
"glark\n"

Публичные методы экземпляра

argv → ARGV Show source
static VALUE
argf_argv(VALUE argf)
{
    return ARGF.argv;
}

Возвращает массив ARGV, который содержит аргументы, переданные в ваш скрипт, по одному на элемент.

Например:

$ ruby argf.rb -v glark.txt

ARGF.argv   #=> ["-v", "glark.txt"]
binmode → ARGF Show source
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;
}

Переводит ARGF в бинарный режим. После того, как поток находится в бинарном режиме, его нельзя вернуть в небинарный режим. Этот параметр оказывает следующие эффекты:

  • Преобразование символов новой строки отключено.

  • Encoding преобразование отключено.

  • Контент обрабатывается как ASCII-8BIT.

binmode? → true or false Show source
static VALUE
argf_binmode_p(VALUE argf)
{
    return ARGF.binmode ? Qtrue : Qfalse;
}

Возвращает true, если ARGF читается в бинарном режиме; false в противном случае. Чтобы включить бинарный режим, используйте ARGF.binmode.

Например:

ARGF.binmode?  #=> false
ARGF.binmode
ARGF.binmode?  #=> true
close → ARGF Show source
static VALUE
argf_close_m(VALUE argf)
{
    next_argv();
    argf_close(argf);
    if (ARGF.next_p != -1) {
        ARGF.next_p = 1;
    }
    ARGF.lineno = 0;
    return argf;
}

Закрывает текущий файл и переходит к следующему файлу в ARGV. Если больше нет файлов для открытия, просто закрывает текущий файл. STDIN не будет закрыт.

Например:

$ ruby argf.rb foo bar

ARGF.filename  #=> "foo"
ARGF.close
ARGF.filename  #=> "bar"
ARGF.close
closed? → true or false Show source
static VALUE
argf_closed(VALUE argf)
{
    next_argv();
    ARGF_FORWARD(0, 0);
    return rb_io_closed(ARGF.current_file);
}

Возвращает true, если текущий файл закрыт; false в противном случае. Используйте ARGF.close для фактического закрытия текущего файла.

each(sep=$/) {|line| block } → ARGF Show source
each(sep=$/, limit) {|line| block } → ARGF
each(...) → an_enumerator
static VALUE
argf_each_line(int argc, VALUE *argv, VALUE argf)
{
    RETURN_ENUMERATOR(argf, argc, argv);
    FOREACH_ARGF() {
        argf_block_call_line(rb_intern("each_line"), argc, argv, argf);
    }
    return argf;
}

Возвращает перечислитель, который итерирует по каждой строке (разделенной на sep, который по умолчанию является символом новой строки вашей платформы) каждого файла в ARGV. Если указан блок, каждая строка будет последовательно передаваться в блок, в противном случае возвращается перечислитель. Необязательный аргумент limit является Integer, указывающим максимальную длину каждой строки; более длинные строки будут разделены в соответствии с этим ограничением.

Этот метод позволяет вам рассматривать файлы, указанные в командной строке, как один файл, состоящий из конкатенации каждого именованного файла. После того, как последняя строка первого файла будет возвращена, будет возвращена первая строка второго файла. Методы ARGF.filename и ARGF.lineno могут использоваться для определения имени файла текущей строки и номера строки всего ввода, соответственно.

Например, следующий код выводит каждую строку каждого именованного файла с префиксом номера строки, отображая имя файла один раз для каждого файла:

ARGF.each_line do |line|
  puts ARGF.filename if ARGF.file.lineno == 1
  puts "#{ARGF.file.lineno}: #{line}"
end

В то время как следующий код сначала выводит только имя первого файла, а содержимое с номером строки, посчитанным по всем именованным файлам.

ARGF.each_line do |line|
  puts ARGF.filename if ARGF.lineno == 1
  puts "#{ARGF.lineno}: #{line}"
end
Также имеет псевдоним: each_line
each_byte {|byte| block } → ARGF Show source
each_byte → an_enumerator
static VALUE
argf_each_byte(VALUE argf)
{
    RETURN_ENUMERATOR(argf, 0, 0);
    FOREACH_ARGF() {
        argf_block_call(rb_intern("each_byte"), 0, 0, argf);
    }
    return argf;
}

Итерирует по каждому байту каждого файла в ARGV. Байты возвращаются как Integer в диапазоне 0..255.

Этот метод позволяет вам рассматривать файлы, указанные в командной строке, как один файл, состоящий из конкатенации каждого именованного файла. После того, как последний байт первого файла будет возвращен, будет возвращен первый байт второго файла. Метод ARGF.filename может использоваться для определения имени файла текущего байта.

Если блок не указан, вместо этого возвращается перечислитель.

Например:

ARGF.bytes.to_a  #=> [35, 32, ... 95, 10]
each_char {|char| block } → ARGF Show source
each_char → an_enumerator
static VALUE
argf_each_char(VALUE argf)
{
    RETURN_ENUMERATOR(argf, 0, 0);
    FOREACH_ARGF() {
        argf_block_call(rb_intern("each_char"), 0, 0, argf);
    }
    return argf;
}

Итерирует по каждому символу каждого файла в ARGF.

Этот метод позволяет вам рассматривать файлы, указанные в командной строке, как один файл, состоящий из конкатенации каждого именованного файла. После того, как последний символ первого файла будет возвращен, будет возвращен первый символ второго файла. Метод ARGF.filename может использоваться для определения имени файла, в котором находится текущий символ.

Если блок не указан, вместо этого возвращается перечислитель.

each_codepoint {|codepoint| block } → ARGF Show source
each_codepoint → an_enumerator
static VALUE
argf_each_codepoint(VALUE argf)
{
    RETURN_ENUMERATOR(argf, 0, 0);
    FOREACH_ARGF() {
        argf_block_call(rb_intern("each_codepoint"), 0, 0, argf);
    }
    return argf;
}

Итерирует по каждой кодовой точке каждого файла в ARGF.

Этот метод позволяет вам рассматривать файлы, указанные в командной строке, как один файл, состоящий из конкатенации каждого именованного файла. После того, как последняя кодовая точка первого файла будет возвращена, будет возвращена первая кодовая точка второго файла. Метод ARGF.filename может использоваться для определения имени файла, в котором находится текущая кодовая точка.

Если блок не указан, вместо этого возвращается перечислитель.

Возвращает перечислитель, который итерирует по каждой строке (разделенной на sep, который по умолчанию является символом новой строки вашей платформы) каждого файла в ARGV. Если указан блок, каждая строка будет последовательно передаваться в блок, в противном случае возвращается перечислитель. Необязательный аргумент limit является Integer, указывающим максимальную длину каждой строки; более длинные строки будут разделены в соответствии с этим ограничением.

Этот метод позволяет вам рассматривать файлы, указанные в командной строке, как один файл, состоящий из конкатенации каждого именованного файла. После того, как последняя строка первого файла будет возвращена, будет возвращена первая строка второго файла. Методы ARGF.filename и ARGF.lineno могут использоваться для определения имени файла текущей строки и номера строки всего ввода, соответственно.

Например, следующий код выводит каждую строку каждого именованного файла с префиксом номера строки, отображая имя файла один раз для каждого файла:

ARGF.each_line do |line|
  puts ARGF.filename if ARGF.file.lineno == 1
  puts "#{ARGF.file.lineno}: #{line}"
end

В то время как следующий код сначала выводит только имя первого файла, а содержимое с номером строки, посчитанным по всем именованным файлам.

ARGF.each_line do |line|
  puts ARGF.filename if ARGF.lineno == 1
  puts "#{ARGF.lineno}: #{line}"
end
Псевдоним для: each
eof → true or false Show source
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;
}

Возвращает true, если текущий файл в ARGF находится в конце файла, т.е. у него нет данных для чтения. Поток должен быть открыт для чтения, иначе будет выброшено исключение IOError.

$ echo "eof" | ruby argf.rb

ARGF.eof?                 #=> false
3.times { ARGF.readchar }
ARGF.eof?                 #=> false
ARGF.readchar             #=> "\n"
ARGF.eof?                 #=> true
Также имеет псевдоним: eof?

Возвращает true, если текущий файл в ARGF находится в конце файла, т.е. у него нет данных для чтения. Поток должен быть открыт для чтения, иначе будет выброшено исключение IOError.

$ echo "eof" | ruby argf.rb

ARGF.eof?                 #=> false
3.times { ARGF.readchar }
ARGF.eof?                 #=> false
ARGF.readchar             #=> "\n"
ARGF.eof?                 #=> true
Псевдоним для: eof
external_encoding → encoding Show source
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));
}

Возвращает внешнюю кодировку для файлов, читаемых из ARGF, как объект Encoding. Внешняя кодировка — это кодировка текста, хранящегося в файле. Сравните с ARGF.internal_encoding, которая является кодировкой, используемой для представления этого текста в Ruby.

Чтобы установить внешнюю кодировку, используйте ARGF.set_encoding.

Например:

ARGF.external_encoding  #=>  #<Encoding:UTF-8>
file → IO or File object Show source
static VALUE
argf_file(VALUE argf)
{
    next_argv();
    return ARGF.current_file;
}

Возвращает текущий файл как объект IO или File. $stdin возвращается, когда текущий файл — это STDIN.

Например:

$ echo "foo" > foo
$ echo "bar" > bar

$ ruby argf.rb foo bar

ARGF.file      #=> #<File:foo>
ARGF.read(5)   #=> "foo\nb"
ARGF.file      #=> #<File:bar>
filename → Строка Показать исходный код
static VALUE
argf_filename(VALUE argf)
{
    next_argv();
    return ARGF.filename;
}

Возвращает текущее имя файла. «-» возвращается, когда текущий файл — STDIN.

Например:

$ 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"
Также алиасировано как: path
fileno → целое Показать исходный код
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);
}

Возвращает целое число, представляющее числовой дескриптор файла для текущего файла. Вызывает исключение ArgumentError, если текущего файла нет.

ARGF.fileno    #=> 3
Также алиасировано как: to_i
getbyte → Целое число или nil Показать исходный код
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);
        ARGF.next_p = 1;
        goto retry;
    }

    return ch;
}

Получает следующий 8-битный байт (0..255) из ARGF. Возвращает nil, если вызвана в конце потока.

Например:

$ echo "foo" > file
$ ruby argf.rb file

ARGF.getbyte #=> 102
ARGF.getbyte #=> 111
ARGF.getbyte #=> 111
ARGF.getbyte #=> 10
ARGF.getbyte #=> nil
getc → Строка или nil Показать исходный код
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);
        ARGF.next_p = 1;
        goto retry;
    }

    return ch;
}

Считывает следующий символ из ARGF и возвращает его как String. Возвращает nil в конце потока.

ARGF обрабатывает файлы, указанные в командной строке, как один файл, созданный путём конкатенации их содержимого. После возвращения последнего символа первого файла, возвращает первый символ второго файла и так далее.

Например:

$ 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
gets(sep=$/ [, getline_args]) → строка или nil Показать исходный код
gets(limit [, getline_args]) → строка или nil
gets(sep, limit [, getline_args]) → строка или nil
static VALUE
argf_gets(int argc, VALUE *argv, VALUE argf)
{
    VALUE line;

    line = argf_getline(argc, argv, argf);
    rb_lastline_set(line);

    return line;
}

Возвращает следующую строку из текущего файла в ARGF.

По умолчанию, строки предполагается разделены $/; чтобы использовать другой символ в качестве разделителя, передайте его как String для аргумента sep.

Необязательный аргумент limit задаёт количество символов каждой строки для возврата. По умолчанию возвращаются все символы.

См. IO.readlines для подробностей о getline_args.

inplace_mode → Строка Показать исходный код
static VALUE
argf_inplace_mode_get(VALUE argf)
{
    if (!ARGF.inplace) return Qnil;
    if (NIL_P(ARGF.inplace)) return rb_str_new(0, 0);
    return rb_str_dup(ARGF.inplace);
}

Возвращает расширение файла, добавляемое к именам изменённых файлов в режиме редактирования на месте. Это значение можно задать с помощью ARGF.inplace_mode= или передав переключатель -i в бинарник Ruby.

inplace_mode = ext → ARGF Показать исходный код
static VALUE
argf_inplace_mode_set(VALUE argf, VALUE val)
{
    if (!RTEST(val)) {
        ARGF.inplace = Qfalse;
    }
    else if (StringValueCStr(val), !RSTRING_LEN(val)) {
        ARGF.inplace = Qnil;
    }
    else {
        ARGF.inplace = rb_str_new_frozen(val);
    }
    return argf;
}

Задает расширение имени файла для режима редактирования на месте заданному String. Это значение добавляется к имени каждого редактируемого файла. Модифицированный файл сохраняется под этим новым именем.

Например:

$ ruby argf.rb file.txt

ARGF.inplace_mode = '.bak'
ARGF.each_line do |line|
  print line.sub("foo","bar")
end

Каждая строка в file.txt заменяет первое вхождение «foo» на «bar», затем новая строка записывается в file.txt.bak.

Возвращает «ARGF».

Псевдоним для: to_s
internal_encoding → кодировка Показать исходный код
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));
}

Возвращает внутреннюю кодировку для строк, считанных из ARGF в виде объекта Encoding.

Если ARGF.set_encoding был вызван с двумя именами кодировок, возвращается второе. В противном случае, если Encoding.default_external установлен, возвращается это значение. В противном случае, если в командной строке была указана внешняя кодировка по умолчанию, используется это значение. Если кодировка неизвестна, возвращается nil.

lineno → целое Показать исходный код
static VALUE
argf_lineno(VALUE argf)
{
    return INT2FIX(ARGF.lineno);
}

Возвращает текущий номер строки объекта ARGF в целом. Это значение можно установить вручную с помощью ARGF.lineno=.

Например:

ARGF.lineno   #=> 0
ARGF.readline #=> "This is line 1\n"
ARGF.lineno   #=> 1
lineno = целое → целое Показать исходный код
static VALUE
argf_set_lineno(VALUE argf, VALUE val)
{
    ARGF.lineno = NUM2INT(val);
    ARGF.last_lineno = ARGF.lineno;
    return Qnil;
}

Устанавливает номер строки объекта ARGF в целом на заданное Integer.

ARGF автоматически устанавливает номер строки при чтении данных, поэтому обычно вам не нужно устанавливать его явно. Чтобы получить текущий номер строки, используйте ARGF.lineno.

Например:

ARGF.lineno      #=> 0
ARGF.readline    #=> "This is line 1\n"
ARGF.lineno      #=> 1
ARGF.lineno = 0  #=> 0
ARGF.lineno      #=> 0
path → Строка

Возвращает текущее имя файла. «-» возвращается, когда текущий файл — STDIN.

Например:

$ 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"
Псевдоним для: filename
pos → Целое число

Возвращает текущее смещение (в байтах) текущего файла в ARGF.

ARGF.pos    #=> 0
ARGF.gets   #=> "This is line one\n"
ARGF.pos    #=> 17
Псевдоним для: tell
pos = position → Целое число Показать исходный код
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);
}

Перемещает указатель на позицию, заданную position (в байтах) в ARGF.

Например:

ARGF.pos = 17
ARGF.gets   #=> "This is line two\n"
print → nil
print(obj, ...) → nil
Показать исходный код
VALUE
rb_io_print(int argc, const VALUE *argv, VALUE out)
{
    int i;
    VALUE line;

    /* if no argument given, print `$_' */
    if (argc == 0) {
        argc = 1;
        line = rb_lastline_get();
        argv = &line;
    }
    if (argc > 1 && !NIL_P(rb_output_fs)) {
        rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "$, is set to non-nil value");
    }
    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;
}

Записывает указанные объекты в ios. Возвращает nil.

Поток должен быть открыт для записи. Каждый объект, не являющийся строкой, преобразуется путём вызова его метода to_s. Когда вызывается без аргументов, выводит содержимое $_.

Если разделитель вывода ($,) не nil, он вставляется между объектами. Если разделитель записи ($\) не nil, он добавляется в вывод.

$stdout.print("This is ", 100, " percent.\n")

вывод:

This is 100 percent.
printf(format_string [, obj, ...]) → nil Показать исходный код
VALUE
rb_io_printf(int argc, const VALUE *argv, VALUE out)
{
    rb_io_write(out, rb_f_sprintf(argc, argv));
    return Qnil;
}

Форматирует и записывает в ios, преобразуя параметры под управлением строки формата. См. Kernel#sprintf для подробностей.

putc(obj) → obj Показать исходный код
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;
}

Если obj — Numeric, записывает символ, код которого — наименее значимый байт obj. Если obj — String, записывает первый символ obj в ios. В противном случае, вызывается исключение TypeError.

$stdout.putc "A"
$stdout.putc 65

вывод:

AA
puts(obj, ...) → nil Показать исходный код
VALUE
rb_io_puts(int argc, const VALUE *argv, VALUE out)
{
    int i, n;
    VALUE line, args[2];

    /* 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:
        n = 0;
        args[n++] = line;
        if (RSTRING_LEN(line) == 0 ||
            !rb_str_end_with_asciichar(line, '\n')) {
            args[n++] = rb_default_rs;
        }
        rb_io_writev(out, n, args);
    }

    return Qnil;
}

Записывает указанные объекты в ios. Записывает символ новой строки после любых, которые не заканчиваются последовательностью новой строки. Возвращает nil.

Поток должен быть открыт для записи. Если вызывается с аргументом массива, записывает каждый элемент на новой строке. Каждый объект, не являющийся строкой или массивом, преобразуется путём вызова его метода to_s. Если вызывается без аргументов, выводит единственную новую строку.

$stdout.puts("this", "is", ["a", "test"])

вывод:

this
is
a
test

Обратите внимание, что puts всегда использует новые строки и не зависит от разделителя записей ($\).

read([length [, outbuf]]) → строка, outbuf или nil Показать исходный код
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);
            ARGF.next_p = 1;
            goto retry;
        }
    }
    else if (argc >= 1) {
        long slen = RSTRING_LEN(str);
        if (slen < len) {
            len -= slen;
            argv[0] = LONG2NUM(len);
            goto retry;
        }
    }
    return str;
}

Читает length байтов из ARGF. Файлы, указанные в командной строке, конкатенируются и обрабатываются этим методом как один файл, поэтому при вызове без аргументов содержимое этого псевдофайла возвращается целиком.

length должен быть неотрицательным целым числом или nil.

Если length — положительное целое число, read пытается прочитать length байтов без преобразования (в двоичном режиме). Возвращает nil, если EOF встретился до того, как что-либо можно было прочитать. Возвращается меньше, чем length байт, если во время чтения встретился EOF. В случае целого числа length полученная строка всегда имеет кодировку ASCII-8BIT.

Если length опущено или равно nil, оно читает до EOF и применяет преобразование кодировки, если применимо. Строка возвращается, даже если EOF встречен до чтения каких-либо данных.

Если length равно нулю, возвращается пустая строка ("").

Если присутствует необязательный аргумент outbuf, он должен ссылаться на String, который получит данные. outbuf будет содержать только полученные данные после вызова метода, даже если он не пустой в начале.

Например:

$ 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)   #=> ""

Обратите внимание, что этот метод ведет себя как функция fread() в C. Это означает, что он повторно пытается вызвать системные вызовы read(2) для чтения данных с указанной длиной. Если вам нужен результат, как при одном системном вызове read(2), рассмотрите ARGF#readpartial или ARGF#read_nonblock.

read_nonblock(maxlen[, options]) → строка Показать исходный код
read_nonblock(maxlen, outbuf[, options]) → outbuf
static VALUE
argf_read_nonblock(int argc, VALUE *argv, VALUE argf)
{
    VALUE opts;

    rb_scan_args(argc, argv, "11:", NULL, NULL, &opts);

    if (!NIL_P(opts))
        argc--;

    return argf_getpartial(argc, argv, argf, opts, 1);
}

Читает не более maxlen байтов из потока ARGF в режиме без блокировки.

readbyte → Целое число Показать исходный код
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;
}

Читает следующий 8-битный байт из ARGF и возвращает его как Integer. Поднимает EOFError после чтения последнего байта последнего файла.

Например:

$ 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)
readchar → Строка или nil Показать исходный код
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);
        ARGF.next_p = 1;
        goto retry;
    }

    return ch;
}

Читает следующий символ из ARGF и возвращает его как String. Поднимает EOFError после чтения последнего символа последнего файла.

Например:

$ 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)
readline(sep=$/) → строка Показать исходный код
readline(limit) → строка
readline(sep, limit) → строка
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;
}

Возвращает следующую строку из текущего файла в ARGF.

По умолчанию строки предполагаются разделенными $/; чтобы использовать другой символ в качестве разделителя, передайте его в качестве String для аргумента sep.

Необязательный аргумент limit определяет количество символов каждой строки, которые нужно вернуть. По умолчанию возвращаются все символы.

При достижении конца файла поднимается EOFError.

readlines(sep=$/) → массив Показать исходный код
readlines(limit) → массив
readlines(sep, limit) → массив
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);
        }
        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;
}

Читает весь текущий файл ARGF, возвращая Array его строк, по одной строке на элемент. Строки предполагаются разделенными sep.

lines = ARGF.readlines
lines[0]                #=> "This is line one\n"
Также алиасировано как: to_a
readpartial(maxlen) → строка Показать исходный код
readpartial(maxlen, outbuf) → outbuf
static VALUE
argf_readpartial(int argc, VALUE *argv, VALUE argf)
{
    return argf_getpartial(argc, argv, argf, Qnil, 0);
}

Читает не более maxlen байтов из потока ARGF.

Если необязательный аргумент outbuf присутствует, он должен ссылаться на String, который получит данные. outbuf будет содержать только полученные данные после вызова метода, даже если он не пустой в начале.

Выбрасывает EOFError в конце потока ARGF. Так как поток ARGF является конкатенацией нескольких файлов, внутри EOF происходит для каждого файла. ARGF.readpartial возвращает пустые строки для EOF, кроме последнего, и поднимает EOFError для последнего.

rewind → 0 Показать исходный код
static VALUE
argf_rewind(VALUE argf)
{
    VALUE ret;
    int old_lineno;

    if (!next_argv()) {
        rb_raise(rb_eArgError, "no stream to rewind");
    }
    ARGF_FORWARD(0, 0);
    old_lineno = RFILE(ARGF.current_file)->fptr->lineno;
    ret = rb_io_rewind(ARGF.current_file);
    if (!global_argf_p(argf)) {
        ARGF.last_lineno = ARGF.lineno -= old_lineno;
    }
    return ret;
}

Перемещает текущий файл в начало входных данных, сбрасывая ARGF.lineno в ноль.

ARGF.readline   #=> "This is line one\n"
ARGF.rewind     #=> 0
ARGF.lineno     #=> 0
ARGF.readline   #=> "This is line one\n"
seek(amount, whence=IO::SEEK_SET) → 0 Показать исходный код
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);
}

Перемещает указатель на смещение amount (целое число) в потоке ARGF в соответствии со значением whence. Смотрите IO#seek для получения дополнительной информации.

set_encoding(ext_enc) → ARGF Показать исходный код
set_encoding("ext_enc:int_enc") → ARGF
set_encoding(ext_enc, int_enc) → ARGF
set_encoding("ext_enc:int_enc", opt) → ARGF
set_encoding(ext_enc, int_enc, opt) → ARGF
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;
}

Если указан единственный аргумент, строки, считанные из ARGF, помечаются указанной кодировкой.

Если заданы два имени кодировок, разделенные двоеточием, например «ascii:utf-8», строка считывается из первой кодировки (внешняя кодировка) и преобразуется во вторую кодировку (внутренняя кодировка), затем помечается второй кодировкой.

Если заданы два аргумента, они должны быть объектами кодировки или именами кодировок. Снова, первый указывает внешнюю кодировку, второй указывает внутреннюю кодировку.

Если указаны внешняя и внутренняя кодировки, необязательный аргумент Hash может быть использован для настройки процесса преобразования. Структура этого хэша описана в документации String#encode.

Например:

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.
skip → ARGF Показать исходный код
static VALUE
argf_skip(VALUE argf)
{
    if (ARGF.init_p && ARGF.next_p == 0) {
        argf_close(argf);
        ARGF.next_p = 1;
    }
    return argf;
}

Переключает текущий файл на следующий файл в ARGV. Если больше нет файлов, то действие не происходит.

Например:

$ ruby argf.rb foo bar
ARGF.filename  #=> "foo"
ARGF.skip
ARGF.filename  #=> "bar"
tell → Целое число Показать исходный код
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);
}

Возвращает текущее смещение (в байтах) текущего файла в ARGF.

ARGF.pos    #=> 0
ARGF.gets   #=> "This is line one\n"
ARGF.pos    #=> 17
Также алиасировано как: pos
to_a(sep=$/) → массив
to_a(limit) → массив
to_a(sep, limit) → массив

Читает весь текущий файл ARGF, возвращая Array его строк, по одной строке на элемент. Строки предполагаются разделенными sep.

lines = ARGF.readlines
lines[0]                #=> "This is line one\n"
Псевдоним для: readlines
to_i → целое число

Возвращает целое число, представляющее числовой дескриптор файла для текущего файла. Вызывает исключение ArgumentError, если текущего файла нет.

ARGF.fileno    #=> 3
Псевдоним для: fileno
to_io → IO Показать исходный код
static VALUE
argf_to_io(VALUE argf)
{
    next_argv();
    ARGF_FORWARD(0, 0);
    return ARGF.current_file;
}

Возвращает объект IO, представляющий текущий файл. Будет объектом File, если текущий файл не является потоком, например, STDIN.

Например:

ARGF.to_io    #=> #<File:glark.txt>
ARGF.to_io    #=> #<IO:<STDIN>>
to_s → Строка Показать исходный код
static VALUE
argf_to_s(VALUE argf)
{
    return rb_str_new2("ARGF");
}

Возвращает “ARGF”.

Также используется как: inspect
to_write_io → io Показать исходный код
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);
}

Возвращает экземпляр IO, связанный с ARGF для записи, если включен режим inplace.

write(строка) → целое число Показать исходный код
static VALUE
argf_write(VALUE argf, VALUE str)
{
    return rb_io_write(argf_write_io(argf), str);
}

Записывает строку, если включен режим inplace.

Ruby Core © 1993–2020 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API