rbs 3.0.0.dev.2 → 3.0.0.dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +2 -1
- data/.github/workflows/ruby.yml +4 -0
- data/Gemfile.lock +11 -11
- data/Rakefile +2 -2
- data/Steepfile +1 -1
- data/core/array.rbs +573 -423
- data/core/basic_object.rbs +11 -39
- data/core/binding.rbs +1 -1
- data/core/builtin.rbs +8 -0
- data/core/class.rbs +37 -0
- data/core/comparable.rbs +7 -18
- data/core/complex.rbs +2 -2
- data/core/data.rbs +419 -0
- data/core/dir.rbs +52 -104
- data/core/encoding.rbs +22 -181
- data/core/enumerable.rbs +212 -175
- data/core/enumerator/product.rbs +96 -0
- data/core/enumerator.rbs +57 -8
- data/core/errors.rbs +8 -2
- data/core/exception.rbs +41 -0
- data/core/fiber.rbs +95 -12
- data/core/file.rbs +840 -275
- data/core/file_test.rbs +34 -19
- data/core/float.rbs +40 -96
- data/core/gc.rbs +15 -3
- data/core/hash.rbs +113 -175
- data/core/integer.rbs +85 -145
- data/core/io/buffer.rbs +187 -60
- data/core/io/wait.rbs +28 -16
- data/core/io.rbs +1859 -1389
- data/core/kernel.rbs +525 -961
- data/core/match_data.rbs +306 -142
- data/core/math.rbs +506 -234
- data/core/method.rbs +0 -24
- data/core/module.rbs +110 -17
- data/core/nil_class.rbs +2 -0
- data/core/numeric.rbs +76 -144
- data/core/object.rbs +88 -212
- data/core/proc.rbs +17 -5
- data/core/process.rbs +22 -5
- data/core/ractor.rbs +1 -1
- data/core/random.rbs +20 -3
- data/core/range.rbs +91 -89
- data/core/rational.rbs +2 -3
- data/core/rbs/unnamed/argf.rbs +177 -120
- data/core/rbs/unnamed/env_class.rbs +89 -163
- data/core/rbs/unnamed/random.rbs +36 -12
- data/core/refinement.rbs +8 -0
- data/core/regexp.rbs +462 -272
- data/core/ruby_vm.rbs +210 -0
- data/{stdlib/set/0 → core}/set.rbs +43 -47
- data/core/string.rbs +1403 -1332
- data/core/string_io.rbs +191 -107
- data/core/struct.rbs +67 -63
- data/core/symbol.rbs +187 -201
- data/core/thread.rbs +40 -35
- data/core/time.rbs +902 -826
- data/core/trace_point.rbs +55 -6
- data/core/unbound_method.rbs +48 -24
- data/docs/collection.md +4 -0
- data/docs/syntax.md +55 -0
- data/ext/rbs_extension/parser.c +5 -6
- data/lib/rbs/cli.rb +6 -1
- data/lib/rbs/collection/cleaner.rb +8 -1
- data/lib/rbs/collection/config/lockfile.rb +3 -1
- data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
- data/lib/rbs/collection/config.rb +1 -1
- data/lib/rbs/collection/sources/git.rb +9 -2
- data/lib/rbs/collection/sources/local.rb +79 -0
- data/lib/rbs/collection/sources.rb +8 -1
- data/lib/rbs/environment.rb +6 -5
- data/lib/rbs/environment_loader.rb +3 -2
- data/lib/rbs/errors.rb +18 -0
- data/lib/rbs/locator.rb +26 -7
- data/lib/rbs/sorter.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/sig/collection/sources.rbs +32 -3
- data/sig/environment.rbs +2 -3
- data/sig/locator.rbs +14 -2
- data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
- data/stdlib/cgi/0/core.rbs +16 -0
- data/stdlib/coverage/0/coverage.rbs +50 -8
- data/stdlib/csv/0/csv.rbs +1 -1
- data/stdlib/date/0/date.rbs +856 -726
- data/stdlib/date/0/date_time.rbs +83 -210
- data/stdlib/erb/0/erb.rbs +13 -36
- data/stdlib/etc/0/etc.rbs +127 -20
- data/stdlib/fileutils/0/fileutils.rbs +1290 -381
- data/stdlib/logger/0/logger.rbs +466 -316
- data/stdlib/net-http/0/net-http.rbs +2211 -534
- data/stdlib/nkf/0/nkf.rbs +5 -5
- data/stdlib/objspace/0/objspace.rbs +31 -14
- data/stdlib/openssl/0/openssl.rbs +11 -7
- data/stdlib/optparse/0/optparse.rbs +20 -17
- data/stdlib/pathname/0/pathname.rbs +21 -4
- data/stdlib/pstore/0/pstore.rbs +378 -154
- data/stdlib/pty/0/pty.rbs +24 -8
- data/stdlib/ripper/0/ripper.rbs +1650 -0
- data/stdlib/socket/0/addrinfo.rbs +9 -15
- data/stdlib/socket/0/socket.rbs +36 -3
- data/stdlib/strscan/0/string_scanner.rbs +7 -5
- data/stdlib/tempfile/0/tempfile.rbs +104 -44
- data/stdlib/time/0/time.rbs +2 -2
- data/stdlib/uri/0/file.rbs +5 -0
- data/stdlib/uri/0/generic.rbs +2 -2
- data/stdlib/yaml/0/yaml.rbs +2 -2
- data/stdlib/zlib/0/zlib.rbs +1 -1
- metadata +8 -6
- data/core/deprecated.rbs +0 -9
- data/sig/shims/ripper.rbs +0 -8
data/core/io.rbs
CHANGED
|
@@ -1,230 +1,94 @@
|
|
|
1
1
|
# <!-- rdoc-file=io.c -->
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
2
|
+
# An instance of class IO (commonly called a *stream*) represents an
|
|
3
|
+
# input/output stream in the underlying operating system. Class IO is the basis
|
|
4
|
+
# for input and output in Ruby.
|
|
5
5
|
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
# The Kernel#open method can create an IO (or File) object for these types of
|
|
11
|
-
# arguments:
|
|
12
|
-
#
|
|
13
|
-
# * A plain string represents a filename suitable for the underlying operating
|
|
14
|
-
# system.
|
|
15
|
-
#
|
|
16
|
-
# * A string starting with `"|"` indicates a subprocess. The remainder of the
|
|
17
|
-
# string following the `"|"` is invoked as a process with appropriate
|
|
18
|
-
# input/output channels connected to it.
|
|
19
|
-
#
|
|
20
|
-
# * A string equal to `"|-"` will create another Ruby instance as a
|
|
21
|
-
# subprocess.
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
# The IO may be opened with different file modes (read-only, write-only) and
|
|
25
|
-
# encodings for proper conversion. See IO.new for these options. See
|
|
26
|
-
# Kernel#open for details of the various command formats described above.
|
|
27
|
-
#
|
|
28
|
-
# IO.popen, the Open3 library, or Process#spawn may also be used to communicate
|
|
29
|
-
# with subprocesses through an IO.
|
|
30
|
-
#
|
|
31
|
-
# Ruby will convert pathnames between different operating system conventions if
|
|
32
|
-
# possible. For instance, on a Windows system the filename
|
|
33
|
-
# `"/gumby/ruby/test.rb"` will be opened as `"\gumby\ruby\test.rb"`. When
|
|
34
|
-
# specifying a Windows-style filename in a Ruby string, remember to escape the
|
|
35
|
-
# backslashes:
|
|
36
|
-
#
|
|
37
|
-
# "C:\\gumby\\ruby\\test.rb"
|
|
38
|
-
#
|
|
39
|
-
# Our examples here will use the Unix-style forward slashes; File::ALT_SEPARATOR
|
|
40
|
-
# can be used to get the platform-specific separator character.
|
|
6
|
+
# Class File is the only class in the Ruby core that is a subclass of IO. Some
|
|
7
|
+
# classes in the Ruby standard library are also subclasses of IO; these include
|
|
8
|
+
# TCPSocket and UDPSocket.
|
|
41
9
|
#
|
|
42
10
|
# The global constant ARGF (also accessible as `$<`) provides an IO-like stream
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
# access the name of the file currently being read.
|
|
46
|
-
#
|
|
47
|
-
# ## io/console
|
|
48
|
-
#
|
|
49
|
-
# The io/console extension provides methods for interacting with the console.
|
|
50
|
-
# The console can be accessed from IO.console or the standard input/output/error
|
|
51
|
-
# IO objects.
|
|
52
|
-
#
|
|
53
|
-
# Requiring io/console adds the following methods:
|
|
54
|
-
#
|
|
55
|
-
# * IO::console
|
|
56
|
-
# * IO#raw
|
|
57
|
-
# * IO#raw!
|
|
58
|
-
# * IO#cooked
|
|
59
|
-
# * IO#cooked!
|
|
60
|
-
# * IO#getch
|
|
61
|
-
# * IO#echo=
|
|
62
|
-
# * IO#echo?
|
|
63
|
-
# * IO#noecho
|
|
64
|
-
# * IO#winsize
|
|
65
|
-
# * IO#winsize=
|
|
66
|
-
# * IO#iflush
|
|
67
|
-
# * IO#ioflush
|
|
68
|
-
# * IO#oflush
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
# Example:
|
|
72
|
-
#
|
|
73
|
-
# require 'io/console'
|
|
74
|
-
# rows, columns = $stdout.winsize
|
|
75
|
-
# puts "Your screen is #{columns} wide and #{rows} tall"
|
|
76
|
-
#
|
|
77
|
-
# ## Example Files
|
|
78
|
-
#
|
|
79
|
-
# Many examples here use these filenames and their corresponding files:
|
|
80
|
-
#
|
|
81
|
-
# * `t.txt`: A text-only file that is assumed to exist via:
|
|
82
|
-
#
|
|
83
|
-
# text = <<~EOT
|
|
84
|
-
# This is line one.
|
|
85
|
-
# This is the second line.
|
|
86
|
-
# This is the third line.
|
|
87
|
-
# EOT
|
|
88
|
-
# File.write('t.txt', text)
|
|
89
|
-
#
|
|
90
|
-
# * `t.dat`: A data file that is assumed to exist via:
|
|
91
|
-
#
|
|
92
|
-
# data = "\u9990\u9991\u9992\u9993\u9994"
|
|
93
|
-
# f = File.open('t.dat', 'wb:UTF-16')
|
|
94
|
-
# f.write(data)
|
|
95
|
-
# f.close
|
|
11
|
+
# that allows access to all file paths found in ARGV (or found in STDIN if ARGV
|
|
12
|
+
# is empty). ARGF is not itself a subclass of IO.
|
|
96
13
|
#
|
|
97
|
-
#
|
|
14
|
+
# Class StringIO provides an IO-like stream that handles a String. StringIO is
|
|
15
|
+
# not itself a subclass of IO.
|
|
98
16
|
#
|
|
99
|
-
#
|
|
17
|
+
# Important objects based on IO include:
|
|
100
18
|
#
|
|
101
|
-
# *
|
|
19
|
+
# * $stdin.
|
|
20
|
+
# * $stdout.
|
|
21
|
+
# * $stderr.
|
|
22
|
+
# * Instances of class File.
|
|
102
23
|
#
|
|
103
24
|
#
|
|
104
|
-
#
|
|
25
|
+
# An instance of IO may be created using:
|
|
105
26
|
#
|
|
106
|
-
#
|
|
107
|
-
#
|
|
27
|
+
# * IO.new: returns a new IO object for the given integer file descriptor.
|
|
28
|
+
# * IO.open: passes a new IO object to the given block.
|
|
29
|
+
# * IO.popen: returns a new IO object that is connected to the $stdin and
|
|
30
|
+
# $stdout of a newly-launched subprocess.
|
|
31
|
+
# * Kernel#open: Returns a new IO object connected to a given source: stream,
|
|
32
|
+
# file, or subprocess.
|
|
108
33
|
#
|
|
109
|
-
# * Whether the stream is to be read-only, write-only, or read-write.
|
|
110
|
-
# * Whether the stream is positioned at its beginning or its end.
|
|
111
|
-
# * Whether the stream treats data as text-only or binary.
|
|
112
|
-
# * The external and internal encodings.
|
|
113
34
|
#
|
|
35
|
+
# Like a File stream, an IO stream has:
|
|
114
36
|
#
|
|
115
|
-
#
|
|
37
|
+
# * A read/write mode, which may be read-only, write-only, or read/write; see
|
|
38
|
+
# [Read/Write Mode](rdoc-ref:File@Read-2FWrite+Mode).
|
|
39
|
+
# * A data mode, which may be text-only or binary; see [Data
|
|
40
|
+
# Mode](rdoc-ref:File@Data+Mode).
|
|
41
|
+
# * Internal and external encodings; see [Encodings](rdoc-ref:File@Encodings).
|
|
116
42
|
#
|
|
117
|
-
# When `mode` is an integer it must be one or more (combined by bitwise OR (`|`)
|
|
118
|
-
# of the modes defined in File::Constants:
|
|
119
43
|
#
|
|
120
|
-
#
|
|
121
|
-
# * `File::WRONLY`: Open for writing only.
|
|
122
|
-
# * `File::RDWR`: Open for reading and writing.
|
|
123
|
-
# * `File::APPEND`: Open for appending only.
|
|
124
|
-
# * `File::CREAT`: Create file if it does not exist.
|
|
125
|
-
# * `File::EXCL`: Raise an exception if `File::CREAT` is given and the file
|
|
126
|
-
# exists.
|
|
44
|
+
# And like other IO streams, it has:
|
|
127
45
|
#
|
|
46
|
+
# * A position, which determines where in the stream the next read or write is
|
|
47
|
+
# to occur; see [Position](rdoc-ref:IO@Position).
|
|
48
|
+
# * A line number, which is a special, line-oriented, "position" (different
|
|
49
|
+
# from the position mentioned above); see [Line
|
|
50
|
+
# Number](rdoc-ref:IO@Line+Number).
|
|
128
51
|
#
|
|
129
|
-
# Examples:
|
|
130
52
|
#
|
|
131
|
-
#
|
|
132
|
-
# File.new('t.tmp', File::RDWR | File::CREAT | File::EXCL)
|
|
53
|
+
# ## Extension `io/console`
|
|
133
54
|
#
|
|
134
|
-
#
|
|
135
|
-
#
|
|
55
|
+
# Extension `io/console` provides numerous methods for interacting with the
|
|
56
|
+
# console; requiring it adds numerous methods to class IO.
|
|
136
57
|
#
|
|
137
|
-
#
|
|
138
|
-
#
|
|
139
|
-
# When `mode` is a string it must begin with one of the following:
|
|
140
|
-
#
|
|
141
|
-
# * `'r'`: Read-only stream, positioned at the beginning; the stream cannot be
|
|
142
|
-
# changed to writable.
|
|
143
|
-
# * `'w'`: Write-only stream, positioned at the beginning; the stream cannot
|
|
144
|
-
# be changed to readable.
|
|
145
|
-
# * `'a'`: Write-only stream, positioned at the end; every write appends to
|
|
146
|
-
# the end; the stream cannot be changed to readable.
|
|
147
|
-
# * `'r+'`: Read-write stream, positioned at the beginning.
|
|
148
|
-
# * `'w+'`: Read-write stream, positioned at the end.
|
|
149
|
-
# * `'a+'`: Read-write stream, positioned at the end.
|
|
150
|
-
#
|
|
151
|
-
#
|
|
152
|
-
# For a writable file stream (that is, any except read-only), the file is
|
|
153
|
-
# truncated to zero if it exists, and is created if it does not exist.
|
|
154
|
-
#
|
|
155
|
-
# Examples:
|
|
156
|
-
#
|
|
157
|
-
# File.open('t.txt', 'r')
|
|
158
|
-
# File.open('t.tmp', 'w')
|
|
159
|
-
#
|
|
160
|
-
# Either of the following may be suffixed to any of the above:
|
|
161
|
-
#
|
|
162
|
-
# * `'t'`: Text data; sets the default external encoding to `Encoding::UTF_8`;
|
|
163
|
-
# on Windows, enables conversion between EOL and CRLF.
|
|
164
|
-
# * `'b'`: Binary data; sets the default external encoding to
|
|
165
|
-
# `Encoding::ASCII_8BIT`; on Windows, suppresses conversion between EOL and
|
|
166
|
-
# CRLF.
|
|
167
|
-
#
|
|
168
|
-
#
|
|
169
|
-
# If neither is given, the stream defaults to text data.
|
|
170
|
-
#
|
|
171
|
-
# Examples:
|
|
172
|
-
#
|
|
173
|
-
# File.open('t.txt', 'rt')
|
|
174
|
-
# File.open('t.dat', 'rb')
|
|
175
|
-
#
|
|
176
|
-
# The following may be suffixed to any writable mode above:
|
|
177
|
-
#
|
|
178
|
-
# * `'x'`: Creates the file if it does not exist; raises an exception if the
|
|
179
|
-
# file exists.
|
|
180
|
-
#
|
|
181
|
-
#
|
|
182
|
-
# Example:
|
|
183
|
-
#
|
|
184
|
-
# File.open('t.tmp', 'wx')
|
|
185
|
-
#
|
|
186
|
-
# Finally, the mode string may specify encodings -- either external encoding
|
|
187
|
-
# only or both external and internal encodings -- by appending one or both
|
|
188
|
-
# encoding names, separated by colons:
|
|
58
|
+
# ## Example Files
|
|
189
59
|
#
|
|
190
|
-
#
|
|
191
|
-
# f.external_encoding # => #<Encoding:ASCII-8BIT>
|
|
192
|
-
# f.internal_encoding # => nil
|
|
193
|
-
# f = File.new('t.dat', 'rb:UTF-16')
|
|
194
|
-
# f.external_encoding # => #<Encoding:UTF-16 (dummy)>
|
|
195
|
-
# f.internal_encoding # => nil
|
|
196
|
-
# f = File.new('t.dat', 'rb:UTF-16:UTF-16')
|
|
197
|
-
# f.external_encoding # => #<Encoding:UTF-16 (dummy)>
|
|
198
|
-
# f.internal_encoding # => #<Encoding:UTF-16>
|
|
60
|
+
# Many examples here use these variables:
|
|
199
61
|
#
|
|
200
|
-
#
|
|
62
|
+
# # English text with newlines.
|
|
63
|
+
# text = <<~EOT
|
|
64
|
+
# First line
|
|
65
|
+
# Second line
|
|
201
66
|
#
|
|
202
|
-
#
|
|
203
|
-
#
|
|
67
|
+
# Fourth line
|
|
68
|
+
# Fifth line
|
|
69
|
+
# EOT
|
|
204
70
|
#
|
|
205
|
-
#
|
|
71
|
+
# # Russian text.
|
|
72
|
+
# russian = "\u{442 435 441 442}" # => "тест"
|
|
206
73
|
#
|
|
207
|
-
#
|
|
208
|
-
#
|
|
74
|
+
# # Binary data.
|
|
75
|
+
# data = "\u9990\u9991\u9992\u9993\u9994"
|
|
209
76
|
#
|
|
210
|
-
#
|
|
211
|
-
#
|
|
212
|
-
# internal to external encoding. For further details about transcoding input and
|
|
213
|
-
# output, see Encoding.
|
|
77
|
+
# # Text file.
|
|
78
|
+
# File.write('t.txt', text)
|
|
214
79
|
#
|
|
215
|
-
#
|
|
216
|
-
#
|
|
217
|
-
# determine the encoding. For UTF-16 encodings the file open mode must be
|
|
218
|
-
# binary. If the BOM is found, it is stripped and the external encoding from the
|
|
219
|
-
# BOM is used.
|
|
80
|
+
# # File with Russian text.
|
|
81
|
+
# File.write('t.rus', russian)
|
|
220
82
|
#
|
|
221
|
-
#
|
|
222
|
-
#
|
|
83
|
+
# # File with binary data.
|
|
84
|
+
# f = File.new('t.dat', 'wb:UTF-16')
|
|
85
|
+
# f.write(data)
|
|
86
|
+
# f.close
|
|
223
87
|
#
|
|
224
88
|
# ## Open Options
|
|
225
89
|
#
|
|
226
|
-
# A number of IO methods accept
|
|
227
|
-
#
|
|
90
|
+
# A number of IO methods accept optional keyword arguments that determine how a
|
|
91
|
+
# new stream is to be opened:
|
|
228
92
|
#
|
|
229
93
|
# * `:mode`: Stream mode.
|
|
230
94
|
# * `:flags`: Integer file open flags; If `mode` is also given, the two are
|
|
@@ -241,430 +105,520 @@
|
|
|
241
105
|
# otherwise.
|
|
242
106
|
# * `:autoclose`: If a truthy value, specifies that the `fd` will close when
|
|
243
107
|
# the stream closes; otherwise it remains open.
|
|
108
|
+
# * `:path:` If a string value is provided, it is used in #inspect and is
|
|
109
|
+
# available as #path method.
|
|
244
110
|
#
|
|
245
111
|
#
|
|
246
112
|
# Also available are the options offered in String#encode, which may control
|
|
247
113
|
# conversion between external internal encoding.
|
|
248
114
|
#
|
|
249
|
-
# ##
|
|
115
|
+
# ## Basic IO
|
|
250
116
|
#
|
|
251
|
-
#
|
|
252
|
-
#
|
|
117
|
+
# You can perform basic stream IO with these methods, which typically operate on
|
|
118
|
+
# multi-byte strings:
|
|
253
119
|
#
|
|
254
|
-
# *
|
|
120
|
+
# * IO#read: Reads and returns some or all of the remaining bytes from the
|
|
121
|
+
# stream.
|
|
122
|
+
# * IO#write: Writes zero or more strings to the stream; each given object
|
|
123
|
+
# that is not already a string is converted via `to_s`.
|
|
255
124
|
#
|
|
256
125
|
#
|
|
257
|
-
#
|
|
126
|
+
# ### Position
|
|
258
127
|
#
|
|
259
|
-
# An IO stream has a *position*, which is the
|
|
260
|
-
#
|
|
128
|
+
# An IO stream has a nonnegative integer *position*, which is the byte offset at
|
|
129
|
+
# which the next read or write is to occur. A new stream has position zero (and
|
|
130
|
+
# line number zero); method `rewind` resets the position (and line number) to
|
|
131
|
+
# zero.
|
|
261
132
|
#
|
|
262
|
-
#
|
|
263
|
-
# position is `n` (*bytes*) may not have `n` *characters* preceding the current
|
|
264
|
-
# position -- there may be fewer.
|
|
133
|
+
# The relevant methods:
|
|
265
134
|
#
|
|
266
|
-
#
|
|
135
|
+
# * IO#tell (aliased as `#pos`): Returns the current position (in bytes) in
|
|
136
|
+
# the stream.
|
|
137
|
+
# * IO#pos=: Sets the position of the stream to a given integer `new_position`
|
|
138
|
+
# (in bytes).
|
|
139
|
+
# * IO#seek: Sets the position of the stream to a given integer `offset` (in
|
|
140
|
+
# bytes), relative to a given position `whence` (indicating the beginning,
|
|
141
|
+
# end, or current position).
|
|
142
|
+
# * IO#rewind: Positions the stream at the beginning (also resetting the line
|
|
143
|
+
# number).
|
|
267
144
|
#
|
|
268
|
-
# * At the beginning (position `0`) if its mode is `'r'`, `'w'`, or `'r+'`.
|
|
269
|
-
# * At the end (position `self.size`) if its mode is `'a'`, `'w+'`, or `'a+'`.
|
|
270
145
|
#
|
|
146
|
+
# ### Open and Closed Streams
|
|
271
147
|
#
|
|
272
|
-
#
|
|
148
|
+
# A new IO stream may be open for reading, open for writing, or both.
|
|
273
149
|
#
|
|
274
|
-
#
|
|
275
|
-
# * IO#eof? and its alias IO#eof return whether the position is at the end of
|
|
276
|
-
# a readable stream.
|
|
150
|
+
# A stream is automatically closed when claimed by the garbage collector.
|
|
277
151
|
#
|
|
152
|
+
# Attempted reading or writing on a closed stream raises an exception.
|
|
278
153
|
#
|
|
279
|
-
#
|
|
154
|
+
# The relevant methods:
|
|
280
155
|
#
|
|
281
|
-
#
|
|
282
|
-
#
|
|
283
|
-
#
|
|
284
|
-
#
|
|
285
|
-
# f.readline # => "This is the second line.\n"
|
|
286
|
-
# f.tell # => 45
|
|
287
|
-
# f.eof? # => false
|
|
288
|
-
# f.readline # => "Here's the third line.\n"
|
|
289
|
-
# f.eof? # => true
|
|
156
|
+
# * IO#close: Closes the stream for both reading and writing.
|
|
157
|
+
# * IO#close_read: Closes the stream for reading.
|
|
158
|
+
# * IO#close_write: Closes the stream for writing.
|
|
159
|
+
# * IO#closed?: Returns whether the stream is closed.
|
|
290
160
|
#
|
|
291
|
-
# Writing to a stream usually changes its position:
|
|
292
161
|
#
|
|
293
|
-
#
|
|
294
|
-
# f.tell # => 0
|
|
295
|
-
# f.write('foo') # => 3
|
|
296
|
-
# f.tell # => 3
|
|
297
|
-
# f.write('bar') # => 3
|
|
298
|
-
# f.tell # => 6
|
|
162
|
+
# ### End-of-Stream
|
|
299
163
|
#
|
|
300
|
-
#
|
|
164
|
+
# You can query whether a stream is positioned at its end:
|
|
301
165
|
#
|
|
302
|
-
#
|
|
303
|
-
#
|
|
304
|
-
# p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
|
|
305
|
-
# end
|
|
166
|
+
# * IO#eof? (also aliased as `#eof`): Returns whether the stream is at
|
|
167
|
+
# end-of-stream.
|
|
306
168
|
#
|
|
307
|
-
# Output:
|
|
308
169
|
#
|
|
309
|
-
#
|
|
310
|
-
# "position=45 eof?=false line=This is the second line.\n"
|
|
311
|
-
# "position=70 eof?=true line=This is the third line.\n"
|
|
170
|
+
# You can reposition to end-of-stream by using method IO#seek:
|
|
312
171
|
#
|
|
313
|
-
#
|
|
172
|
+
# f = File.new('t.txt')
|
|
173
|
+
# f.eof? # => false
|
|
174
|
+
# f.seek(0, :END)
|
|
175
|
+
# f.eof? # => true
|
|
176
|
+
# f.close
|
|
314
177
|
#
|
|
315
|
-
#
|
|
316
|
-
# * IO#rewind changes the position to the beginning.
|
|
178
|
+
# Or by reading all stream content (which is slower than using IO#seek):
|
|
317
179
|
#
|
|
180
|
+
# f.rewind
|
|
181
|
+
# f.eof? # => false
|
|
182
|
+
# f.read # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
183
|
+
# f.eof? # => true
|
|
318
184
|
#
|
|
319
|
-
# ## Line
|
|
185
|
+
# ## Line IO
|
|
320
186
|
#
|
|
321
|
-
#
|
|
322
|
-
# line number in the stream where the next read will occur.
|
|
187
|
+
# You can read an IO stream line-by-line using these methods:
|
|
323
188
|
#
|
|
324
|
-
#
|
|
189
|
+
# * IO#each_line: Reads each remaining line, passing it to the given block.
|
|
190
|
+
# * IO#gets: Returns the next line.
|
|
191
|
+
# * IO#readline: Like #gets, but raises an exception at end-of-stream.
|
|
192
|
+
# * IO#readlines: Returns all remaining lines in an array.
|
|
325
193
|
#
|
|
326
|
-
# Method IO#lineno returns the line number.
|
|
327
194
|
#
|
|
328
|
-
#
|
|
195
|
+
# Each of these reader methods accepts:
|
|
329
196
|
#
|
|
330
|
-
#
|
|
331
|
-
#
|
|
332
|
-
#
|
|
333
|
-
#
|
|
334
|
-
# f.readline # => "This is the second line.\n"
|
|
335
|
-
# f.lineno # => 2
|
|
336
|
-
# f.readline # => "Here's the third line.\n"
|
|
337
|
-
# f.lineno # => 3
|
|
338
|
-
# f.eof? # => true
|
|
197
|
+
# * An optional line separator, `sep`; see [Line
|
|
198
|
+
# Separator](rdoc-ref:IO@Line+Separator).
|
|
199
|
+
# * An optional line-size limit, `limit`; see [Line
|
|
200
|
+
# Limit](rdoc-ref:IO@Line+Limit).
|
|
339
201
|
#
|
|
340
|
-
# Iterating over lines in a stream usually changes its line number:
|
|
341
202
|
#
|
|
342
|
-
#
|
|
343
|
-
#
|
|
344
|
-
# p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
|
|
345
|
-
# end
|
|
203
|
+
# For each of these reader methods, reading may begin mid-line, depending on the
|
|
204
|
+
# stream's position; see [Position](rdoc-ref:IO@Position):
|
|
346
205
|
#
|
|
347
|
-
#
|
|
206
|
+
# f = File.new('t.txt')
|
|
207
|
+
# f.pos = 27
|
|
208
|
+
# f.each_line {|line| p line }
|
|
209
|
+
# f.close
|
|
348
210
|
#
|
|
349
|
-
#
|
|
350
|
-
# "position=45 eof?=false line=This is the second line.\n"
|
|
351
|
-
# "position=70 eof?=true line=This is the third line.\n"
|
|
352
|
-
#
|
|
353
|
-
# ## What's Here
|
|
211
|
+
# Output:
|
|
354
212
|
#
|
|
355
|
-
#
|
|
213
|
+
# "rth line\n"
|
|
214
|
+
# "Fifth line\n"
|
|
356
215
|
#
|
|
357
|
-
#
|
|
358
|
-
# Object](Object.html#class-Object-label-What-27s+Here).
|
|
359
|
-
# * Includes [module
|
|
360
|
-
# Enumerable](Enumerable.html#module-Enumerable-label-What-27s+Here), which
|
|
361
|
-
# provides dozens of additional methods.
|
|
216
|
+
# You can write to an IO stream line-by-line using this method:
|
|
362
217
|
#
|
|
218
|
+
# * IO#puts: Writes objects to the stream.
|
|
363
219
|
#
|
|
364
|
-
# Here, class IO provides methods that are useful for:
|
|
365
220
|
#
|
|
366
|
-
#
|
|
367
|
-
# * [Reading](#class-IO-label-Reading)
|
|
368
|
-
# * [Writing](#class-IO-label-Writing)
|
|
369
|
-
# * [Positioning](#class-IO-label-Positioning)
|
|
370
|
-
# * [Iterating](#class-IO-label-Iterating)
|
|
371
|
-
# * [Settings](#class-IO-label-Settings)
|
|
372
|
-
# * [Querying](#class-IO-label-Querying)
|
|
373
|
-
# * [Buffering](#class-IO-label-Buffering)
|
|
374
|
-
# * [Low-Level Access](#class-IO-label-Low-Level+Access)
|
|
375
|
-
# * [Other](#class-IO-label-Other)
|
|
221
|
+
# ### Line Separator
|
|
376
222
|
#
|
|
223
|
+
# Each of these methods uses a *line separator*, which is the string that
|
|
224
|
+
# delimits lines:
|
|
377
225
|
#
|
|
378
|
-
#
|
|
226
|
+
# * IO.foreach.
|
|
227
|
+
# * IO.readlines.
|
|
228
|
+
# * IO#each_line.
|
|
229
|
+
# * IO#gets.
|
|
230
|
+
# * IO#readline.
|
|
231
|
+
# * IO#readlines.
|
|
379
232
|
#
|
|
380
|
-
# ::new (aliased as ::for_fd)
|
|
381
|
-
# : Creates and returns a new IO object for the given integer file
|
|
382
|
-
# descriptor.
|
|
383
233
|
#
|
|
384
|
-
#
|
|
385
|
-
#
|
|
234
|
+
# The default line separator is the given by the global variable `$/`, whose
|
|
235
|
+
# value is by default `"\n"`. The line to be read next is all data from the
|
|
236
|
+
# current position to the next line separator:
|
|
386
237
|
#
|
|
387
|
-
#
|
|
388
|
-
#
|
|
238
|
+
# f = File.new('t.txt')
|
|
239
|
+
# f.gets # => "First line\n"
|
|
240
|
+
# f.gets # => "Second line\n"
|
|
241
|
+
# f.gets # => "\n"
|
|
242
|
+
# f.gets # => "Fourth line\n"
|
|
243
|
+
# f.gets # => "Fifth line\n"
|
|
244
|
+
# f.close
|
|
389
245
|
#
|
|
390
|
-
#
|
|
391
|
-
# : Creates an IO object to interact with a subprocess.
|
|
246
|
+
# You can specify a different line separator:
|
|
392
247
|
#
|
|
393
|
-
#
|
|
394
|
-
#
|
|
248
|
+
# f = File.new('t.txt')
|
|
249
|
+
# f.gets('l') # => "First l"
|
|
250
|
+
# f.gets('li') # => "ine\nSecond li"
|
|
251
|
+
# f.gets('lin') # => "ne\n\nFourth lin"
|
|
252
|
+
# f.gets # => "e\n"
|
|
253
|
+
# f.close
|
|
395
254
|
#
|
|
396
|
-
#
|
|
255
|
+
# There are two special line separators:
|
|
397
256
|
#
|
|
257
|
+
# * `nil`: The entire stream is read into a single string:
|
|
398
258
|
#
|
|
399
|
-
#
|
|
259
|
+
# f = File.new('t.txt')
|
|
260
|
+
# f.gets(nil) # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
261
|
+
# f.close
|
|
400
262
|
#
|
|
401
|
-
#
|
|
402
|
-
#
|
|
403
|
-
# file.
|
|
263
|
+
# * `''` (the empty string): The next "paragraph" is read (paragraphs being
|
|
264
|
+
# separated by two consecutive line separators):
|
|
404
265
|
#
|
|
405
|
-
#
|
|
406
|
-
#
|
|
266
|
+
# f = File.new('t.txt')
|
|
267
|
+
# f.gets('') # => "First line\nSecond line\n\n"
|
|
268
|
+
# f.gets('') # => "Fourth line\nFifth line\n"
|
|
269
|
+
# f.close
|
|
407
270
|
#
|
|
408
|
-
# ::readlines
|
|
409
|
-
# : Returns an array of strings, which are the lines from the given file.
|
|
410
271
|
#
|
|
411
|
-
#
|
|
412
|
-
# : Returns the next 8-bit byte read from `self` as an integer.
|
|
272
|
+
# ### Line Limit
|
|
413
273
|
#
|
|
414
|
-
#
|
|
415
|
-
#
|
|
274
|
+
# Each of these methods uses a *line limit*, which specifies that the number of
|
|
275
|
+
# bytes returned may not be (much) longer than the given `limit`;
|
|
416
276
|
#
|
|
417
|
-
#
|
|
418
|
-
#
|
|
277
|
+
# * IO.foreach.
|
|
278
|
+
# * IO.readlines.
|
|
279
|
+
# * IO#each_line.
|
|
280
|
+
# * IO#gets.
|
|
281
|
+
# * IO#readline.
|
|
282
|
+
# * IO#readlines.
|
|
419
283
|
#
|
|
420
|
-
# #pread
|
|
421
|
-
# : Returns all or the next *n* bytes read from `self`, not updating the
|
|
422
|
-
# receiver's offset.
|
|
423
284
|
#
|
|
424
|
-
#
|
|
425
|
-
#
|
|
426
|
-
# given *n*.
|
|
285
|
+
# A multi-byte character will not be split, and so a line may be slightly longer
|
|
286
|
+
# than the given limit.
|
|
427
287
|
#
|
|
428
|
-
#
|
|
429
|
-
# : the next *n* bytes read from `self` for a given *n*, in non-block
|
|
430
|
-
# mode.
|
|
288
|
+
# If `limit` is not given, the line is determined only by `sep`.
|
|
431
289
|
#
|
|
432
|
-
# #
|
|
433
|
-
#
|
|
434
|
-
#
|
|
290
|
+
# # Text with 1-byte characters.
|
|
291
|
+
# File.open('t.txt') {|f| f.gets(1) } # => "F"
|
|
292
|
+
# File.open('t.txt') {|f| f.gets(2) } # => "Fi"
|
|
293
|
+
# File.open('t.txt') {|f| f.gets(3) } # => "Fir"
|
|
294
|
+
# File.open('t.txt') {|f| f.gets(4) } # => "Firs"
|
|
295
|
+
# # No more than one line.
|
|
296
|
+
# File.open('t.txt') {|f| f.gets(10) } # => "First line"
|
|
297
|
+
# File.open('t.txt') {|f| f.gets(11) } # => "First line\n"
|
|
298
|
+
# File.open('t.txt') {|f| f.gets(12) } # => "First line\n"
|
|
435
299
|
#
|
|
436
|
-
# #
|
|
437
|
-
#
|
|
438
|
-
#
|
|
300
|
+
# # Text with 2-byte characters, which will not be split.
|
|
301
|
+
# File.open('t.rus') {|f| f.gets(1).size } # => 1
|
|
302
|
+
# File.open('t.rus') {|f| f.gets(2).size } # => 1
|
|
303
|
+
# File.open('t.rus') {|f| f.gets(3).size } # => 2
|
|
304
|
+
# File.open('t.rus') {|f| f.gets(4).size } # => 2
|
|
439
305
|
#
|
|
440
|
-
#
|
|
441
|
-
# : Returns the next line read from `self`; same as #getline, but raises
|
|
442
|
-
# an exception of end-of-file.
|
|
306
|
+
# ### Line Separator and Line Limit
|
|
443
307
|
#
|
|
444
|
-
#
|
|
445
|
-
# : Returns an array of all lines read read from `self`.
|
|
308
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
|
446
309
|
#
|
|
447
|
-
#
|
|
448
|
-
#
|
|
310
|
+
# * Returns the next line as determined by line separator `sep`.
|
|
311
|
+
# * But returns no more bytes than are allowed by the limit.
|
|
449
312
|
#
|
|
450
313
|
#
|
|
314
|
+
# Example:
|
|
451
315
|
#
|
|
452
|
-
#
|
|
316
|
+
# File.open('t.txt') {|f| f.gets('li', 20) } # => "First li"
|
|
317
|
+
# File.open('t.txt') {|f| f.gets('li', 2) } # => "Fi"
|
|
453
318
|
#
|
|
454
|
-
#
|
|
455
|
-
# : Writes the given string to the file at the given filepath, in binary
|
|
456
|
-
# mode.
|
|
319
|
+
# ### Line Number
|
|
457
320
|
#
|
|
458
|
-
#
|
|
459
|
-
# : Writes the given string to `self`.
|
|
321
|
+
# A readable IO stream has a non-negative integer *line number*.
|
|
460
322
|
#
|
|
461
|
-
#
|
|
462
|
-
# : Appends the given string to `self`.
|
|
323
|
+
# The relevant methods:
|
|
463
324
|
#
|
|
464
|
-
#
|
|
465
|
-
#
|
|
325
|
+
# * IO#lineno: Returns the line number.
|
|
326
|
+
# * IO#lineno=: Resets and returns the line number.
|
|
466
327
|
#
|
|
467
|
-
# #printf
|
|
468
|
-
# : Writes to `self` based on the given format string and objects.
|
|
469
328
|
#
|
|
470
|
-
#
|
|
471
|
-
#
|
|
329
|
+
# Unless modified by a call to method IO#lineno=, the line number is the number
|
|
330
|
+
# of lines read by certain line-oriented methods, according to the given line
|
|
331
|
+
# separator `sep`:
|
|
472
332
|
#
|
|
473
|
-
#
|
|
474
|
-
# :
|
|
333
|
+
# * IO.foreach: Increments the line number on each call to the block.
|
|
334
|
+
# * IO#each_line: Increments the line number on each call to the block.
|
|
335
|
+
# * IO#gets: Increments the line number.
|
|
336
|
+
# * IO#readline: Increments the line number.
|
|
337
|
+
# * IO#readlines: Increments the line number for each line read.
|
|
475
338
|
#
|
|
476
|
-
# #pwrite
|
|
477
|
-
# : Writes the given string at the given offset, not updating the
|
|
478
|
-
# receiver's offset.
|
|
479
339
|
#
|
|
480
|
-
#
|
|
481
|
-
#
|
|
340
|
+
# A new stream is initially has line number zero (and position zero); method
|
|
341
|
+
# `rewind` resets the line number (and position) to zero:
|
|
482
342
|
#
|
|
483
|
-
#
|
|
484
|
-
#
|
|
343
|
+
# f = File.new('t.txt')
|
|
344
|
+
# f.lineno # => 0
|
|
345
|
+
# f.gets # => "First line\n"
|
|
346
|
+
# f.lineno # => 1
|
|
347
|
+
# f.rewind
|
|
348
|
+
# f.lineno # => 0
|
|
349
|
+
# f.close
|
|
485
350
|
#
|
|
351
|
+
# Reading lines from a stream usually changes its line number:
|
|
486
352
|
#
|
|
353
|
+
# f = File.new('t.txt', 'r')
|
|
354
|
+
# f.lineno # => 0
|
|
355
|
+
# f.readline # => "This is line one.\n"
|
|
356
|
+
# f.lineno # => 1
|
|
357
|
+
# f.readline # => "This is the second line.\n"
|
|
358
|
+
# f.lineno # => 2
|
|
359
|
+
# f.readline # => "Here's the third line.\n"
|
|
360
|
+
# f.lineno # => 3
|
|
361
|
+
# f.eof? # => true
|
|
362
|
+
# f.close
|
|
487
363
|
#
|
|
488
|
-
#
|
|
364
|
+
# Iterating over lines in a stream usually changes its line number:
|
|
489
365
|
#
|
|
490
|
-
#
|
|
491
|
-
#
|
|
366
|
+
# File.open('t.txt') do |f|
|
|
367
|
+
# f.each_line do |line|
|
|
368
|
+
# p "position=#{f.pos} eof?=#{f.eof?} lineno=#{f.lineno}"
|
|
369
|
+
# end
|
|
370
|
+
# end
|
|
492
371
|
#
|
|
493
|
-
#
|
|
494
|
-
# : Sets the line number is `self`.
|
|
372
|
+
# Output:
|
|
495
373
|
#
|
|
496
|
-
#
|
|
497
|
-
#
|
|
374
|
+
# "position=11 eof?=false lineno=1"
|
|
375
|
+
# "position=23 eof?=false lineno=2"
|
|
376
|
+
# "position=24 eof?=false lineno=3"
|
|
377
|
+
# "position=36 eof?=false lineno=4"
|
|
378
|
+
# "position=47 eof?=true lineno=5"
|
|
498
379
|
#
|
|
499
|
-
#
|
|
500
|
-
#
|
|
380
|
+
# Unlike the stream's [position](rdoc-ref:IO@Position), the line number does not
|
|
381
|
+
# affect where the next read or write will occur:
|
|
501
382
|
#
|
|
502
|
-
#
|
|
503
|
-
#
|
|
383
|
+
# f = File.new('t.txt')
|
|
384
|
+
# f.lineno = 1000
|
|
385
|
+
# f.lineno # => 1000
|
|
386
|
+
# f.gets # => "First line\n"
|
|
387
|
+
# f.lineno # => 1001
|
|
388
|
+
# f.close
|
|
504
389
|
#
|
|
505
|
-
#
|
|
506
|
-
# : Positions `self` to the beginning of input.
|
|
390
|
+
# Associated with the line number is the global variable `$.`:
|
|
507
391
|
#
|
|
508
|
-
#
|
|
509
|
-
#
|
|
392
|
+
# * When a stream is opened, `$.` is not set; its value is left over from
|
|
393
|
+
# previous activity in the process:
|
|
510
394
|
#
|
|
395
|
+
# $. = 41
|
|
396
|
+
# f = File.new('t.txt')
|
|
397
|
+
# $. = 41
|
|
398
|
+
# # => 41
|
|
399
|
+
# f.close
|
|
511
400
|
#
|
|
401
|
+
# * When a stream is read, `#.` is set to the line number for that stream:
|
|
402
|
+
#
|
|
403
|
+
# f0 = File.new('t.txt')
|
|
404
|
+
# f1 = File.new('t.dat')
|
|
405
|
+
# f0.readlines # => ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
|
406
|
+
# $. # => 5
|
|
407
|
+
# f1.readlines # => ["\xFE\xFF\x99\x90\x99\x91\x99\x92\x99\x93\x99\x94"]
|
|
408
|
+
# $. # => 1
|
|
409
|
+
# f0.close
|
|
410
|
+
# f1.close
|
|
411
|
+
#
|
|
412
|
+
# * Methods IO#rewind and IO#seek do not affect `$.`:
|
|
413
|
+
#
|
|
414
|
+
# f = File.new('t.txt')
|
|
415
|
+
# f.readlines # => ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
|
416
|
+
# $. # => 5
|
|
417
|
+
# f.rewind
|
|
418
|
+
# f.seek(0, :SET)
|
|
419
|
+
# $. # => 5
|
|
420
|
+
# f.close
|
|
512
421
|
#
|
|
513
|
-
# ### Iterating
|
|
514
422
|
#
|
|
515
|
-
#
|
|
516
|
-
# : Yields each line of given file to the block.
|
|
423
|
+
# ## Character IO
|
|
517
424
|
#
|
|
518
|
-
#
|
|
519
|
-
# : Calls the given block with each successive line in `self`.
|
|
425
|
+
# You can process an IO stream character-by-character using these methods:
|
|
520
426
|
#
|
|
521
|
-
#
|
|
522
|
-
# :
|
|
523
|
-
#
|
|
427
|
+
# * IO#getc: Reads and returns the next character from the stream.
|
|
428
|
+
# * IO#readchar: Like #getc, but raises an exception at end-of-stream.
|
|
429
|
+
# * IO#ungetc: Pushes back ("unshifts") a character or integer onto the
|
|
430
|
+
# stream.
|
|
431
|
+
# * IO#putc: Writes a character to the stream.
|
|
432
|
+
# * IO#each_char: Reads each remaining character in the stream, passing the
|
|
433
|
+
# character to the given block.
|
|
524
434
|
#
|
|
525
|
-
#
|
|
526
|
-
# : Calls the given block with each successive character in `self` as a
|
|
527
|
-
# string.
|
|
435
|
+
# ## Byte IO
|
|
528
436
|
#
|
|
529
|
-
#
|
|
530
|
-
# : Calls the given block with each successive codepoint in `self` as an
|
|
531
|
-
# integer.
|
|
437
|
+
# You can process an IO stream byte-by-byte using these methods:
|
|
532
438
|
#
|
|
439
|
+
# * IO#getbyte: Returns the next 8-bit byte as an integer in range 0..255.
|
|
440
|
+
# * IO#readbyte: Like #getbyte, but raises an exception if at end-of-stream.
|
|
441
|
+
# * IO#ungetbyte: Pushes back ("unshifts") a byte back onto the stream.
|
|
442
|
+
# * IO#each_byte: Reads each remaining byte in the stream, passing the byte to
|
|
443
|
+
# the given block.
|
|
533
444
|
#
|
|
534
445
|
#
|
|
535
|
-
#
|
|
446
|
+
# ## Codepoint IO
|
|
536
447
|
#
|
|
537
|
-
#
|
|
538
|
-
# : Sets whether `self` auto-closes.
|
|
448
|
+
# You can process an IO stream codepoint-by-codepoint:
|
|
539
449
|
#
|
|
540
|
-
#
|
|
541
|
-
#
|
|
450
|
+
# * IO#each_codepoint: Reads each remaining codepoint, passing it to the given
|
|
451
|
+
# block.
|
|
542
452
|
#
|
|
543
|
-
# #close
|
|
544
|
-
# : Closes `self`.
|
|
545
453
|
#
|
|
546
|
-
#
|
|
547
|
-
# : Sets the close-on-exec flag.
|
|
454
|
+
# ## What's Here
|
|
548
455
|
#
|
|
549
|
-
#
|
|
550
|
-
# : Closes `self` for reading.
|
|
456
|
+
# First, what's elsewhere. Class IO:
|
|
551
457
|
#
|
|
552
|
-
#
|
|
553
|
-
#
|
|
458
|
+
# * Inherits from [class Object](rdoc-ref:Object@What-27s+Here).
|
|
459
|
+
# * Includes [module Enumerable](rdoc-ref:Enumerable@What-27s+Here), which
|
|
460
|
+
# provides dozens of additional methods.
|
|
554
461
|
#
|
|
555
|
-
# #set_encoding
|
|
556
|
-
# : Sets the encoding for `self`.
|
|
557
462
|
#
|
|
558
|
-
#
|
|
559
|
-
# : Sets the encoding for `self`, based on its Unicode byte-order-mark.
|
|
463
|
+
# Here, class IO provides methods that are useful for:
|
|
560
464
|
#
|
|
561
|
-
#
|
|
562
|
-
# :
|
|
465
|
+
# * [Creating](rdoc-ref:IO@Creating)
|
|
466
|
+
# * [Reading](rdoc-ref:IO@Reading)
|
|
467
|
+
# * [Writing](rdoc-ref:IO@Writing)
|
|
468
|
+
# * [Positioning](rdoc-ref:IO@Positioning)
|
|
469
|
+
# * [Iterating](rdoc-ref:IO@Iterating)
|
|
470
|
+
# * [Settings](rdoc-ref:IO@Settings)
|
|
471
|
+
# * [Querying](rdoc-ref:IO@Querying)
|
|
472
|
+
# * [Buffering](rdoc-ref:IO@Buffering)
|
|
473
|
+
# * [Low-Level Access](rdoc-ref:IO@Low-Level+Access)
|
|
474
|
+
# * [Other](rdoc-ref:IO@Other)
|
|
563
475
|
#
|
|
564
476
|
#
|
|
477
|
+
# ### Creating
|
|
565
478
|
#
|
|
566
|
-
#
|
|
479
|
+
# * ::new (aliased as ::for_fd): Creates and returns a new IO object for the
|
|
480
|
+
# given integer file descriptor.
|
|
481
|
+
# * ::open: Creates a new IO object.
|
|
482
|
+
# * ::pipe: Creates a connected pair of reader and writer IO objects.
|
|
483
|
+
# * ::popen: Creates an IO object to interact with a subprocess.
|
|
484
|
+
# * ::select: Selects which given IO instances are ready for reading, writing,
|
|
485
|
+
# or have pending exceptions.
|
|
567
486
|
#
|
|
568
|
-
# #autoclose?
|
|
569
|
-
# : Returns whether `self` auto-closes.
|
|
570
487
|
#
|
|
571
|
-
#
|
|
572
|
-
# : Returns whether `self` is in binary mode.
|
|
488
|
+
# ### Reading
|
|
573
489
|
#
|
|
574
|
-
#
|
|
575
|
-
#
|
|
490
|
+
# * ::binread: Returns a binary string with all or a subset of bytes from the
|
|
491
|
+
# given file.
|
|
492
|
+
# * ::read: Returns a string with all or a subset of bytes from the given
|
|
493
|
+
# file.
|
|
494
|
+
# * ::readlines: Returns an array of strings, which are the lines from the
|
|
495
|
+
# given file.
|
|
496
|
+
# * #getbyte: Returns the next 8-bit byte read from `self` as an integer.
|
|
497
|
+
# * #getc: Returns the next character read from `self` as a string.
|
|
498
|
+
# * #gets: Returns the line read from `self`.
|
|
499
|
+
# * #pread: Returns all or the next *n* bytes read from `self`, not updating
|
|
500
|
+
# the receiver's offset.
|
|
501
|
+
# * #read: Returns all remaining or the next *n* bytes read from `self` for a
|
|
502
|
+
# given *n*.
|
|
503
|
+
# * #read_nonblock: the next *n* bytes read from `self` for a given *n*, in
|
|
504
|
+
# non-block mode.
|
|
505
|
+
# * #readbyte: Returns the next byte read from `self`; same as #getbyte, but
|
|
506
|
+
# raises an exception on end-of-stream.
|
|
507
|
+
# * #readchar: Returns the next character read from `self`; same as #getc, but
|
|
508
|
+
# raises an exception on end-of-stream.
|
|
509
|
+
# * #readline: Returns the next line read from `self`; same as #getline, but
|
|
510
|
+
# raises an exception of end-of-stream.
|
|
511
|
+
# * #readlines: Returns an array of all lines read read from `self`.
|
|
512
|
+
# * #readpartial: Returns up to the given number of bytes from `self`.
|
|
576
513
|
#
|
|
577
|
-
# #closed?
|
|
578
|
-
# : Returns whether `self` is closed.
|
|
579
514
|
#
|
|
580
|
-
#
|
|
581
|
-
# : Returns whether `self` is at end-of-file.
|
|
515
|
+
# ### Writing
|
|
582
516
|
#
|
|
583
|
-
#
|
|
584
|
-
#
|
|
517
|
+
# * ::binwrite: Writes the given string to the file at the given filepath, in
|
|
518
|
+
# binary mode.
|
|
519
|
+
# * ::write: Writes the given string to `self`.
|
|
520
|
+
# * #<<: Appends the given string to `self`.
|
|
521
|
+
# * #print: Prints last read line or given objects to `self`.
|
|
522
|
+
# * #printf: Writes to `self` based on the given format string and objects.
|
|
523
|
+
# * #putc: Writes a character to `self`.
|
|
524
|
+
# * #puts: Writes lines to `self`, making sure line ends with a newline.
|
|
525
|
+
# * #pwrite: Writes the given string at the given offset, not updating the
|
|
526
|
+
# receiver's offset.
|
|
527
|
+
# * #write: Writes one or more given strings to `self`.
|
|
528
|
+
# * #write_nonblock: Writes one or more given strings to `self` in
|
|
529
|
+
# non-blocking mode.
|
|
585
530
|
#
|
|
586
|
-
# #fileno (aliased as #to_i)
|
|
587
|
-
# : Returns the integer file descriptor for `self`
|
|
588
531
|
#
|
|
589
|
-
#
|
|
590
|
-
# : Returns the internal encoding object for `self`.
|
|
532
|
+
# ### Positioning
|
|
591
533
|
#
|
|
592
|
-
#
|
|
593
|
-
#
|
|
594
|
-
#
|
|
534
|
+
# * #lineno: Returns the current line number in `self`.
|
|
535
|
+
# * #lineno=: Sets the line number is `self`.
|
|
536
|
+
# * #pos (aliased as #tell): Returns the current byte offset in `self`.
|
|
537
|
+
# * #pos=: Sets the byte offset in `self`.
|
|
538
|
+
# * #reopen: Reassociates `self` with a new or existing IO stream.
|
|
539
|
+
# * #rewind: Positions `self` to the beginning of input.
|
|
540
|
+
# * #seek: Sets the offset for `self` relative to given position.
|
|
595
541
|
#
|
|
596
|
-
# #stat
|
|
597
|
-
# : Returns the File::Stat object containing status information for
|
|
598
|
-
# `self`.
|
|
599
542
|
#
|
|
600
|
-
#
|
|
601
|
-
# : Returns whether `self` is in sync-mode.
|
|
543
|
+
# ### Iterating
|
|
602
544
|
#
|
|
603
|
-
#
|
|
604
|
-
# :
|
|
545
|
+
# * ::foreach: Yields each line of given file to the block.
|
|
546
|
+
# * #each (aliased as #each_line): Calls the given block with each successive
|
|
547
|
+
# line in `self`.
|
|
548
|
+
# * #each_byte: Calls the given block with each successive byte in `self` as
|
|
549
|
+
# an integer.
|
|
550
|
+
# * #each_char: Calls the given block with each successive character in `self`
|
|
551
|
+
# as a string.
|
|
552
|
+
# * #each_codepoint: Calls the given block with each successive codepoint in
|
|
553
|
+
# `self` as an integer.
|
|
605
554
|
#
|
|
606
555
|
#
|
|
556
|
+
# ### Settings
|
|
607
557
|
#
|
|
608
|
-
#
|
|
558
|
+
# * #autoclose=: Sets whether `self` auto-closes.
|
|
559
|
+
# * #binmode: Sets `self` to binary mode.
|
|
560
|
+
# * #close: Closes `self`.
|
|
561
|
+
# * #close_on_exec=: Sets the close-on-exec flag.
|
|
562
|
+
# * #close_read: Closes `self` for reading.
|
|
563
|
+
# * #close_write: Closes `self` for writing.
|
|
564
|
+
# * #set_encoding: Sets the encoding for `self`.
|
|
565
|
+
# * #set_encoding_by_bom: Sets the encoding for `self`, based on its Unicode
|
|
566
|
+
# byte-order-mark.
|
|
567
|
+
# * #sync=: Sets the sync-mode to the given value.
|
|
609
568
|
#
|
|
610
|
-
# #fdatasync
|
|
611
|
-
# : Immediately writes all buffered data in `self` to disk.
|
|
612
569
|
#
|
|
613
|
-
#
|
|
614
|
-
# : Flushes any buffered data within `self` to the underlying operating
|
|
615
|
-
# system.
|
|
570
|
+
# ### Querying
|
|
616
571
|
#
|
|
617
|
-
#
|
|
618
|
-
#
|
|
572
|
+
# * #autoclose?: Returns whether `self` auto-closes.
|
|
573
|
+
# * #binmode?: Returns whether `self` is in binary mode.
|
|
574
|
+
# * #close_on_exec?: Returns the close-on-exec flag for `self`.
|
|
575
|
+
# * #closed?: Returns whether `self` is closed.
|
|
576
|
+
# * #eof? (aliased as #eof): Returns whether `self` is at end-of-stream.
|
|
577
|
+
# * #external_encoding: Returns the external encoding object for `self`.
|
|
578
|
+
# * #fileno (aliased as #to_i): Returns the integer file descriptor for `self`
|
|
579
|
+
# * #internal_encoding: Returns the internal encoding object for `self`.
|
|
580
|
+
# * #pid: Returns the process ID of a child process associated with `self`, if
|
|
581
|
+
# `self` was created by ::popen.
|
|
582
|
+
# * #stat: Returns the File::Stat object containing status information for
|
|
583
|
+
# `self`.
|
|
584
|
+
# * #sync: Returns whether `self` is in sync-mode.
|
|
585
|
+
# * #tty? (aliased as #isatty): Returns whether `self` is a terminal.
|
|
619
586
|
#
|
|
620
|
-
# #ungetbyte
|
|
621
|
-
# : Prepends buffer for `self` with given integer byte or string.
|
|
622
587
|
#
|
|
623
|
-
#
|
|
624
|
-
# : Prepends buffer for `self` with given string.
|
|
588
|
+
# ### Buffering
|
|
625
589
|
#
|
|
590
|
+
# * #fdatasync: Immediately writes all buffered data in `self` to disk.
|
|
591
|
+
# * #flush: Flushes any buffered data within `self` to the underlying
|
|
592
|
+
# operating system.
|
|
593
|
+
# * #fsync: Immediately writes all buffered data and attributes in `self` to
|
|
594
|
+
# disk.
|
|
595
|
+
# * #ungetbyte: Prepends buffer for `self` with given integer byte or string.
|
|
596
|
+
# * #ungetc: Prepends buffer for `self` with given string.
|
|
626
597
|
#
|
|
627
598
|
#
|
|
628
599
|
# ### Low-Level Access
|
|
629
600
|
#
|
|
630
|
-
#
|
|
631
|
-
#
|
|
632
|
-
#
|
|
633
|
-
#
|
|
634
|
-
#
|
|
635
|
-
#
|
|
636
|
-
#
|
|
637
|
-
#
|
|
638
|
-
# :
|
|
639
|
-
#
|
|
640
|
-
#
|
|
641
|
-
#
|
|
642
|
-
# : Passes a low-level command to the device specified by the given file
|
|
643
|
-
# descriptor.
|
|
644
|
-
#
|
|
645
|
-
# #sysread
|
|
646
|
-
# : Returns up to the next *n* bytes read from self using a low-level
|
|
647
|
-
# read.
|
|
648
|
-
#
|
|
649
|
-
# #sysseek
|
|
650
|
-
# : Sets the offset for `self`.
|
|
651
|
-
#
|
|
652
|
-
# #syswrite
|
|
653
|
-
# : Writes the given string to `self` using a low-level write.
|
|
654
|
-
#
|
|
601
|
+
# * ::sysopen: Opens the file given by its path, returning the integer file
|
|
602
|
+
# descriptor.
|
|
603
|
+
# * #advise: Announces the intention to access data from `self` in a specific
|
|
604
|
+
# way.
|
|
605
|
+
# * #fcntl: Passes a low-level command to the file specified by the given file
|
|
606
|
+
# descriptor.
|
|
607
|
+
# * #ioctl: Passes a low-level command to the device specified by the given
|
|
608
|
+
# file descriptor.
|
|
609
|
+
# * #sysread: Returns up to the next *n* bytes read from self using a
|
|
610
|
+
# low-level read.
|
|
611
|
+
# * #sysseek: Sets the offset for `self`.
|
|
612
|
+
# * #syswrite: Writes the given string to `self` using a low-level write.
|
|
655
613
|
#
|
|
656
614
|
#
|
|
657
615
|
# ### Other
|
|
658
616
|
#
|
|
659
|
-
#
|
|
660
|
-
#
|
|
661
|
-
#
|
|
662
|
-
#
|
|
663
|
-
#
|
|
664
|
-
# : Returns a new IO object resulting from converting the given object.
|
|
665
|
-
#
|
|
666
|
-
# #inspect
|
|
667
|
-
# : Returns the string representation of `self`.
|
|
617
|
+
# * ::copy_stream: Copies data from a source to a destination, each of which
|
|
618
|
+
# is a filepath or an IO-like object.
|
|
619
|
+
# * ::try_convert: Returns a new IO object resulting from converting the given
|
|
620
|
+
# object.
|
|
621
|
+
# * #inspect: Returns the string representation of `self`.
|
|
668
622
|
#
|
|
669
623
|
%a{annotate:rdoc:source:from=io.c}
|
|
670
624
|
class IO < Object
|
|
@@ -677,8 +631,8 @@ class IO < Object
|
|
|
677
631
|
# - self << object -> self
|
|
678
632
|
# -->
|
|
679
633
|
# Writes the given `object` to `self`, which must be opened for writing (see
|
|
680
|
-
# [Modes](
|
|
681
|
-
# it is converted via method `to_s`:
|
|
634
|
+
# [Access Modes](rdoc-ref:File@Access+Modes)); returns `self`; if `object` is
|
|
635
|
+
# not a string, it is converted via method `to_s`:
|
|
682
636
|
#
|
|
683
637
|
# $stdout << 'Hello' << ', ' << 'World!' << "\n"
|
|
684
638
|
# $stdout << 'foo' << :bar << 2 << "\n"
|
|
@@ -692,56 +646,35 @@ class IO < Object
|
|
|
692
646
|
|
|
693
647
|
# <!--
|
|
694
648
|
# rdoc-file=io.c
|
|
695
|
-
# -
|
|
649
|
+
# - advise(advice, offset = 0, len = 0) -> nil
|
|
696
650
|
# -->
|
|
697
|
-
#
|
|
698
|
-
#
|
|
699
|
-
#
|
|
651
|
+
# Invokes Posix system call
|
|
652
|
+
# [posix_fadvise(2)](https://linux.die.net/man/2/posix_fadvise), which announces
|
|
653
|
+
# an intention to access data from the current file in a particular manner.
|
|
700
654
|
#
|
|
701
|
-
#
|
|
655
|
+
# The arguments and results are platform-dependent.
|
|
702
656
|
#
|
|
703
|
-
# :
|
|
704
|
-
# : No advice to give; the default assumption for an open file.
|
|
705
|
-
# :sequential
|
|
706
|
-
# : The data will be accessed sequentially with lower offsets read before
|
|
707
|
-
# higher ones.
|
|
708
|
-
# :random
|
|
709
|
-
# : The data will be accessed in random order.
|
|
710
|
-
# :willneed
|
|
711
|
-
# : The data will be accessed in the near future.
|
|
712
|
-
# :dontneed
|
|
713
|
-
# : The data will not be accessed in the near future.
|
|
714
|
-
# :noreuse
|
|
715
|
-
# : The data will only be accessed once.
|
|
657
|
+
# The relevant data is specified by:
|
|
716
658
|
#
|
|
659
|
+
# * `offset`: The offset of the first byte of data.
|
|
660
|
+
# * `len`: The number of bytes to be accessed; if `len` is zero, or is larger
|
|
661
|
+
# than the number of bytes remaining, all remaining bytes will be accessed.
|
|
717
662
|
#
|
|
718
|
-
# The semantics of a piece of advice are platform-dependent. See *man 2
|
|
719
|
-
# posix_fadvise* for details.
|
|
720
663
|
#
|
|
721
|
-
#
|
|
722
|
-
# extends for *len* bytes. If *len* is 0, the region ends at the last byte of
|
|
723
|
-
# the file. By default, both *offset* and *len* are 0, meaning that the advice
|
|
724
|
-
# applies to the entire file.
|
|
664
|
+
# Argument `advice` is one of the following symbols:
|
|
725
665
|
#
|
|
726
|
-
#
|
|
666
|
+
# * `:normal`: The application has no advice to give about its access pattern
|
|
667
|
+
# for the specified data. If no advice is given for an open file, this is
|
|
668
|
+
# the default assumption.
|
|
669
|
+
# * `:sequential`: The application expects to access the specified data
|
|
670
|
+
# sequentially (with lower offsets read before higher ones).
|
|
671
|
+
# * `:random`: The specified data will be accessed in random order.
|
|
672
|
+
# * `:noreuse`: The specified data will be accessed only once.
|
|
673
|
+
# * `:willneed`: The specified data will be accessed in the near future.
|
|
674
|
+
# * `:dontneed`: The specified data will not be accessed in the near future.
|
|
727
675
|
#
|
|
728
|
-
# IOError
|
|
729
|
-
# : The IO stream is closed.
|
|
730
|
-
# Errno::EBADF
|
|
731
|
-
# : The file descriptor of the current file is invalid.
|
|
732
|
-
# Errno::EINVAL
|
|
733
|
-
# : An invalid value for *advice* was given.
|
|
734
|
-
# Errno::ESPIPE
|
|
735
|
-
# : The file descriptor of the current file refers to a FIFO or pipe. (Linux
|
|
736
|
-
# raises Errno::EINVAL in this case).
|
|
737
|
-
# TypeError
|
|
738
|
-
# : Either *advice* was not a Symbol, or one of the other arguments was not an
|
|
739
|
-
# Integer.
|
|
740
|
-
# RangeError
|
|
741
|
-
# : One of the arguments given was too big/small.
|
|
742
676
|
#
|
|
743
|
-
#
|
|
744
|
-
# : exceptions are also possible.
|
|
677
|
+
# Not implemented on all platforms.
|
|
745
678
|
#
|
|
746
679
|
def advise: (:normal | :sequential | :random | :willneed | :dontneed | :noreuse advise, ?Integer offset, ?Integer len) -> nil
|
|
747
680
|
|
|
@@ -774,43 +707,60 @@ class IO < Object
|
|
|
774
707
|
|
|
775
708
|
# <!--
|
|
776
709
|
# rdoc-file=io.c
|
|
777
|
-
# -
|
|
710
|
+
# - binmode -> self
|
|
778
711
|
# -->
|
|
779
|
-
#
|
|
780
|
-
#
|
|
712
|
+
# Sets the stream's data mode as binary (see [Data
|
|
713
|
+
# Mode](rdoc-ref:File@Data+Mode)).
|
|
781
714
|
#
|
|
782
|
-
#
|
|
783
|
-
# * encoding conversion disabled
|
|
784
|
-
# * content is treated as ASCII-8BIT
|
|
715
|
+
# A stream's data mode may not be changed from binary to text.
|
|
785
716
|
#
|
|
786
717
|
def binmode: () -> self
|
|
787
718
|
|
|
788
719
|
# <!--
|
|
789
720
|
# rdoc-file=io.c
|
|
790
|
-
# -
|
|
721
|
+
# - binmode? -> true or false
|
|
791
722
|
# -->
|
|
792
|
-
# Returns `true` if
|
|
723
|
+
# Returns `true` if the stream is on binary mode, `false` otherwise. See [Data
|
|
724
|
+
# Mode](rdoc-ref:File@Data+Mode).
|
|
793
725
|
#
|
|
794
726
|
def binmode?: () -> bool
|
|
795
727
|
|
|
796
728
|
# <!--
|
|
797
729
|
# rdoc-file=io.c
|
|
798
|
-
# -
|
|
730
|
+
# - close -> nil
|
|
799
731
|
# -->
|
|
800
|
-
# Closes
|
|
801
|
-
#
|
|
802
|
-
#
|
|
803
|
-
#
|
|
732
|
+
# Closes the stream for both reading and writing if open for either or both;
|
|
733
|
+
# returns `nil`. See [Open and Closed
|
|
734
|
+
# Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
|
735
|
+
#
|
|
736
|
+
# If the stream is open for writing, flushes any buffered writes to the
|
|
737
|
+
# operating system before closing.
|
|
804
738
|
#
|
|
805
|
-
# If
|
|
739
|
+
# If the stream was opened by IO.popen, sets global variable `$?` (child exit
|
|
740
|
+
# status).
|
|
806
741
|
#
|
|
807
|
-
#
|
|
742
|
+
# Example:
|
|
743
|
+
#
|
|
744
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
|
745
|
+
# puts pipe.closed?
|
|
746
|
+
# pipe.close
|
|
747
|
+
# puts $?
|
|
748
|
+
# puts pipe.closed?
|
|
749
|
+
# end
|
|
750
|
+
#
|
|
751
|
+
# Output:
|
|
752
|
+
#
|
|
753
|
+
# false
|
|
754
|
+
# pid 13760 exit 0
|
|
755
|
+
# true
|
|
756
|
+
#
|
|
757
|
+
# Related: IO#close_read, IO#close_write, IO#closed?.
|
|
808
758
|
#
|
|
809
759
|
def close: () -> NilClass
|
|
810
760
|
|
|
811
761
|
# <!--
|
|
812
762
|
# rdoc-file=io.c
|
|
813
|
-
# -
|
|
763
|
+
# - self.close_on_exec = bool -> true or false
|
|
814
764
|
# -->
|
|
815
765
|
# Sets a close-on-exec flag.
|
|
816
766
|
#
|
|
@@ -829,157 +779,272 @@ class IO < Object
|
|
|
829
779
|
|
|
830
780
|
# <!--
|
|
831
781
|
# rdoc-file=io.c
|
|
832
|
-
# -
|
|
782
|
+
# - close_on_exec? -> true or false
|
|
833
783
|
# -->
|
|
834
|
-
# Returns `true` if
|
|
784
|
+
# Returns `true` if the stream will be closed on exec, `false` otherwise:
|
|
835
785
|
#
|
|
836
|
-
# f = open(
|
|
837
|
-
# f.close_on_exec?
|
|
838
|
-
# f.close_on_exec = true
|
|
839
|
-
# f.close_on_exec? #=> true
|
|
786
|
+
# f = File.open('t.txt')
|
|
787
|
+
# f.close_on_exec? # => true
|
|
840
788
|
# f.close_on_exec = false
|
|
841
|
-
# f.close_on_exec?
|
|
789
|
+
# f.close_on_exec? # => false
|
|
790
|
+
# f.close
|
|
842
791
|
#
|
|
843
792
|
def close_on_exec?: () -> bool
|
|
844
793
|
|
|
845
794
|
# <!--
|
|
846
795
|
# rdoc-file=io.c
|
|
847
|
-
# -
|
|
796
|
+
# - close_read -> nil
|
|
848
797
|
# -->
|
|
849
|
-
# Closes the
|
|
850
|
-
#
|
|
851
|
-
# is not duplexed.
|
|
798
|
+
# Closes the stream for reading if open for reading; returns `nil`. See [Open
|
|
799
|
+
# and Closed Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
|
852
800
|
#
|
|
853
|
-
#
|
|
854
|
-
#
|
|
855
|
-
# f.readlines
|
|
801
|
+
# If the stream was opened by IO.popen and is also closed for writing, sets
|
|
802
|
+
# global variable `$?` (child exit status).
|
|
856
803
|
#
|
|
857
|
-
#
|
|
804
|
+
# Example:
|
|
858
805
|
#
|
|
859
|
-
#
|
|
860
|
-
#
|
|
806
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
|
807
|
+
# puts pipe.closed?
|
|
808
|
+
# pipe.close_write
|
|
809
|
+
# puts pipe.closed?
|
|
810
|
+
# pipe.close_read
|
|
811
|
+
# puts $?
|
|
812
|
+
# puts pipe.closed?
|
|
813
|
+
# end
|
|
861
814
|
#
|
|
862
|
-
#
|
|
815
|
+
# Output:
|
|
816
|
+
#
|
|
817
|
+
# false
|
|
818
|
+
# false
|
|
819
|
+
# pid 14748 exit 0
|
|
820
|
+
# true
|
|
821
|
+
#
|
|
822
|
+
# Related: IO#close, IO#close_write, IO#closed?.
|
|
863
823
|
#
|
|
864
824
|
def close_read: () -> NilClass
|
|
865
825
|
|
|
866
826
|
# <!--
|
|
867
827
|
# rdoc-file=io.c
|
|
868
|
-
# -
|
|
828
|
+
# - close_write -> nil
|
|
869
829
|
# -->
|
|
870
|
-
# Closes the
|
|
871
|
-
#
|
|
872
|
-
# is not duplexed.
|
|
830
|
+
# Closes the stream for writing if open for writing; returns `nil`. See [Open
|
|
831
|
+
# and Closed Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
|
873
832
|
#
|
|
874
|
-
#
|
|
875
|
-
# f.close_write
|
|
876
|
-
# f.print "nowhere"
|
|
833
|
+
# Flushes any buffered writes to the operating system before closing.
|
|
877
834
|
#
|
|
878
|
-
#
|
|
835
|
+
# If the stream was opened by IO.popen and is also closed for reading, sets
|
|
836
|
+
# global variable `$?` (child exit status).
|
|
879
837
|
#
|
|
880
|
-
#
|
|
881
|
-
#
|
|
882
|
-
#
|
|
838
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
|
839
|
+
# puts pipe.closed?
|
|
840
|
+
# pipe.close_read
|
|
841
|
+
# puts pipe.closed?
|
|
842
|
+
# pipe.close_write
|
|
843
|
+
# puts $?
|
|
844
|
+
# puts pipe.closed?
|
|
845
|
+
# end
|
|
883
846
|
#
|
|
884
|
-
#
|
|
847
|
+
# Output:
|
|
848
|
+
#
|
|
849
|
+
# false
|
|
850
|
+
# false
|
|
851
|
+
# pid 15044 exit 0
|
|
852
|
+
# true
|
|
853
|
+
#
|
|
854
|
+
# Related: IO#close, IO#close_read, IO#closed?.
|
|
885
855
|
#
|
|
886
856
|
def close_write: () -> NilClass
|
|
887
857
|
|
|
888
858
|
# <!--
|
|
889
859
|
# rdoc-file=io.c
|
|
890
|
-
# -
|
|
860
|
+
# - closed? -> true or false
|
|
891
861
|
# -->
|
|
892
|
-
# Returns `true` if
|
|
893
|
-
# and
|
|
862
|
+
# Returns `true` if the stream is closed for both reading and writing, `false`
|
|
863
|
+
# otherwise. See [Open and Closed Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
|
894
864
|
#
|
|
895
|
-
#
|
|
896
|
-
#
|
|
897
|
-
#
|
|
898
|
-
#
|
|
899
|
-
#
|
|
900
|
-
#
|
|
901
|
-
#
|
|
902
|
-
#
|
|
865
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
|
866
|
+
# puts pipe.closed?
|
|
867
|
+
# pipe.close_read
|
|
868
|
+
# puts pipe.closed?
|
|
869
|
+
# pipe.close_write
|
|
870
|
+
# puts pipe.closed?
|
|
871
|
+
# end
|
|
872
|
+
#
|
|
873
|
+
# Output:
|
|
874
|
+
#
|
|
875
|
+
# false
|
|
876
|
+
# false
|
|
877
|
+
# true
|
|
878
|
+
#
|
|
879
|
+
# Related: IO#close_read, IO#close_write, IO#close.
|
|
903
880
|
#
|
|
904
881
|
def closed?: () -> bool
|
|
905
882
|
|
|
906
883
|
# <!--
|
|
907
884
|
# rdoc-file=io.c
|
|
908
|
-
# -
|
|
909
|
-
# -
|
|
910
|
-
# -
|
|
911
|
-
# -
|
|
912
|
-
# - ios.each_line(sep=$/ [, getline_args]) {|line| block } -> ios
|
|
913
|
-
# - ios.each_line(limit [, getline_args]) {|line| block } -> ios
|
|
914
|
-
# - ios.each_line(sep, limit [, getline_args]) {|line| block } -> ios
|
|
915
|
-
# - ios.each_line(...) -> an_enumerator
|
|
885
|
+
# - each_line(sep = $/, chomp: false) {|line| ... } -> self
|
|
886
|
+
# - each_line(limit, chomp: false) {|line| ... } -> self
|
|
887
|
+
# - each_line(sep, limit, chomp: false) {|line| ... } -> self
|
|
888
|
+
# - each_line -> enumerator
|
|
916
889
|
# -->
|
|
917
|
-
#
|
|
918
|
-
#
|
|
890
|
+
# Calls the block with each remaining line read from the stream; returns `self`.
|
|
891
|
+
# Does nothing if already at end-of-stream; See [Line IO](rdoc-ref:IO@Line+IO).
|
|
919
892
|
#
|
|
920
|
-
#
|
|
893
|
+
# With no arguments given, reads lines as determined by line separator `$/`:
|
|
921
894
|
#
|
|
922
|
-
# f = File.new(
|
|
923
|
-
# f.
|
|
895
|
+
# f = File.new('t.txt')
|
|
896
|
+
# f.each_line {|line| p line }
|
|
897
|
+
# f.each_line {|line| fail 'Cannot happen' }
|
|
898
|
+
# f.close
|
|
924
899
|
#
|
|
925
|
-
#
|
|
900
|
+
# Output:
|
|
901
|
+
#
|
|
902
|
+
# "First line\n"
|
|
903
|
+
# "Second line\n"
|
|
904
|
+
# "\n"
|
|
905
|
+
# "Fourth line\n"
|
|
906
|
+
# "Fifth line\n"
|
|
907
|
+
#
|
|
908
|
+
# With only string argument `sep` given, reads lines as determined by line
|
|
909
|
+
# separator `sep`; see [Line Separator](rdoc-ref:IO@Line+Separator):
|
|
926
910
|
#
|
|
927
|
-
#
|
|
928
|
-
#
|
|
929
|
-
#
|
|
930
|
-
#
|
|
911
|
+
# f = File.new('t.txt')
|
|
912
|
+
# f.each_line('li') {|line| p line }
|
|
913
|
+
# f.close
|
|
914
|
+
#
|
|
915
|
+
# Output:
|
|
916
|
+
#
|
|
917
|
+
# "First li"
|
|
918
|
+
# "ne\nSecond li"
|
|
919
|
+
# "ne\n\nFourth li"
|
|
920
|
+
# "ne\nFifth li"
|
|
921
|
+
# "ne\n"
|
|
922
|
+
#
|
|
923
|
+
# The two special values for `sep` are honored:
|
|
924
|
+
#
|
|
925
|
+
# f = File.new('t.txt')
|
|
926
|
+
# # Get all into one string.
|
|
927
|
+
# f.each_line(nil) {|line| p line }
|
|
928
|
+
# f.close
|
|
929
|
+
#
|
|
930
|
+
# Output:
|
|
931
931
|
#
|
|
932
|
-
#
|
|
932
|
+
# "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
933
|
+
#
|
|
934
|
+
# f.rewind
|
|
935
|
+
# # Get paragraphs (up to two line separators).
|
|
936
|
+
# f.each_line('') {|line| p line }
|
|
937
|
+
#
|
|
938
|
+
# Output:
|
|
939
|
+
#
|
|
940
|
+
# "First line\nSecond line\n\n"
|
|
941
|
+
# "Fourth line\nFifth line\n"
|
|
942
|
+
#
|
|
943
|
+
# With only integer argument `limit` given, limits the number of bytes in each
|
|
944
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
|
945
|
+
#
|
|
946
|
+
# f = File.new('t.txt')
|
|
947
|
+
# f.each_line(8) {|line| p line }
|
|
948
|
+
# f.close
|
|
949
|
+
#
|
|
950
|
+
# Output:
|
|
951
|
+
#
|
|
952
|
+
# "First li"
|
|
953
|
+
# "ne\n"
|
|
954
|
+
# "Second l"
|
|
955
|
+
# "ine\n"
|
|
956
|
+
# "\n"
|
|
957
|
+
# "Fourth l"
|
|
958
|
+
# "ine\n"
|
|
959
|
+
# "Fifth li"
|
|
960
|
+
# "ne\n"
|
|
961
|
+
#
|
|
962
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
|
963
|
+
#
|
|
964
|
+
# * Calls with the next line as determined by line separator `sep`.
|
|
965
|
+
# * But returns no more bytes than are allowed by the limit.
|
|
966
|
+
#
|
|
967
|
+
#
|
|
968
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
|
969
|
+
# omitted:
|
|
970
|
+
#
|
|
971
|
+
# f = File.new('t.txt')
|
|
972
|
+
# f.each_line(chomp: true) {|line| p line }
|
|
973
|
+
# f.close
|
|
974
|
+
#
|
|
975
|
+
# Output:
|
|
976
|
+
#
|
|
977
|
+
# "First line"
|
|
978
|
+
# "Second line"
|
|
979
|
+
# ""
|
|
980
|
+
# "Fourth line"
|
|
981
|
+
# "Fifth line"
|
|
982
|
+
#
|
|
983
|
+
# Returns an Enumerator if no block is given.
|
|
984
|
+
#
|
|
985
|
+
# IO#each is an alias for IO#each_line.
|
|
933
986
|
#
|
|
934
987
|
def each: (?String sep, ?Integer limit) { (String arg0) -> untyped } -> self
|
|
935
988
|
| (?String sep, ?Integer limit) -> ::Enumerator[String, self]
|
|
936
989
|
|
|
937
990
|
# <!--
|
|
938
991
|
# rdoc-file=io.c
|
|
939
|
-
# -
|
|
940
|
-
# -
|
|
992
|
+
# - each_byte {|byte| ... } -> self
|
|
993
|
+
# - each_byte -> enumerator
|
|
941
994
|
# -->
|
|
942
|
-
# Calls the given block
|
|
943
|
-
#
|
|
944
|
-
# raised.
|
|
995
|
+
# Calls the given block with each byte (0..255) in the stream; returns `self`.
|
|
996
|
+
# See [Byte IO](rdoc-ref:IO@Byte+IO).
|
|
945
997
|
#
|
|
946
|
-
#
|
|
998
|
+
# f = File.new('t.rus')
|
|
999
|
+
# a = []
|
|
1000
|
+
# f.each_byte {|b| a << b }
|
|
1001
|
+
# a # => [209, 130, 208, 181, 209, 129, 209, 130]
|
|
1002
|
+
# f.close
|
|
947
1003
|
#
|
|
948
|
-
#
|
|
949
|
-
#
|
|
950
|
-
#
|
|
951
|
-
# checksum #=> 12
|
|
1004
|
+
# Returns an Enumerator if no block is given.
|
|
1005
|
+
#
|
|
1006
|
+
# Related: IO#each_char, IO#each_codepoint.
|
|
952
1007
|
#
|
|
953
1008
|
def each_byte: () { (Integer arg0) -> untyped } -> self
|
|
954
1009
|
| () -> ::Enumerator[Integer, self]
|
|
955
1010
|
|
|
956
1011
|
# <!--
|
|
957
1012
|
# rdoc-file=io.c
|
|
958
|
-
# -
|
|
959
|
-
# -
|
|
1013
|
+
# - each_char {|c| ... } -> self
|
|
1014
|
+
# - each_char -> enumerator
|
|
960
1015
|
# -->
|
|
961
|
-
# Calls the given block
|
|
962
|
-
#
|
|
963
|
-
# raised.
|
|
1016
|
+
# Calls the given block with each character in the stream; returns `self`. See
|
|
1017
|
+
# [Character IO](rdoc-ref:IO@Character+IO).
|
|
964
1018
|
#
|
|
965
|
-
#
|
|
1019
|
+
# f = File.new('t.rus')
|
|
1020
|
+
# a = []
|
|
1021
|
+
# f.each_char {|c| a << c.ord }
|
|
1022
|
+
# a # => [1090, 1077, 1089, 1090]
|
|
1023
|
+
# f.close
|
|
966
1024
|
#
|
|
967
|
-
#
|
|
968
|
-
#
|
|
1025
|
+
# Returns an Enumerator if no block is given.
|
|
1026
|
+
#
|
|
1027
|
+
# Related: IO#each_byte, IO#each_codepoint.
|
|
969
1028
|
#
|
|
970
1029
|
def each_char: () { (String arg0) -> untyped } -> self
|
|
971
1030
|
| () -> ::Enumerator[String, self]
|
|
972
1031
|
|
|
973
1032
|
# <!--
|
|
974
1033
|
# rdoc-file=io.c
|
|
975
|
-
# -
|
|
976
|
-
# -
|
|
1034
|
+
# - each_codepoint {|c| ... } -> self
|
|
1035
|
+
# - each_codepoint -> enumerator
|
|
977
1036
|
# -->
|
|
978
|
-
#
|
|
979
|
-
#
|
|
980
|
-
#
|
|
1037
|
+
# Calls the given block with each codepoint in the stream; returns `self`:
|
|
1038
|
+
#
|
|
1039
|
+
# f = File.new('t.rus')
|
|
1040
|
+
# a = []
|
|
1041
|
+
# f.each_codepoint {|c| a << c }
|
|
1042
|
+
# a # => [1090, 1077, 1089, 1090]
|
|
1043
|
+
# f.close
|
|
981
1044
|
#
|
|
982
|
-
#
|
|
1045
|
+
# Returns an Enumerator if no block is given.
|
|
1046
|
+
#
|
|
1047
|
+
# Related: IO#each_byte, IO#each_char.
|
|
983
1048
|
#
|
|
984
1049
|
def each_codepoint: () { (Integer arg0) -> untyped } -> self
|
|
985
1050
|
| () -> ::Enumerator[Integer, self]
|
|
@@ -989,15 +1054,16 @@ class IO < Object
|
|
|
989
1054
|
# - eof -> true or false
|
|
990
1055
|
# -->
|
|
991
1056
|
# Returns `true` if the stream is positioned at its end, `false` otherwise; see
|
|
992
|
-
# [Position](
|
|
1057
|
+
# [Position](rdoc-ref:IO@Position):
|
|
993
1058
|
#
|
|
994
1059
|
# f = File.open('t.txt')
|
|
995
1060
|
# f.eof # => false
|
|
996
1061
|
# f.seek(0, :END) # => 0
|
|
997
1062
|
# f.eof # => true
|
|
1063
|
+
# f.close
|
|
998
1064
|
#
|
|
999
1065
|
# Raises an exception unless the stream is opened for reading; see
|
|
1000
|
-
# [Mode](
|
|
1066
|
+
# [Mode](rdoc-ref:File@Access+Modes).
|
|
1001
1067
|
#
|
|
1002
1068
|
# If `self` is a stream such as pipe or socket, this method blocks until the
|
|
1003
1069
|
# other end sends some data or closes it:
|
|
@@ -1017,20 +1083,23 @@ class IO < Object
|
|
|
1017
1083
|
# not behave as you intend with IO#eof?, unless you call IO#rewind first (which
|
|
1018
1084
|
# is not available for some streams).
|
|
1019
1085
|
#
|
|
1020
|
-
#
|
|
1086
|
+
# IO#eof? is an alias for IO#eof.
|
|
1021
1087
|
#
|
|
1022
1088
|
def eof: () -> bool
|
|
1023
1089
|
|
|
1024
1090
|
# <!--
|
|
1025
1091
|
# rdoc-file=io.c
|
|
1026
|
-
# -
|
|
1092
|
+
# - fcntl(integer_cmd, argument) -> integer
|
|
1027
1093
|
# -->
|
|
1028
|
-
#
|
|
1029
|
-
#
|
|
1030
|
-
#
|
|
1031
|
-
#
|
|
1032
|
-
#
|
|
1033
|
-
#
|
|
1094
|
+
# Invokes Posix system call [fcntl(2)](https://linux.die.net/man/2/fcntl), which
|
|
1095
|
+
# provides a mechanism for issuing low-level commands to control or query a
|
|
1096
|
+
# file-oriented I/O stream. Arguments and results are platform dependent.
|
|
1097
|
+
#
|
|
1098
|
+
# If +argument is a number, its value is passed directly; if it is a string, it
|
|
1099
|
+
# is interpreted as a binary sequence of bytes. (Array#pack might be a useful
|
|
1100
|
+
# way to build this string.)
|
|
1101
|
+
#
|
|
1102
|
+
# Not implemented on all platforms.
|
|
1034
1103
|
#
|
|
1035
1104
|
def fcntl: (Integer integer_cmd, String | Integer arg) -> Integer
|
|
1036
1105
|
|
|
@@ -1054,6 +1123,7 @@ class IO < Object
|
|
|
1054
1123
|
# $stdout.fileno # => 1
|
|
1055
1124
|
# $stderr.fileno # => 2
|
|
1056
1125
|
# File.open('t.txt').fileno # => 10
|
|
1126
|
+
# f.close
|
|
1057
1127
|
#
|
|
1058
1128
|
# IO#to_i is an alias for IO#fileno.
|
|
1059
1129
|
#
|
|
@@ -1093,256 +1163,153 @@ class IO < Object
|
|
|
1093
1163
|
|
|
1094
1164
|
# <!--
|
|
1095
1165
|
# rdoc-file=io.c
|
|
1096
|
-
# -
|
|
1166
|
+
# - getbyte -> integer or nil
|
|
1097
1167
|
# -->
|
|
1098
|
-
#
|
|
1099
|
-
# of
|
|
1168
|
+
# Reads and returns the next byte (in range 0..255) from the stream; returns
|
|
1169
|
+
# `nil` if already at end-of-stream. See [Byte IO](rdoc-ref:IO@Byte+IO).
|
|
1100
1170
|
#
|
|
1101
|
-
# f = File.
|
|
1102
|
-
# f.getbyte
|
|
1103
|
-
# f.
|
|
1171
|
+
# f = File.open('t.txt')
|
|
1172
|
+
# f.getbyte # => 70
|
|
1173
|
+
# f.close
|
|
1174
|
+
# f = File.open('t.rus')
|
|
1175
|
+
# f.getbyte # => 209
|
|
1176
|
+
# f.close
|
|
1177
|
+
#
|
|
1178
|
+
# Related: IO#readbyte (may raise EOFError).
|
|
1104
1179
|
#
|
|
1105
1180
|
def getbyte: () -> Integer?
|
|
1106
1181
|
|
|
1107
1182
|
# <!--
|
|
1108
1183
|
# rdoc-file=io.c
|
|
1109
|
-
# -
|
|
1184
|
+
# - getc -> character or nil
|
|
1110
1185
|
# -->
|
|
1111
|
-
# Reads
|
|
1112
|
-
#
|
|
1186
|
+
# Reads and returns the next 1-character string from the stream; returns `nil`
|
|
1187
|
+
# if already at end-of-stream. See [Character IO](rdoc-ref:IO@Character+IO).
|
|
1113
1188
|
#
|
|
1114
|
-
# f = File.
|
|
1115
|
-
# f.getc
|
|
1116
|
-
# f.
|
|
1189
|
+
# f = File.open('t.txt')
|
|
1190
|
+
# f.getc # => "F"
|
|
1191
|
+
# f.close
|
|
1192
|
+
# f = File.open('t.rus')
|
|
1193
|
+
# f.getc.ord # => 1090
|
|
1194
|
+
# f.close
|
|
1195
|
+
#
|
|
1196
|
+
# Related: IO#readchar (may raise EOFError).
|
|
1117
1197
|
#
|
|
1118
1198
|
def getc: () -> String?
|
|
1119
1199
|
|
|
1120
1200
|
# <!--
|
|
1121
1201
|
# rdoc-file=io.c
|
|
1122
|
-
# - gets(sep = $/,
|
|
1123
|
-
# - gets(limit,
|
|
1124
|
-
# - gets(sep, limit,
|
|
1202
|
+
# - gets(sep = $/, chomp: false) -> string or nil
|
|
1203
|
+
# - gets(limit, chomp: false) -> string or nil
|
|
1204
|
+
# - gets(sep, limit, chomp: false) -> string or nil
|
|
1125
1205
|
# -->
|
|
1126
|
-
# Reads and returns
|
|
1206
|
+
# Reads and returns a line from the stream; assigns the return value to `$_`.
|
|
1207
|
+
# See [Line IO](rdoc-ref:IO@Line+IO).
|
|
1127
1208
|
#
|
|
1128
1209
|
# With no arguments given, returns the next line as determined by line separator
|
|
1129
1210
|
# `$/`, or `nil` if none:
|
|
1130
1211
|
#
|
|
1131
1212
|
# f = File.open('t.txt')
|
|
1132
|
-
# f.gets # => "
|
|
1133
|
-
# $_ # => "
|
|
1134
|
-
# f.gets # => "
|
|
1135
|
-
# f.gets # => "
|
|
1213
|
+
# f.gets # => "First line\n"
|
|
1214
|
+
# $_ # => "First line\n"
|
|
1215
|
+
# f.gets # => "\n"
|
|
1216
|
+
# f.gets # => "Fourth line\n"
|
|
1217
|
+
# f.gets # => "Fifth line\n"
|
|
1136
1218
|
# f.gets # => nil
|
|
1219
|
+
# f.close
|
|
1137
1220
|
#
|
|
1138
|
-
# With string argument `sep` given,
|
|
1139
|
-
# line
|
|
1140
|
-
#
|
|
1141
|
-
# f = File.open('t.txt')
|
|
1142
|
-
# f.gets(' is') # => "This is"
|
|
1143
|
-
# f.gets(' is') # => " line one.\nThis is"
|
|
1144
|
-
# f.gets(' is') # => " the second line.\nThis is"
|
|
1145
|
-
# f.gets(' is') # => " the third line.\n"
|
|
1146
|
-
# f.gets(' is') # => nil
|
|
1221
|
+
# With only string argument `sep` given, returns the next line as determined by
|
|
1222
|
+
# line separator `sep`, or `nil` if none; see [Line
|
|
1223
|
+
# Separator](rdoc-ref:IO@Line+Separator):
|
|
1147
1224
|
#
|
|
1148
|
-
#
|
|
1225
|
+
# f = File.new('t.txt')
|
|
1226
|
+
# f.gets('l') # => "First l"
|
|
1227
|
+
# f.gets('li') # => "ine\nSecond li"
|
|
1228
|
+
# f.gets('lin') # => "ne\n\nFourth lin"
|
|
1229
|
+
# f.gets # => "e\n"
|
|
1230
|
+
# f.close
|
|
1149
1231
|
#
|
|
1150
|
-
#
|
|
1151
|
-
# * `''` (empty string): The next "paragraph" is read and returned, the
|
|
1152
|
-
# paragraph separator being two successive line separators.
|
|
1232
|
+
# The two special values for `sep` are honored:
|
|
1153
1233
|
#
|
|
1234
|
+
# f = File.new('t.txt')
|
|
1235
|
+
# # Get all.
|
|
1236
|
+
# f.gets(nil) # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
1237
|
+
# f.rewind
|
|
1238
|
+
# # Get paragraph (up to two line separators).
|
|
1239
|
+
# f.gets('') # => "First line\nSecond line\n\n"
|
|
1240
|
+
# f.close
|
|
1154
1241
|
#
|
|
1155
|
-
# With integer argument `limit` given,
|
|
1242
|
+
# With only integer argument `limit` given, limits the number of bytes in the
|
|
1243
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
|
1156
1244
|
#
|
|
1157
|
-
# # Text with 1-byte characters.
|
|
1158
|
-
# File.open('t.txt') {|f| f.gets(1) } # => "T"
|
|
1159
|
-
# File.open('t.txt') {|f| f.gets(2) } # => "Th"
|
|
1160
|
-
# File.open('t.txt') {|f| f.gets(3) } # => "Thi"
|
|
1161
|
-
# File.open('t.txt') {|f| f.gets(4) } # => "This"
|
|
1162
1245
|
# # No more than one line.
|
|
1163
|
-
# File.open('t.txt') {|f| f.gets(
|
|
1164
|
-
# File.open('t.txt') {|f| f.gets(
|
|
1165
|
-
# File.open('t.txt') {|f| f.gets(
|
|
1166
|
-
#
|
|
1167
|
-
# # Text with 2-byte characters, which will not be split.
|
|
1168
|
-
# File.open('t.rus') {|f| f.gets(1).size } # => 1
|
|
1169
|
-
# File.open('t.rus') {|f| f.gets(2).size } # => 1
|
|
1170
|
-
# File.open('t.rus') {|f| f.gets(3).size } # => 2
|
|
1171
|
-
# File.open('t.rus') {|f| f.gets(4).size } # => 2
|
|
1246
|
+
# File.open('t.txt') {|f| f.gets(10) } # => "First line"
|
|
1247
|
+
# File.open('t.txt') {|f| f.gets(11) } # => "First line\n"
|
|
1248
|
+
# File.open('t.txt') {|f| f.gets(12) } # => "First line\n"
|
|
1172
1249
|
#
|
|
1173
|
-
# With arguments `sep` and `limit
|
|
1250
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
|
1174
1251
|
#
|
|
1175
1252
|
# * Returns the next line as determined by line separator `sep`, or `nil` if
|
|
1176
1253
|
# none.
|
|
1177
|
-
# * But returns no more than
|
|
1254
|
+
# * But returns no more bytes than are allowed by the limit.
|
|
1178
1255
|
#
|
|
1179
1256
|
#
|
|
1180
|
-
#
|
|
1181
|
-
#
|
|
1257
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
|
1258
|
+
# omitted:
|
|
1182
1259
|
#
|
|
1183
1260
|
# f = File.open('t.txt')
|
|
1184
1261
|
# # Chomp the lines.
|
|
1185
|
-
# f.gets(chomp: true) # => "
|
|
1186
|
-
# f.gets(chomp: true) # => "
|
|
1187
|
-
# f.gets(chomp: true) # => "
|
|
1262
|
+
# f.gets(chomp: true) # => "First line"
|
|
1263
|
+
# f.gets(chomp: true) # => "Second line"
|
|
1264
|
+
# f.gets(chomp: true) # => ""
|
|
1265
|
+
# f.gets(chomp: true) # => "Fourth line"
|
|
1266
|
+
# f.gets(chomp: true) # => "Fifth line"
|
|
1188
1267
|
# f.gets(chomp: true) # => nil
|
|
1268
|
+
# f.close
|
|
1189
1269
|
#
|
|
1190
1270
|
def gets: (?String sep, ?Integer limit) -> String?
|
|
1191
1271
|
|
|
1192
1272
|
# <!--
|
|
1193
1273
|
# rdoc-file=io.c
|
|
1194
|
-
# - IO.new(fd
|
|
1274
|
+
# - IO.new(fd, mode = 'r', **opts) -> io
|
|
1195
1275
|
# -->
|
|
1196
|
-
#
|
|
1197
|
-
# and `mode` string. `opt` may be used to specify parts of `mode` in a more
|
|
1198
|
-
# readable fashion. See also IO.sysopen and IO.for_fd.
|
|
1199
|
-
#
|
|
1200
|
-
# IO.new is called by various File and IO opening methods such as IO::open,
|
|
1201
|
-
# Kernel#open, and File::open.
|
|
1202
|
-
#
|
|
1203
|
-
# ### Open Mode
|
|
1204
|
-
#
|
|
1205
|
-
# When `mode` is an integer it must be combination of the modes defined in
|
|
1206
|
-
# File::Constants (`File::RDONLY`, `File::WRONLY|File::CREAT`). See the open(2)
|
|
1207
|
-
# man page for more information.
|
|
1208
|
-
#
|
|
1209
|
-
# When `mode` is a string it must be in one of the following forms:
|
|
1210
|
-
#
|
|
1211
|
-
# fmode
|
|
1212
|
-
# fmode ":" ext_enc
|
|
1213
|
-
# fmode ":" ext_enc ":" int_enc
|
|
1214
|
-
# fmode ":" "BOM|UTF-*"
|
|
1215
|
-
#
|
|
1216
|
-
# `fmode` is an IO open mode string, `ext_enc` is the external encoding for the
|
|
1217
|
-
# IO and `int_enc` is the internal encoding.
|
|
1218
|
-
#
|
|
1219
|
-
# #### IO Open Mode
|
|
1220
|
-
#
|
|
1221
|
-
# Ruby allows the following open modes:
|
|
1222
|
-
#
|
|
1223
|
-
# "r" Read-only, starts at beginning of file (default mode).
|
|
1224
|
-
#
|
|
1225
|
-
# "r+" Read-write, starts at beginning of file.
|
|
1226
|
-
#
|
|
1227
|
-
# "w" Write-only, truncates existing file
|
|
1228
|
-
# to zero length or creates a new file for writing.
|
|
1229
|
-
#
|
|
1230
|
-
# "w+" Read-write, truncates existing file to zero length
|
|
1231
|
-
# or creates a new file for reading and writing.
|
|
1232
|
-
#
|
|
1233
|
-
# "a" Write-only, each write call appends data at end of file.
|
|
1234
|
-
# Creates a new file for writing if file does not exist.
|
|
1235
|
-
#
|
|
1236
|
-
# "a+" Read-write, each write call appends data at end of file.
|
|
1237
|
-
# Creates a new file for reading and writing if file does
|
|
1238
|
-
# not exist.
|
|
1239
|
-
#
|
|
1240
|
-
# The following modes must be used separately, and along with one or more of the
|
|
1241
|
-
# modes seen above.
|
|
1242
|
-
#
|
|
1243
|
-
# "b" Binary file mode
|
|
1244
|
-
# Suppresses EOL <-> CRLF conversion on Windows. And
|
|
1245
|
-
# sets external encoding to ASCII-8BIT unless explicitly
|
|
1246
|
-
# specified.
|
|
1247
|
-
#
|
|
1248
|
-
# "t" Text file mode
|
|
1276
|
+
# Creates and returns a new IO object (file stream) from a file descriptor.
|
|
1249
1277
|
#
|
|
1250
|
-
#
|
|
1251
|
-
#
|
|
1252
|
-
#
|
|
1278
|
+
# IO.new may be useful for interaction with low-level libraries. For
|
|
1279
|
+
# higher-level interactions, it may be simpler to create the file stream using
|
|
1280
|
+
# File.open.
|
|
1253
1281
|
#
|
|
1254
|
-
#
|
|
1255
|
-
# be writable. Similarly, the open mode cannot be changed from write only to
|
|
1256
|
-
# readable.
|
|
1282
|
+
# Argument `fd` must be a valid file descriptor (integer):
|
|
1257
1283
|
#
|
|
1258
|
-
#
|
|
1259
|
-
#
|
|
1284
|
+
# path = 't.tmp'
|
|
1285
|
+
# fd = IO.sysopen(path) # => 3
|
|
1286
|
+
# IO.new(fd) # => #<IO:fd 3>
|
|
1260
1287
|
#
|
|
1261
|
-
#
|
|
1288
|
+
# The new IO object does not inherit encoding (because the integer file
|
|
1289
|
+
# descriptor does not have an encoding):
|
|
1262
1290
|
#
|
|
1263
|
-
#
|
|
1264
|
-
#
|
|
1265
|
-
#
|
|
1291
|
+
# fd = IO.sysopen('t.rus', 'rb')
|
|
1292
|
+
# io = IO.new(fd)
|
|
1293
|
+
# io.external_encoding # => #<Encoding:UTF-8> # Not ASCII-8BIT.
|
|
1266
1294
|
#
|
|
1267
|
-
#
|
|
1268
|
-
#
|
|
1269
|
-
# `int_enc` to `ext_enc` upon output. See Encoding for further details of
|
|
1270
|
-
# transcoding on input and output.
|
|
1295
|
+
# Optional argument `mode` (defaults to 'r') must specify a valid mode; see
|
|
1296
|
+
# [Access Modes](rdoc-ref:File@Access+Modes):
|
|
1271
1297
|
#
|
|
1272
|
-
#
|
|
1273
|
-
#
|
|
1274
|
-
# encodings the file open mode must be binary. When present, the BOM is
|
|
1275
|
-
# stripped and the external encoding from the BOM is used. When the BOM is
|
|
1276
|
-
# missing the given Unicode encoding is used as `ext_enc`. (The BOM-set
|
|
1277
|
-
# encoding option is case insensitive, so "bom|utf-8" is also valid.)
|
|
1298
|
+
# IO.new(fd, 'w') # => #<IO:fd 3>
|
|
1299
|
+
# IO.new(fd, File::WRONLY) # => #<IO:fd 3>
|
|
1278
1300
|
#
|
|
1279
|
-
#
|
|
1301
|
+
# Optional keyword arguments `opts` specify:
|
|
1280
1302
|
#
|
|
1281
|
-
#
|
|
1282
|
-
#
|
|
1303
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
1304
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
1283
1305
|
#
|
|
1284
|
-
# :mode
|
|
1285
|
-
# : Same as `mode` parameter
|
|
1286
1306
|
#
|
|
1287
|
-
# :
|
|
1288
|
-
# : Specifies file open flags as integer. If `mode` parameter is given, this
|
|
1289
|
-
# parameter will be bitwise-ORed.
|
|
1290
|
-
#
|
|
1291
|
-
# :external_encoding
|
|
1292
|
-
# : External encoding for the IO.
|
|
1293
|
-
#
|
|
1294
|
-
# :internal_encoding
|
|
1295
|
-
# : Internal encoding for the IO. "-" is a synonym for the default internal
|
|
1296
|
-
# encoding.
|
|
1297
|
-
#
|
|
1298
|
-
# If the value is `nil` no conversion occurs.
|
|
1299
|
-
#
|
|
1300
|
-
# :encoding
|
|
1301
|
-
# : Specifies external and internal encodings as "extern:intern".
|
|
1302
|
-
#
|
|
1303
|
-
# :textmode
|
|
1304
|
-
# : If the value is truth value, same as "t" in argument `mode`.
|
|
1305
|
-
#
|
|
1306
|
-
# :binmode
|
|
1307
|
-
# : If the value is truth value, same as "b" in argument `mode`.
|
|
1308
|
-
#
|
|
1309
|
-
# :autoclose
|
|
1310
|
-
# : If the value is `false`, the `fd` will be kept open after this IO instance
|
|
1311
|
-
# gets finalized.
|
|
1312
|
-
#
|
|
1313
|
-
#
|
|
1314
|
-
# Also, `opt` can have same keys in String#encode for controlling conversion
|
|
1315
|
-
# between the external encoding and the internal encoding.
|
|
1316
|
-
#
|
|
1317
|
-
# ### Example 1
|
|
1318
|
-
#
|
|
1319
|
-
# fd = IO.sysopen("/dev/tty", "w")
|
|
1320
|
-
# a = IO.new(fd,"w")
|
|
1321
|
-
# $stderr.puts "Hello"
|
|
1322
|
-
# a.puts "World"
|
|
1323
|
-
#
|
|
1324
|
-
# Produces:
|
|
1325
|
-
#
|
|
1326
|
-
# Hello
|
|
1327
|
-
# World
|
|
1328
|
-
#
|
|
1329
|
-
# ### Example 2
|
|
1330
|
-
#
|
|
1331
|
-
# require 'fcntl'
|
|
1332
|
-
#
|
|
1333
|
-
# fd = STDERR.fcntl(Fcntl::F_DUPFD)
|
|
1334
|
-
# io = IO.new(fd, mode: 'w:UTF-16LE', cr_newline: true)
|
|
1335
|
-
# io.puts "Hello, World!"
|
|
1336
|
-
#
|
|
1337
|
-
# fd = STDERR.fcntl(Fcntl::F_DUPFD)
|
|
1338
|
-
# io = IO.new(fd, mode: 'w', cr_newline: true,
|
|
1339
|
-
# external_encoding: Encoding::UTF_16LE)
|
|
1340
|
-
# io.puts "Hello, World!"
|
|
1307
|
+
# Examples:
|
|
1341
1308
|
#
|
|
1342
|
-
#
|
|
1343
|
-
#
|
|
1309
|
+
# IO.new(fd, internal_encoding: nil) # => #<IO:fd 3>
|
|
1310
|
+
# IO.new(fd, autoclose: true) # => #<IO:fd 3>
|
|
1344
1311
|
#
|
|
1345
|
-
def initialize: (
|
|
1312
|
+
def initialize: (int fd, ?string | int mode, ?path: string?, **untyped opts) -> void
|
|
1346
1313
|
|
|
1347
1314
|
# <!--
|
|
1348
1315
|
# rdoc-file=io.c
|
|
@@ -1352,84 +1319,86 @@ class IO < Object
|
|
|
1352
1319
|
#
|
|
1353
1320
|
# f = File.open('t.txt')
|
|
1354
1321
|
# f.inspect # => "#<File:t.txt>"
|
|
1322
|
+
# f.close
|
|
1355
1323
|
#
|
|
1356
1324
|
def inspect: () -> String
|
|
1357
1325
|
|
|
1358
1326
|
# <!--
|
|
1359
1327
|
# rdoc-file=io.c
|
|
1360
|
-
# -
|
|
1328
|
+
# - internal_encoding -> encoding or nil
|
|
1361
1329
|
# -->
|
|
1362
|
-
# Returns the Encoding
|
|
1363
|
-
#
|
|
1330
|
+
# Returns the Encoding object that represents the encoding of the internal
|
|
1331
|
+
# string, if conversion is specified, or `nil` otherwise.
|
|
1332
|
+
#
|
|
1333
|
+
# See [Encodings](rdoc-ref:File@Encodings).
|
|
1364
1334
|
#
|
|
1365
1335
|
def internal_encoding: () -> Encoding
|
|
1366
1336
|
|
|
1367
1337
|
# <!--
|
|
1368
1338
|
# rdoc-file=io.c
|
|
1369
|
-
# -
|
|
1339
|
+
# - ioctl(integer_cmd, argument) -> integer
|
|
1370
1340
|
# -->
|
|
1371
|
-
#
|
|
1372
|
-
#
|
|
1373
|
-
#
|
|
1374
|
-
#
|
|
1375
|
-
#
|
|
1341
|
+
# Invokes Posix system call [ioctl(2)](https://linux.die.net/man/2/ioctl), which
|
|
1342
|
+
# issues a low-level command to an I/O device.
|
|
1343
|
+
#
|
|
1344
|
+
# Issues a low-level command to an I/O device. The arguments and returned value
|
|
1345
|
+
# are platform-dependent. The effect of the call is platform-dependent.
|
|
1346
|
+
#
|
|
1347
|
+
# If argument `argument` is an integer, it is passed directly; if it is a
|
|
1348
|
+
# string, it is interpreted as a binary sequence of bytes.
|
|
1349
|
+
#
|
|
1350
|
+
# Not implemented on all platforms.
|
|
1376
1351
|
#
|
|
1377
1352
|
def ioctl: (Integer integer_cmd, String | Integer arg) -> Integer
|
|
1378
1353
|
|
|
1379
1354
|
# <!--
|
|
1380
1355
|
# rdoc-file=io.c
|
|
1381
|
-
# -
|
|
1382
|
-
# - ios.tty? -> true or false
|
|
1356
|
+
# - isatty -> true or false
|
|
1383
1357
|
# -->
|
|
1384
|
-
# Returns `true` if
|
|
1385
|
-
# otherwise
|
|
1358
|
+
# Returns `true` if the stream is associated with a terminal device (tty),
|
|
1359
|
+
# `false` otherwise:
|
|
1360
|
+
#
|
|
1361
|
+
# f = File.new('t.txt').isatty #=> false
|
|
1362
|
+
# f.close
|
|
1363
|
+
# f = File.new('/dev/tty').isatty #=> true
|
|
1364
|
+
# f.close
|
|
1386
1365
|
#
|
|
1387
|
-
#
|
|
1388
|
-
# File.new("/dev/tty").isatty #=> true
|
|
1366
|
+
# IO#tty? is an alias for IO#isatty.
|
|
1389
1367
|
#
|
|
1390
1368
|
def isatty: () -> bool
|
|
1391
1369
|
|
|
1392
1370
|
# <!--
|
|
1393
1371
|
# rdoc-file=io.c
|
|
1394
|
-
# -
|
|
1372
|
+
# - lineno -> integer
|
|
1395
1373
|
# -->
|
|
1396
|
-
# Returns the current line number
|
|
1397
|
-
#
|
|
1398
|
-
# number of newlines encountered. The two values will differ if #gets is called
|
|
1399
|
-
# with a separator other than newline.
|
|
1400
|
-
#
|
|
1401
|
-
# Methods that use `$/` like #each, #lines and #readline will also increment
|
|
1402
|
-
# #lineno.
|
|
1403
|
-
#
|
|
1404
|
-
# See also the `$.` variable.
|
|
1405
|
-
#
|
|
1406
|
-
# f = File.new("testfile")
|
|
1407
|
-
# f.lineno #=> 0
|
|
1408
|
-
# f.gets #=> "This is line one\n"
|
|
1409
|
-
# f.lineno #=> 1
|
|
1410
|
-
# f.gets #=> "This is line two\n"
|
|
1411
|
-
# f.lineno #=> 2
|
|
1374
|
+
# Returns the current line number for the stream; see [Line
|
|
1375
|
+
# Number](rdoc-ref:IO@Line+Number).
|
|
1412
1376
|
#
|
|
1413
1377
|
def lineno: () -> Integer
|
|
1414
1378
|
|
|
1415
1379
|
# <!--
|
|
1416
1380
|
# rdoc-file=io.c
|
|
1417
|
-
# -
|
|
1381
|
+
# - lineno = integer -> integer
|
|
1418
1382
|
# -->
|
|
1419
|
-
#
|
|
1420
|
-
#
|
|
1421
|
-
#
|
|
1422
|
-
# f = File.new("testfile")
|
|
1423
|
-
# f.gets #=> "This is line one\n"
|
|
1424
|
-
# $. #=> 1
|
|
1425
|
-
# f.lineno = 1000
|
|
1426
|
-
# f.lineno #=> 1000
|
|
1427
|
-
# $. #=> 1 # lineno of last read
|
|
1428
|
-
# f.gets #=> "This is line two\n"
|
|
1429
|
-
# $. #=> 1001 # lineno of last read
|
|
1383
|
+
# Sets and returns the line number for the stream; see [Line
|
|
1384
|
+
# Number](rdoc-ref:IO@Line+Number).
|
|
1430
1385
|
#
|
|
1431
1386
|
def lineno=: (Integer arg0) -> Integer
|
|
1432
1387
|
|
|
1388
|
+
# <!--
|
|
1389
|
+
# rdoc-file=io.c
|
|
1390
|
+
# - path -> string or nil
|
|
1391
|
+
# -->
|
|
1392
|
+
# Returns the path associated with the IO, or `nil` if there is no path
|
|
1393
|
+
# associated with the IO. It is not guaranteed that the path exists on the
|
|
1394
|
+
# filesystem.
|
|
1395
|
+
#
|
|
1396
|
+
# $stdin.path # => "<STDIN>"
|
|
1397
|
+
#
|
|
1398
|
+
# File.open("testfile") {|f| f.path} # => "testfile"
|
|
1399
|
+
#
|
|
1400
|
+
def path: () -> String?
|
|
1401
|
+
|
|
1433
1402
|
# <!--
|
|
1434
1403
|
# rdoc-file=io.c
|
|
1435
1404
|
# - pid -> integer or nil
|
|
@@ -1454,12 +1423,13 @@ class IO < Object
|
|
|
1454
1423
|
|
|
1455
1424
|
# <!-- rdoc-file=io.c -->
|
|
1456
1425
|
# Returns the current position (in bytes) in `self` (see
|
|
1457
|
-
# [Position](
|
|
1426
|
+
# [Position](rdoc-ref:IO@Position)):
|
|
1458
1427
|
#
|
|
1459
|
-
# f = File.
|
|
1460
|
-
# f.tell
|
|
1461
|
-
# f.
|
|
1462
|
-
# f.tell
|
|
1428
|
+
# f = File.open('t.txt')
|
|
1429
|
+
# f.tell # => 0
|
|
1430
|
+
# f.gets # => "First line\n"
|
|
1431
|
+
# f.tell # => 12
|
|
1432
|
+
# f.close
|
|
1463
1433
|
#
|
|
1464
1434
|
# Related: IO#pos=, IO#seek.
|
|
1465
1435
|
#
|
|
@@ -1472,12 +1442,13 @@ class IO < Object
|
|
|
1472
1442
|
# - pos = new_position -> new_position
|
|
1473
1443
|
# -->
|
|
1474
1444
|
# Seeks to the given `new_position` (in bytes); see
|
|
1475
|
-
# [Position](
|
|
1445
|
+
# [Position](rdoc-ref:IO@Position):
|
|
1476
1446
|
#
|
|
1477
1447
|
# f = File.open('t.txt')
|
|
1478
1448
|
# f.tell # => 0
|
|
1479
1449
|
# f.pos = 20 # => 20
|
|
1480
1450
|
# f.tell # => 20
|
|
1451
|
+
# f.close
|
|
1481
1452
|
#
|
|
1482
1453
|
# Related: IO#seek, IO#tell.
|
|
1483
1454
|
#
|
|
@@ -1485,48 +1456,86 @@ class IO < Object
|
|
|
1485
1456
|
|
|
1486
1457
|
# <!--
|
|
1487
1458
|
# rdoc-file=io.c
|
|
1488
|
-
# -
|
|
1489
|
-
# - ios.print(obj, ...) -> nil
|
|
1459
|
+
# - print(*objects) -> nil
|
|
1490
1460
|
# -->
|
|
1491
|
-
# Writes the given
|
|
1461
|
+
# Writes the given objects to the stream; returns `nil`. Appends the output
|
|
1462
|
+
# record separator `$OUTPUT_RECORD_SEPARATOR` (`$\`), if it is not `nil`. See
|
|
1463
|
+
# [Line IO](rdoc-ref:IO@Line+IO).
|
|
1492
1464
|
#
|
|
1493
|
-
#
|
|
1494
|
-
# will be converted by calling its `to_s` method. When called without arguments,
|
|
1495
|
-
# prints the contents of `$_`.
|
|
1465
|
+
# With argument `objects` given, for each object:
|
|
1496
1466
|
#
|
|
1497
|
-
#
|
|
1498
|
-
#
|
|
1499
|
-
# the output
|
|
1467
|
+
# * Converts via its method `to_s` if not a string.
|
|
1468
|
+
# * Writes to the stream.
|
|
1469
|
+
# * If not the last object, writes the output field separator
|
|
1470
|
+
# `$OUTPUT_FIELD_SEPARATOR` (`$,`) if it is not `nil`.
|
|
1500
1471
|
#
|
|
1501
|
-
# $stdout.print("This is ", 100, " percent.\n")
|
|
1502
1472
|
#
|
|
1503
|
-
#
|
|
1473
|
+
# With default separators:
|
|
1504
1474
|
#
|
|
1505
|
-
#
|
|
1475
|
+
# f = File.open('t.tmp', 'w+')
|
|
1476
|
+
# objects = [0, 0.0, Rational(0, 1), Complex(0, 0), :zero, 'zero']
|
|
1477
|
+
# p $OUTPUT_RECORD_SEPARATOR
|
|
1478
|
+
# p $OUTPUT_FIELD_SEPARATOR
|
|
1479
|
+
# f.print(*objects)
|
|
1480
|
+
# f.rewind
|
|
1481
|
+
# p f.read
|
|
1482
|
+
# f.close
|
|
1483
|
+
#
|
|
1484
|
+
# Output:
|
|
1485
|
+
#
|
|
1486
|
+
# nil
|
|
1487
|
+
# nil
|
|
1488
|
+
# "00.00/10+0izerozero"
|
|
1489
|
+
#
|
|
1490
|
+
# With specified separators:
|
|
1491
|
+
#
|
|
1492
|
+
# $\ = "\n"
|
|
1493
|
+
# $, = ','
|
|
1494
|
+
# f.rewind
|
|
1495
|
+
# f.print(*objects)
|
|
1496
|
+
# f.rewind
|
|
1497
|
+
# p f.read
|
|
1498
|
+
#
|
|
1499
|
+
# Output:
|
|
1500
|
+
#
|
|
1501
|
+
# "0,0.0,0/1,0+0i,zero,zero\n"
|
|
1502
|
+
#
|
|
1503
|
+
# With no argument given, writes the content of `$_` (which is usually the most
|
|
1504
|
+
# recent user input):
|
|
1505
|
+
#
|
|
1506
|
+
# f = File.open('t.tmp', 'w+')
|
|
1507
|
+
# gets # Sets $_ to the most recent user input.
|
|
1508
|
+
# f.print
|
|
1509
|
+
# f.close
|
|
1506
1510
|
#
|
|
1507
1511
|
def print: (*untyped arg0) -> NilClass
|
|
1508
1512
|
|
|
1509
1513
|
# <!--
|
|
1510
1514
|
# rdoc-file=io.c
|
|
1511
|
-
# -
|
|
1515
|
+
# - printf(format_string, *objects) -> nil
|
|
1512
1516
|
# -->
|
|
1513
|
-
# Formats and writes to
|
|
1514
|
-
#
|
|
1517
|
+
# Formats and writes `objects` to the stream.
|
|
1518
|
+
#
|
|
1519
|
+
# For details on `format_string`, see [Format
|
|
1520
|
+
# Specifications](rdoc-ref:format_specifications.rdoc).
|
|
1515
1521
|
#
|
|
1516
1522
|
def printf: (String format_string, *untyped arg0) -> NilClass
|
|
1517
1523
|
|
|
1518
1524
|
# <!--
|
|
1519
1525
|
# rdoc-file=io.c
|
|
1520
|
-
# -
|
|
1526
|
+
# - putc(object) -> object
|
|
1521
1527
|
# -->
|
|
1522
|
-
#
|
|
1523
|
-
#
|
|
1524
|
-
#
|
|
1528
|
+
# Writes a character to the stream. See [Character
|
|
1529
|
+
# IO](rdoc-ref:IO@Character+IO).
|
|
1530
|
+
#
|
|
1531
|
+
# If `object` is numeric, converts to integer if necessary, then writes the
|
|
1532
|
+
# character whose code is the least significant byte; if `object` is a string,
|
|
1533
|
+
# writes the first character:
|
|
1525
1534
|
#
|
|
1526
1535
|
# $stdout.putc "A"
|
|
1527
1536
|
# $stdout.putc 65
|
|
1528
1537
|
#
|
|
1529
|
-
#
|
|
1538
|
+
# Output:
|
|
1530
1539
|
#
|
|
1531
1540
|
# AA
|
|
1532
1541
|
#
|
|
@@ -1534,40 +1543,60 @@ class IO < Object
|
|
|
1534
1543
|
|
|
1535
1544
|
# <!--
|
|
1536
1545
|
# rdoc-file=io.c
|
|
1537
|
-
# -
|
|
1546
|
+
# - puts(*objects) -> nil
|
|
1538
1547
|
# -->
|
|
1539
|
-
# Writes the given
|
|
1540
|
-
#
|
|
1548
|
+
# Writes the given `objects` to the stream, which must be open for writing;
|
|
1549
|
+
# returns `nil`.\ Writes a newline after each that does not already end with a
|
|
1550
|
+
# newline sequence. If called without arguments, writes a newline. See [Line
|
|
1551
|
+
# IO](rdoc-ref:IO@Line+IO).
|
|
1541
1552
|
#
|
|
1542
|
-
#
|
|
1543
|
-
#
|
|
1544
|
-
# array will be converted by calling its `to_s` method. If called without
|
|
1545
|
-
# arguments, outputs a single newline.
|
|
1553
|
+
# Note that each added newline is the character `"\n"<//tt>, not the output
|
|
1554
|
+
# record separator (<tt>$\`).
|
|
1546
1555
|
#
|
|
1547
|
-
#
|
|
1556
|
+
# Treatment for each object:
|
|
1548
1557
|
#
|
|
1549
|
-
# *
|
|
1558
|
+
# * String: writes the string.
|
|
1559
|
+
# * Neither string nor array: writes `object.to_s`.
|
|
1560
|
+
# * Array: writes each element of the array; arrays may be nested.
|
|
1561
|
+
#
|
|
1562
|
+
#
|
|
1563
|
+
# To keep these examples brief, we define this helper method:
|
|
1564
|
+
#
|
|
1565
|
+
# def show(*objects)
|
|
1566
|
+
# # Puts objects to file.
|
|
1567
|
+
# f = File.new('t.tmp', 'w+')
|
|
1568
|
+
# f.puts(objects)
|
|
1569
|
+
# # Return file content.
|
|
1570
|
+
# f.rewind
|
|
1571
|
+
# p f.read
|
|
1572
|
+
# f.close
|
|
1573
|
+
# end
|
|
1550
1574
|
#
|
|
1551
|
-
#
|
|
1552
|
-
#
|
|
1553
|
-
#
|
|
1554
|
-
#
|
|
1575
|
+
# # Strings without newlines.
|
|
1576
|
+
# show('foo', 'bar', 'baz') # => "foo\nbar\nbaz\n"
|
|
1577
|
+
# # Strings, some with newlines.
|
|
1578
|
+
# show("foo\n", 'bar', "baz\n") # => "foo\nbar\nbaz\n"
|
|
1555
1579
|
#
|
|
1556
|
-
#
|
|
1557
|
-
#
|
|
1580
|
+
# # Neither strings nor arrays:
|
|
1581
|
+
# show(0, 0.0, Rational(0, 1), Complex(9, 0), :zero)
|
|
1582
|
+
# # => "0\n0.0\n0/1\n9+0i\nzero\n"
|
|
1583
|
+
#
|
|
1584
|
+
# # Array of strings.
|
|
1585
|
+
# show(['foo', "bar\n", 'baz']) # => "foo\nbar\nbaz\n"
|
|
1586
|
+
# # Nested arrays.
|
|
1587
|
+
# show([[[0, 1], 2, 3], 4, 5]) # => "0\n1\n2\n3\n4\n5\n"
|
|
1558
1588
|
#
|
|
1559
1589
|
def puts: (*untyped arg0) -> NilClass
|
|
1560
1590
|
|
|
1561
1591
|
# <!--
|
|
1562
1592
|
# rdoc-file=io.c
|
|
1563
|
-
# - read(maxlen = nil)
|
|
1564
|
-
# - read(maxlen = nil, out_string) -> out_string or nil
|
|
1593
|
+
# - read(maxlen = nil, out_string = nil) -> new_string, out_string, or nil
|
|
1565
1594
|
# -->
|
|
1566
|
-
# Reads bytes from the stream
|
|
1595
|
+
# Reads bytes from the stream; the stream must be opened for reading (see
|
|
1596
|
+
# [Access Modes](rdoc-ref:File@Access+Modes)):
|
|
1567
1597
|
#
|
|
1568
|
-
# * If `maxlen` is `nil`, reads all bytes.
|
|
1569
|
-
# * Otherwise reads `maxlen` bytes
|
|
1570
|
-
# * Otherwise reads all bytes.
|
|
1598
|
+
# * If `maxlen` is `nil`, reads all bytes using the stream's data mode.
|
|
1599
|
+
# * Otherwise reads up to `maxlen` bytes in binary mode.
|
|
1571
1600
|
#
|
|
1572
1601
|
#
|
|
1573
1602
|
# Returns a string (either a new string or the given `out_string`) containing
|
|
@@ -1589,11 +1618,12 @@ class IO < Object
|
|
|
1589
1618
|
#
|
|
1590
1619
|
# f = File.new('t.txt')
|
|
1591
1620
|
# f.read
|
|
1592
|
-
# # => "
|
|
1621
|
+
# # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
1593
1622
|
# f.rewind
|
|
1594
|
-
# f.read(
|
|
1595
|
-
# f.read(
|
|
1596
|
-
# f.read(
|
|
1623
|
+
# f.read(30) # => "First line\r\nSecond line\r\n\r\nFou"
|
|
1624
|
+
# f.read(30) # => "rth line\r\nFifth line\r\n"
|
|
1625
|
+
# f.read(30) # => nil
|
|
1626
|
+
# f.close
|
|
1597
1627
|
#
|
|
1598
1628
|
# If `maxlen` is zero, returns an empty string.
|
|
1599
1629
|
#
|
|
@@ -1604,18 +1634,19 @@ class IO < Object
|
|
|
1604
1634
|
#
|
|
1605
1635
|
# f = File.new('t.txt')
|
|
1606
1636
|
# s = 'foo' # => "foo"
|
|
1607
|
-
# f.read(nil, s) # => "
|
|
1608
|
-
# s # => "
|
|
1637
|
+
# f.read(nil, s) # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
1638
|
+
# s # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
1609
1639
|
# f.rewind
|
|
1610
1640
|
# s = 'bar'
|
|
1611
|
-
# f.read(
|
|
1612
|
-
# s # => "
|
|
1641
|
+
# f.read(30, s) # => "First line\r\nSecond line\r\n\r\nFou"
|
|
1642
|
+
# s # => "First line\r\nSecond line\r\n\r\nFou"
|
|
1613
1643
|
# s = 'baz'
|
|
1614
|
-
# f.read(
|
|
1615
|
-
# s # => "
|
|
1644
|
+
# f.read(30, s) # => "rth line\r\nFifth line\r\n"
|
|
1645
|
+
# s # => "rth line\r\nFifth line\r\n"
|
|
1616
1646
|
# s = 'bat'
|
|
1617
|
-
# f.read(
|
|
1647
|
+
# f.read(30, s) # => nil
|
|
1618
1648
|
# s # => ""
|
|
1649
|
+
# f.close
|
|
1619
1650
|
#
|
|
1620
1651
|
# Note that this method behaves like the fread() function in C. This means it
|
|
1621
1652
|
# retries to invoke read(2) system calls to read data with the specified maxlen
|
|
@@ -1627,6 +1658,8 @@ class IO < Object
|
|
|
1627
1658
|
# If you need the behavior like a single read(2) system call, consider
|
|
1628
1659
|
# #readpartial, #read_nonblock, and #sysread.
|
|
1629
1660
|
#
|
|
1661
|
+
# Related: IO#write.
|
|
1662
|
+
#
|
|
1630
1663
|
def read: (?int? length, ?string outbuf) -> String?
|
|
1631
1664
|
|
|
1632
1665
|
# <!--
|
|
@@ -1687,54 +1720,113 @@ class IO < Object
|
|
|
1687
1720
|
|
|
1688
1721
|
# <!--
|
|
1689
1722
|
# rdoc-file=io.c
|
|
1690
|
-
# -
|
|
1723
|
+
# - readbyte -> integer
|
|
1691
1724
|
# -->
|
|
1692
|
-
# Reads
|
|
1725
|
+
# Reads and returns the next byte (in range 0..255) from the stream; raises
|
|
1726
|
+
# EOFError if already at end-of-stream. See [Byte IO](rdoc-ref:IO@Byte+IO).
|
|
1727
|
+
#
|
|
1728
|
+
# f = File.open('t.txt')
|
|
1729
|
+
# f.readbyte # => 70
|
|
1730
|
+
# f.close
|
|
1731
|
+
# f = File.open('t.rus')
|
|
1732
|
+
# f.readbyte # => 209
|
|
1733
|
+
# f.close
|
|
1734
|
+
#
|
|
1735
|
+
# Related: IO#getbyte (will not raise EOFError).
|
|
1693
1736
|
#
|
|
1694
1737
|
def readbyte: () -> Integer
|
|
1695
1738
|
|
|
1696
1739
|
# <!--
|
|
1697
1740
|
# rdoc-file=io.c
|
|
1698
|
-
# -
|
|
1741
|
+
# - readchar -> string
|
|
1699
1742
|
# -->
|
|
1700
|
-
# Reads
|
|
1743
|
+
# Reads and returns the next 1-character string from the stream; raises EOFError
|
|
1744
|
+
# if already at end-of-stream. See [Character IO](rdoc-ref:IO@Character+IO).
|
|
1701
1745
|
#
|
|
1702
|
-
# f = File.
|
|
1703
|
-
# f.readchar
|
|
1704
|
-
# f.
|
|
1746
|
+
# f = File.open('t.txt')
|
|
1747
|
+
# f.readchar # => "F"
|
|
1748
|
+
# f.close
|
|
1749
|
+
# f = File.open('t.rus')
|
|
1750
|
+
# f.readchar.ord # => 1090
|
|
1751
|
+
# f.close
|
|
1752
|
+
#
|
|
1753
|
+
# Related: IO#getc (will not raise EOFError).
|
|
1705
1754
|
#
|
|
1706
1755
|
def readchar: () -> String
|
|
1707
1756
|
|
|
1708
1757
|
# <!--
|
|
1709
1758
|
# rdoc-file=io.c
|
|
1710
|
-
# -
|
|
1711
|
-
# -
|
|
1712
|
-
# -
|
|
1759
|
+
# - readline(sep = $/, chomp: false) -> string
|
|
1760
|
+
# - readline(limit, chomp: false) -> string
|
|
1761
|
+
# - readline(sep, limit, chomp: false) -> string
|
|
1762
|
+
# -->
|
|
1763
|
+
# Reads a line as with IO#gets, but raises EOFError if already at end-of-stream.
|
|
1764
|
+
#
|
|
1765
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
|
1766
|
+
# omitted.
|
|
1767
|
+
#
|
|
1768
|
+
def readline: (?String sep, ?Integer limit) -> String
|
|
1769
|
+
|
|
1770
|
+
# <!--
|
|
1771
|
+
# rdoc-file=io.c
|
|
1772
|
+
# - readlines(sep = $/, chomp: false) -> array
|
|
1773
|
+
# - readlines(limit, chomp: false) -> array
|
|
1774
|
+
# - readlines(sep, limit, chomp: false) -> array
|
|
1713
1775
|
# -->
|
|
1714
|
-
# Reads
|
|
1776
|
+
# Reads and returns all remaining line from the stream; does not modify `$_`.
|
|
1777
|
+
# See [Line IO](rdoc-ref:IO@Line+IO).
|
|
1778
|
+
#
|
|
1779
|
+
# With no arguments given, returns lines as determined by line separator `$/`,
|
|
1780
|
+
# or `nil` if none:
|
|
1781
|
+
#
|
|
1782
|
+
# f = File.new('t.txt')
|
|
1783
|
+
# f.readlines
|
|
1784
|
+
# # => ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
|
1785
|
+
# f.readlines # => []
|
|
1786
|
+
# f.close
|
|
1787
|
+
#
|
|
1788
|
+
# With only string argument `sep` given, returns lines as determined by line
|
|
1789
|
+
# separator `sep`, or `nil` if none; see [Line
|
|
1790
|
+
# Separator](rdoc-ref:IO@Line+Separator):
|
|
1791
|
+
#
|
|
1792
|
+
# f = File.new('t.txt')
|
|
1793
|
+
# f.readlines('li')
|
|
1794
|
+
# # => ["First li", "ne\nSecond li", "ne\n\nFourth li", "ne\nFifth li", "ne\n"]
|
|
1795
|
+
# f.close
|
|
1796
|
+
#
|
|
1797
|
+
# The two special values for `sep` are honored:
|
|
1798
|
+
#
|
|
1799
|
+
# f = File.new('t.txt')
|
|
1800
|
+
# # Get all into one string.
|
|
1801
|
+
# f.readlines(nil)
|
|
1802
|
+
# # => ["First line\nSecond line\n\nFourth line\nFifth line\n"]
|
|
1803
|
+
# # Get paragraphs (up to two line separators).
|
|
1804
|
+
# f.rewind
|
|
1805
|
+
# f.readlines('')
|
|
1806
|
+
# # => ["First line\nSecond line\n\n", "Fourth line\nFifth line\n"]
|
|
1807
|
+
# f.close
|
|
1808
|
+
#
|
|
1809
|
+
# With only integer argument `limit` given, limits the number of bytes in each
|
|
1810
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
|
1715
1811
|
#
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
#
|
|
1719
|
-
#
|
|
1720
|
-
# - ios.readlines(sep=$/ [, getline_args]) -> array
|
|
1721
|
-
# - ios.readlines(limit [, getline_args]) -> array
|
|
1722
|
-
# - ios.readlines(sep, limit [, getline_args]) -> array
|
|
1723
|
-
# -->
|
|
1724
|
-
# Reads all of the lines in *ios*, and returns them in an array. Lines are
|
|
1725
|
-
# separated by the optional *sep*. If *sep* is `nil`, the rest of the stream is
|
|
1726
|
-
# returned as a single record. If the first argument is an integer, or an
|
|
1727
|
-
# optional second argument is given, the returning string would not be longer
|
|
1728
|
-
# than the given value in bytes. The stream must be opened for reading or an
|
|
1729
|
-
# IOError will be raised.
|
|
1812
|
+
# f = File.new('t.txt')
|
|
1813
|
+
# f.readlines(8)
|
|
1814
|
+
# # => ["First li", "ne\n", "Second l", "ine\n", "\n", "Fourth l", "ine\n", "Fifth li", "ne\n"]
|
|
1815
|
+
# f.close
|
|
1730
1816
|
#
|
|
1731
|
-
#
|
|
1732
|
-
# f.readlines[0] #=> "This is line one\n"
|
|
1817
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
|
1733
1818
|
#
|
|
1734
|
-
#
|
|
1735
|
-
#
|
|
1819
|
+
# * Returns lines as determined by line separator `sep`.
|
|
1820
|
+
# * But returns no more bytes in a line than are allowed by the limit.
|
|
1736
1821
|
#
|
|
1737
|
-
#
|
|
1822
|
+
#
|
|
1823
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
|
1824
|
+
# omitted:
|
|
1825
|
+
#
|
|
1826
|
+
# f = File.new('t.txt')
|
|
1827
|
+
# f.readlines(chomp: true)
|
|
1828
|
+
# # => ["First line", "Second line", "", "Fourth line", "Fifth line"]
|
|
1829
|
+
# f.close
|
|
1738
1830
|
#
|
|
1739
1831
|
def readlines: (?String sep, ?Integer limit) -> ::Array[String]
|
|
1740
1832
|
|
|
@@ -1758,20 +1850,21 @@ class IO < Object
|
|
|
1758
1850
|
# string:
|
|
1759
1851
|
#
|
|
1760
1852
|
# f = File.new('t.txt')
|
|
1761
|
-
# f.readpartial(
|
|
1762
|
-
# f.readpartial(
|
|
1763
|
-
# f.readpartial(
|
|
1764
|
-
# f.
|
|
1765
|
-
# f.
|
|
1853
|
+
# f.readpartial(20) # => "First line\nSecond l"
|
|
1854
|
+
# f.readpartial(20) # => "ine\n\nFourth line\n"
|
|
1855
|
+
# f.readpartial(20) # => "Fifth line\n"
|
|
1856
|
+
# f.readpartial(20) # Raises EOFError.
|
|
1857
|
+
# f.close
|
|
1766
1858
|
#
|
|
1767
1859
|
# With both argument `maxlen` and string argument `out_string` given, returns
|
|
1768
1860
|
# modified `out_string`:
|
|
1769
1861
|
#
|
|
1770
1862
|
# f = File.new('t.txt')
|
|
1771
1863
|
# s = 'foo'
|
|
1772
|
-
# f.readpartial(
|
|
1864
|
+
# f.readpartial(20, s) # => "First line\nSecond l"
|
|
1773
1865
|
# s = 'bar'
|
|
1774
1866
|
# f.readpartial(0, s) # => ""
|
|
1867
|
+
# f.close
|
|
1775
1868
|
#
|
|
1776
1869
|
# This method is useful for a stream such as a pipe, a socket, or a tty. It
|
|
1777
1870
|
# blocks only when no data is immediately available. This means that it blocks
|
|
@@ -1835,18 +1928,34 @@ class IO < Object
|
|
|
1835
1928
|
|
|
1836
1929
|
# <!--
|
|
1837
1930
|
# rdoc-file=io.c
|
|
1838
|
-
# -
|
|
1839
|
-
# -
|
|
1931
|
+
# - reopen(other_io) -> self
|
|
1932
|
+
# - reopen(path, mode = 'r', **opts) -> self
|
|
1840
1933
|
# -->
|
|
1841
|
-
# Reassociates
|
|
1842
|
-
#
|
|
1843
|
-
#
|
|
1934
|
+
# Reassociates the stream with another stream, which may be of a different
|
|
1935
|
+
# class. This method may be used to redirect an existing stream to a new
|
|
1936
|
+
# destination.
|
|
1937
|
+
#
|
|
1938
|
+
# With argument `other_io` given, reassociates with that stream:
|
|
1939
|
+
#
|
|
1940
|
+
# # Redirect $stdin from a file.
|
|
1941
|
+
# f = File.open('t.txt')
|
|
1942
|
+
# $stdin.reopen(f)
|
|
1943
|
+
# f.close
|
|
1944
|
+
#
|
|
1945
|
+
# # Redirect $stdout to a file.
|
|
1946
|
+
# f = File.open('t.tmp', 'w')
|
|
1947
|
+
# $stdout.reopen(f)
|
|
1948
|
+
# f.close
|
|
1949
|
+
#
|
|
1950
|
+
# With argument `path` given, reassociates with a new stream to that file path:
|
|
1951
|
+
#
|
|
1952
|
+
# $stdin.reopen('t.txt')
|
|
1953
|
+
# $stdout.reopen('t.tmp', 'w')
|
|
1954
|
+
#
|
|
1955
|
+
# Optional keyword arguments `opts` specify:
|
|
1844
1956
|
#
|
|
1845
|
-
#
|
|
1846
|
-
#
|
|
1847
|
-
# f2.readlines[0] #=> "This is line one\n"
|
|
1848
|
-
# f2.reopen(f1) #=> #<File:testfile>
|
|
1849
|
-
# f2.readlines[0] #=> "This is line one\n"
|
|
1957
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
1958
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
1850
1959
|
#
|
|
1851
1960
|
def reopen: (IO other_IO_or_path) -> IO
|
|
1852
1961
|
| (String other_IO_or_path, ?String mode_str) -> IO
|
|
@@ -1856,18 +1965,19 @@ class IO < Object
|
|
|
1856
1965
|
# - rewind -> 0
|
|
1857
1966
|
# -->
|
|
1858
1967
|
# Repositions the stream to its beginning, setting both the position and the
|
|
1859
|
-
# line number to zero; see [Position](
|
|
1860
|
-
# Number](
|
|
1968
|
+
# line number to zero; see [Position](rdoc-ref:IO@Position) and [Line
|
|
1969
|
+
# Number](rdoc-ref:IO@Line+Number):
|
|
1861
1970
|
#
|
|
1862
1971
|
# f = File.open('t.txt')
|
|
1863
1972
|
# f.tell # => 0
|
|
1864
1973
|
# f.lineno # => 0
|
|
1865
|
-
# f.
|
|
1866
|
-
# f.tell # =>
|
|
1974
|
+
# f.gets # => "First line\n"
|
|
1975
|
+
# f.tell # => 12
|
|
1867
1976
|
# f.lineno # => 1
|
|
1868
1977
|
# f.rewind # => 0
|
|
1869
1978
|
# f.tell # => 0
|
|
1870
1979
|
# f.lineno # => 0
|
|
1980
|
+
# f.close
|
|
1871
1981
|
#
|
|
1872
1982
|
# Note that this method cannot be used with streams such as pipes, ttys, and
|
|
1873
1983
|
# sockets.
|
|
@@ -1879,7 +1989,7 @@ class IO < Object
|
|
|
1879
1989
|
# - seek(offset, whence = IO::SEEK_SET) -> 0
|
|
1880
1990
|
# -->
|
|
1881
1991
|
# Seeks to the position given by integer `offset` (see
|
|
1882
|
-
# [Position](
|
|
1992
|
+
# [Position](rdoc-ref:IO@Position)) and constant `whence`, which is one of:
|
|
1883
1993
|
#
|
|
1884
1994
|
# * `:CUR` or `IO::SEEK_CUR`: Repositions the stream to its current position
|
|
1885
1995
|
# plus the given `offset`:
|
|
@@ -1890,6 +2000,7 @@ class IO < Object
|
|
|
1890
2000
|
# f.tell # => 20
|
|
1891
2001
|
# f.seek(-10, :CUR) # => 0
|
|
1892
2002
|
# f.tell # => 10
|
|
2003
|
+
# f.close
|
|
1893
2004
|
#
|
|
1894
2005
|
# * `:END` or `IO::SEEK_END`: Repositions the stream to its end plus the given
|
|
1895
2006
|
# `offset`:
|
|
@@ -1897,11 +2008,12 @@ class IO < Object
|
|
|
1897
2008
|
# f = File.open('t.txt')
|
|
1898
2009
|
# f.tell # => 0
|
|
1899
2010
|
# f.seek(0, :END) # => 0 # Repositions to stream end.
|
|
1900
|
-
# f.tell # =>
|
|
2011
|
+
# f.tell # => 52
|
|
1901
2012
|
# f.seek(-20, :END) # => 0
|
|
1902
|
-
# f.tell # =>
|
|
2013
|
+
# f.tell # => 32
|
|
1903
2014
|
# f.seek(-40, :END) # => 0
|
|
1904
|
-
# f.tell # =>
|
|
2015
|
+
# f.tell # => 12
|
|
2016
|
+
# f.close
|
|
1905
2017
|
#
|
|
1906
2018
|
# * `:SET` or `IO:SEEK_SET`: Repositions the stream to the given `offset`:
|
|
1907
2019
|
#
|
|
@@ -1911,6 +2023,7 @@ class IO < Object
|
|
|
1911
2023
|
# f.tell # => 20
|
|
1912
2024
|
# f.seek(40, :SET) # => 0
|
|
1913
2025
|
# f.tell # => 40
|
|
2026
|
+
# f.close
|
|
1914
2027
|
#
|
|
1915
2028
|
#
|
|
1916
2029
|
# Related: IO#pos=, IO#tell.
|
|
@@ -1919,39 +2032,49 @@ class IO < Object
|
|
|
1919
2032
|
|
|
1920
2033
|
# <!--
|
|
1921
2034
|
# rdoc-file=io.c
|
|
1922
|
-
# -
|
|
1923
|
-
# -
|
|
1924
|
-
# -
|
|
1925
|
-
# - io.set_encoding("ext_enc:int_enc", opt) -> io
|
|
1926
|
-
# - io.set_encoding(ext_enc, int_enc, opt) -> io
|
|
2035
|
+
# - set_encoding(ext_enc) -> self
|
|
2036
|
+
# - set_encoding(ext_enc, int_enc, **enc_opts) -> self
|
|
2037
|
+
# - set_encoding('ext_enc:int_enc', **enc_opts) -> self
|
|
1927
2038
|
# -->
|
|
1928
|
-
#
|
|
1929
|
-
#
|
|
1930
|
-
#
|
|
1931
|
-
#
|
|
1932
|
-
#
|
|
1933
|
-
#
|
|
1934
|
-
#
|
|
1935
|
-
#
|
|
2039
|
+
# See [Encodings](rdoc-ref:File@Encodings).
|
|
2040
|
+
#
|
|
2041
|
+
# Argument `ext_enc`, if given, must be an Encoding object; it is assigned as
|
|
2042
|
+
# the encoding for the stream.
|
|
2043
|
+
#
|
|
2044
|
+
# Argument `int_enc`, if given, must be an Encoding object; it is assigned as
|
|
2045
|
+
# the encoding for the internal string.
|
|
2046
|
+
#
|
|
2047
|
+
# Argument `'ext_enc:int_enc'`, if given, is a string containing two
|
|
2048
|
+
# colon-separated encoding names; corresponding Encoding objects are assigned as
|
|
2049
|
+
# the external and internal encodings for the stream.
|
|
2050
|
+
#
|
|
2051
|
+
# Optional keyword arguments `enc_opts` specify [Encoding
|
|
2052
|
+
# options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
1936
2053
|
#
|
|
1937
2054
|
def set_encoding: (?String | Encoding ext_or_ext_int_enc) -> self
|
|
1938
2055
|
| (?String | Encoding ext_or_ext_int_enc, ?String | Encoding int_enc) -> self
|
|
1939
2056
|
|
|
1940
2057
|
# <!--
|
|
1941
2058
|
# rdoc-file=io.c
|
|
1942
|
-
# -
|
|
2059
|
+
# - set_encoding_by_bom -> encoding or nil
|
|
1943
2060
|
# -->
|
|
1944
|
-
#
|
|
1945
|
-
#
|
|
1946
|
-
#
|
|
2061
|
+
# If the stream begins with a BOM ([byte order
|
|
2062
|
+
# marker](https://en.wikipedia.org/wiki/Byte_order_mark)), consumes the BOM and
|
|
2063
|
+
# sets the external encoding accordingly; returns the result encoding if found,
|
|
2064
|
+
# or `nil` otherwise:
|
|
2065
|
+
#
|
|
2066
|
+
# File.write('t.tmp', "\u{FEFF}abc")
|
|
2067
|
+
# io = File.open('t.tmp', 'rb')
|
|
2068
|
+
# io.set_encoding_by_bom # => #<Encoding:UTF-8>
|
|
2069
|
+
# io.close
|
|
1947
2070
|
#
|
|
1948
|
-
# File.write(
|
|
1949
|
-
#
|
|
1950
|
-
#
|
|
2071
|
+
# File.write('t.tmp', 'abc')
|
|
2072
|
+
# io = File.open('t.tmp', 'rb')
|
|
2073
|
+
# io.set_encoding_by_bom # => nil
|
|
2074
|
+
# io.close
|
|
1951
2075
|
#
|
|
1952
|
-
#
|
|
1953
|
-
#
|
|
1954
|
-
# ios.set_encoding_by_bom #=> nil
|
|
2076
|
+
# Raises an exception if the stream is not binmode or its encoding has already
|
|
2077
|
+
# been set.
|
|
1955
2078
|
#
|
|
1956
2079
|
def set_encoding_by_bom: () -> Encoding?
|
|
1957
2080
|
|
|
@@ -1981,6 +2104,7 @@ class IO < Object
|
|
|
1981
2104
|
# f.sync # => false
|
|
1982
2105
|
# f.sync = true
|
|
1983
2106
|
# f.sync # => true
|
|
2107
|
+
# f.close
|
|
1984
2108
|
#
|
|
1985
2109
|
def sync: () -> bool
|
|
1986
2110
|
|
|
@@ -2004,6 +2128,7 @@ class IO < Object
|
|
|
2004
2128
|
# f.sync # => false
|
|
2005
2129
|
# f.sync = true
|
|
2006
2130
|
# f.sync # => true
|
|
2131
|
+
# f.close
|
|
2007
2132
|
#
|
|
2008
2133
|
# Related: IO#fsync.
|
|
2009
2134
|
#
|
|
@@ -2011,46 +2136,41 @@ class IO < Object
|
|
|
2011
2136
|
|
|
2012
2137
|
# <!--
|
|
2013
2138
|
# rdoc-file=io.c
|
|
2014
|
-
# -
|
|
2139
|
+
# - sysread(maxlen) -> string
|
|
2140
|
+
# - sysread(maxlen, out_string) -> string
|
|
2015
2141
|
# -->
|
|
2016
|
-
#
|
|
2017
|
-
# string. Do not mix with other methods that read from *ios* or you may get
|
|
2018
|
-
# unpredictable results.
|
|
2142
|
+
# Behaves like IO#readpartial, except that it uses low-level system functions.
|
|
2019
2143
|
#
|
|
2020
|
-
#
|
|
2021
|
-
# which will receive the data. The *outbuf* will contain only the received data
|
|
2022
|
-
# after the method call even if it is not empty at the beginning.
|
|
2023
|
-
#
|
|
2024
|
-
# Raises SystemCallError on error and EOFError at end of file.
|
|
2025
|
-
#
|
|
2026
|
-
# f = File.new("testfile")
|
|
2027
|
-
# f.sysread(16) #=> "This is line one"
|
|
2144
|
+
# This method should not be used with other stream-reader methods.
|
|
2028
2145
|
#
|
|
2029
2146
|
def sysread: (Integer maxlen, String outbuf) -> String
|
|
2030
2147
|
|
|
2031
2148
|
# <!--
|
|
2032
2149
|
# rdoc-file=io.c
|
|
2033
|
-
# -
|
|
2150
|
+
# - sysseek(offset, whence = IO::SEEK_SET) -> integer
|
|
2034
2151
|
# -->
|
|
2035
|
-
#
|
|
2036
|
-
# (see IO#seek for values of *whence*). Returns the new offset into the file.
|
|
2152
|
+
# Behaves like IO#seek, except that it:
|
|
2037
2153
|
#
|
|
2038
|
-
#
|
|
2039
|
-
#
|
|
2040
|
-
# f.sysread(10) #=> "And so on."
|
|
2154
|
+
# * Uses low-level system functions.
|
|
2155
|
+
# * Returns the new position.
|
|
2041
2156
|
#
|
|
2042
2157
|
def sysseek: (Integer amount, ?Integer whence) -> Integer
|
|
2043
2158
|
|
|
2044
2159
|
# <!--
|
|
2045
2160
|
# rdoc-file=io.c
|
|
2046
|
-
# -
|
|
2161
|
+
# - syswrite(object) -> integer
|
|
2047
2162
|
# -->
|
|
2048
|
-
# Writes the given
|
|
2049
|
-
#
|
|
2050
|
-
#
|
|
2163
|
+
# Writes the given `object` to self, which must be opened for writing (see
|
|
2164
|
+
# Modes); returns the number bytes written. If `object` is not a string is
|
|
2165
|
+
# converted via method to_s:
|
|
2166
|
+
#
|
|
2167
|
+
# f = File.new('t.tmp', 'w')
|
|
2168
|
+
# f.syswrite('foo') # => 3
|
|
2169
|
+
# f.syswrite(30) # => 2
|
|
2170
|
+
# f.syswrite(:foo) # => 3
|
|
2171
|
+
# f.close
|
|
2051
2172
|
#
|
|
2052
|
-
#
|
|
2053
|
-
# f.syswrite("ABCDEF") #=> 6
|
|
2173
|
+
# This methods should not be used with other stream-writer methods.
|
|
2054
2174
|
#
|
|
2055
2175
|
def syswrite: (_ToS arg0) -> Integer
|
|
2056
2176
|
|
|
@@ -2059,12 +2179,13 @@ class IO < Object
|
|
|
2059
2179
|
# - tell -> integer
|
|
2060
2180
|
# -->
|
|
2061
2181
|
# Returns the current position (in bytes) in `self` (see
|
|
2062
|
-
# [Position](
|
|
2182
|
+
# [Position](rdoc-ref:IO@Position)):
|
|
2063
2183
|
#
|
|
2064
|
-
# f = File.
|
|
2065
|
-
# f.tell
|
|
2066
|
-
# f.
|
|
2067
|
-
# f.tell
|
|
2184
|
+
# f = File.open('t.txt')
|
|
2185
|
+
# f.tell # => 0
|
|
2186
|
+
# f.gets # => "First line\n"
|
|
2187
|
+
# f.tell # => 12
|
|
2188
|
+
# f.close
|
|
2068
2189
|
#
|
|
2069
2190
|
# Related: IO#pos=, IO#seek.
|
|
2070
2191
|
#
|
|
@@ -2072,6 +2193,34 @@ class IO < Object
|
|
|
2072
2193
|
#
|
|
2073
2194
|
def tell: () -> Integer
|
|
2074
2195
|
|
|
2196
|
+
# <!--
|
|
2197
|
+
# rdoc-file=io.c
|
|
2198
|
+
# - timeout -> duration or nil
|
|
2199
|
+
# -->
|
|
2200
|
+
# Get the internal timeout duration or nil if it was not set.
|
|
2201
|
+
#
|
|
2202
|
+
def timeout: () -> Numeric?
|
|
2203
|
+
|
|
2204
|
+
# <!--
|
|
2205
|
+
# rdoc-file=io.c
|
|
2206
|
+
# - timeout = duration -> duration
|
|
2207
|
+
# - timeout = nil -> nil
|
|
2208
|
+
# -->
|
|
2209
|
+
# Set the internal timeout to the specified duration or nil. The timeout applies
|
|
2210
|
+
# to all blocking operations where possible.
|
|
2211
|
+
#
|
|
2212
|
+
# This affects the following methods (but is not limited to): #gets, #puts,
|
|
2213
|
+
# #read, #write, #wait_readable and #wait_writable. This also affects blocking
|
|
2214
|
+
# socket operations like Socket#accept and Socket#connect.
|
|
2215
|
+
#
|
|
2216
|
+
# Some operations like File#open and IO#close are not affected by the timeout. A
|
|
2217
|
+
# timeout during a write operation may leave the IO in an inconsistent state,
|
|
2218
|
+
# e.g. data was partially written. Generally speaking, a timeout is a last ditch
|
|
2219
|
+
# effort to prevent an application from hanging on slow I/O operations, such as
|
|
2220
|
+
# those that occur during a slowloris attack.
|
|
2221
|
+
#
|
|
2222
|
+
def timeout=: (Numeric?) -> void
|
|
2223
|
+
|
|
2075
2224
|
# <!--
|
|
2076
2225
|
# rdoc-file=io.c
|
|
2077
2226
|
# - to_io -> self
|
|
@@ -2081,78 +2230,98 @@ class IO < Object
|
|
|
2081
2230
|
def to_io: () -> self
|
|
2082
2231
|
|
|
2083
2232
|
# <!-- rdoc-file=io.c -->
|
|
2084
|
-
# Returns `true` if
|
|
2085
|
-
# otherwise
|
|
2233
|
+
# Returns `true` if the stream is associated with a terminal device (tty),
|
|
2234
|
+
# `false` otherwise:
|
|
2235
|
+
#
|
|
2236
|
+
# f = File.new('t.txt').isatty #=> false
|
|
2237
|
+
# f.close
|
|
2238
|
+
# f = File.new('/dev/tty').isatty #=> true
|
|
2239
|
+
# f.close
|
|
2086
2240
|
#
|
|
2087
|
-
#
|
|
2088
|
-
# File.new("/dev/tty").isatty #=> true
|
|
2241
|
+
# IO#tty? is an alias for IO#isatty.
|
|
2089
2242
|
#
|
|
2090
2243
|
def tty?: () -> bool
|
|
2091
2244
|
|
|
2092
2245
|
# <!--
|
|
2093
2246
|
# rdoc-file=io.c
|
|
2094
|
-
# -
|
|
2095
|
-
# -
|
|
2247
|
+
# - ungetbyte(integer) -> nil
|
|
2248
|
+
# - ungetbyte(string) -> nil
|
|
2096
2249
|
# -->
|
|
2097
|
-
# Pushes back
|
|
2098
|
-
#
|
|
2099
|
-
#
|
|
2100
|
-
# previous read of at least a single byte from *ios*. However, it can support
|
|
2101
|
-
# additional bytes if there is space in the internal buffer to allow for it.
|
|
2250
|
+
# Pushes back ("unshifts") the given data onto the stream's buffer, placing the
|
|
2251
|
+
# data so that it is next to be read; returns `nil`. See [Byte
|
|
2252
|
+
# IO](rdoc-ref:IO@Byte+IO).
|
|
2102
2253
|
#
|
|
2103
|
-
#
|
|
2104
|
-
# b = f.getbyte #=> 0x38
|
|
2105
|
-
# f.ungetbyte(b) #=> nil
|
|
2106
|
-
# f.getbyte #=> 0x38
|
|
2254
|
+
# Note that:
|
|
2107
2255
|
#
|
|
2108
|
-
#
|
|
2109
|
-
#
|
|
2256
|
+
# * Calling the method has no effect with unbuffered reads (such as
|
|
2257
|
+
# IO#sysread).
|
|
2258
|
+
# * Calling #rewind on the stream discards the pushed-back data.
|
|
2110
2259
|
#
|
|
2111
|
-
# f = File.new("testfile") #=> #<File:testfile>
|
|
2112
|
-
# f.ungetbyte(0x102) #=> nil
|
|
2113
|
-
# f.getbyte #=> 0x2
|
|
2114
2260
|
#
|
|
2115
|
-
#
|
|
2116
|
-
# already been called previously:
|
|
2261
|
+
# When argument `integer` is given, uses only its low-order byte:
|
|
2117
2262
|
#
|
|
2118
|
-
#
|
|
2119
|
-
# f.
|
|
2120
|
-
# f.ungetbyte(
|
|
2121
|
-
# f.read
|
|
2263
|
+
# File.write('t.tmp', '012')
|
|
2264
|
+
# f = File.open('t.tmp')
|
|
2265
|
+
# f.ungetbyte(0x41) # => nil
|
|
2266
|
+
# f.read # => "A012"
|
|
2267
|
+
# f.rewind
|
|
2268
|
+
# f.ungetbyte(0x4243) # => nil
|
|
2269
|
+
# f.read # => "C012"
|
|
2270
|
+
# f.close
|
|
2122
2271
|
#
|
|
2123
|
-
#
|
|
2272
|
+
# When argument `string` is given, uses all bytes:
|
|
2273
|
+
#
|
|
2274
|
+
# File.write('t.tmp', '012')
|
|
2275
|
+
# f = File.open('t.tmp')
|
|
2276
|
+
# f.ungetbyte('A') # => nil
|
|
2277
|
+
# f.read # => "A012"
|
|
2278
|
+
# f.rewind
|
|
2279
|
+
# f.ungetbyte('BCDE') # => nil
|
|
2280
|
+
# f.read # => "BCDE012"
|
|
2281
|
+
# f.close
|
|
2124
2282
|
#
|
|
2125
2283
|
def ungetbyte: (String | Integer arg0) -> NilClass
|
|
2126
2284
|
|
|
2127
2285
|
# <!--
|
|
2128
2286
|
# rdoc-file=io.c
|
|
2129
|
-
# -
|
|
2130
|
-
# -
|
|
2287
|
+
# - ungetc(integer) -> nil
|
|
2288
|
+
# - ungetc(string) -> nil
|
|
2131
2289
|
# -->
|
|
2132
|
-
# Pushes back
|
|
2133
|
-
#
|
|
2134
|
-
#
|
|
2135
|
-
#
|
|
2136
|
-
#
|
|
2137
|
-
# allow for it.
|
|
2290
|
+
# Pushes back ("unshifts") the given data onto the stream's buffer, placing the
|
|
2291
|
+
# data so that it is next to be read; returns `nil`. See [Character
|
|
2292
|
+
# IO](rdoc-ref:IO@Character+IO).
|
|
2293
|
+
#
|
|
2294
|
+
# Note that:
|
|
2138
2295
|
#
|
|
2139
|
-
#
|
|
2140
|
-
#
|
|
2141
|
-
#
|
|
2142
|
-
# f.getc #=> "8"
|
|
2296
|
+
# * Calling the method has no effect with unbuffered reads (such as
|
|
2297
|
+
# IO#sysread).
|
|
2298
|
+
# * Calling #rewind on the stream discards the pushed-back data.
|
|
2143
2299
|
#
|
|
2144
|
-
# If given an integer, the integer must represent a valid codepoint in the
|
|
2145
|
-
# external encoding of *ios*.
|
|
2146
2300
|
#
|
|
2147
|
-
#
|
|
2148
|
-
#
|
|
2301
|
+
# When argument `integer` is given, interprets the integer as a character:
|
|
2302
|
+
#
|
|
2303
|
+
# File.write('t.tmp', '012')
|
|
2304
|
+
# f = File.open('t.tmp')
|
|
2305
|
+
# f.ungetc(0x41) # => nil
|
|
2306
|
+
# f.read # => "A012"
|
|
2307
|
+
# f.rewind
|
|
2308
|
+
# f.ungetc(0x0442) # => nil
|
|
2309
|
+
# f.getc.ord # => 1090
|
|
2310
|
+
# f.close
|
|
2149
2311
|
#
|
|
2150
|
-
#
|
|
2151
|
-
# f.ungetc("ab") #=> nil
|
|
2152
|
-
# f.ungetc("cd") #=> nil
|
|
2153
|
-
# f.read(5) #=> "cdab8"
|
|
2312
|
+
# When argument `string` is given, uses all characters:
|
|
2154
2313
|
#
|
|
2155
|
-
#
|
|
2314
|
+
# File.write('t.tmp', '012')
|
|
2315
|
+
# f = File.open('t.tmp')
|
|
2316
|
+
# f.ungetc('A') # => nil
|
|
2317
|
+
# f.read # => "A012"
|
|
2318
|
+
# f.rewind
|
|
2319
|
+
# f.ungetc("\u0442\u0435\u0441\u0442") # => nil
|
|
2320
|
+
# f.getc.ord # => 1090
|
|
2321
|
+
# f.getc.ord # => 1077
|
|
2322
|
+
# f.getc.ord # => 1089
|
|
2323
|
+
# f.getc.ord # => 1090
|
|
2324
|
+
# f.close
|
|
2156
2325
|
#
|
|
2157
2326
|
def ungetc: (String arg0) -> NilClass
|
|
2158
2327
|
|
|
@@ -2161,8 +2330,9 @@ class IO < Object
|
|
|
2161
2330
|
# - write(*objects) -> integer
|
|
2162
2331
|
# -->
|
|
2163
2332
|
# Writes each of the given `objects` to `self`, which must be opened for writing
|
|
2164
|
-
# (see [Modes](
|
|
2165
|
-
# each of `objects` that is not a string is converted via method
|
|
2333
|
+
# (see [Access Modes](rdoc-ref:File@Access+Modes)); returns the total number
|
|
2334
|
+
# bytes written; each of `objects` that is not a string is converted via method
|
|
2335
|
+
# `to_s`:
|
|
2166
2336
|
#
|
|
2167
2337
|
# $stdout.write('Hello', ', ', 'World!', "\n") # => 14
|
|
2168
2338
|
# $stdout.write('foo', :bar, 2, "\n") # => 8
|
|
@@ -2172,6 +2342,8 @@ class IO < Object
|
|
|
2172
2342
|
# Hello, World!
|
|
2173
2343
|
# foobar2
|
|
2174
2344
|
#
|
|
2345
|
+
# Related: IO#read.
|
|
2346
|
+
#
|
|
2175
2347
|
def write: (*_ToS string) -> Integer
|
|
2176
2348
|
|
|
2177
2349
|
# <!--
|
|
@@ -2233,145 +2405,237 @@ class IO < Object
|
|
|
2233
2405
|
|
|
2234
2406
|
# <!--
|
|
2235
2407
|
# rdoc-file=io.c
|
|
2236
|
-
# - IO.binread(
|
|
2237
|
-
# -
|
|
2408
|
+
# - IO.binread(command, length = nil, offset = 0) -> string or nil
|
|
2409
|
+
# - IO.binread(path, length = nil, offset = 0) -> string or nil
|
|
2238
2410
|
# -->
|
|
2239
|
-
#
|
|
2240
|
-
#
|
|
2241
|
-
# closed before returning. The open mode would be `"rb:ASCII-8BIT"`.
|
|
2411
|
+
# Behaves like IO.read, except that the stream is opened in binary mode with
|
|
2412
|
+
# ASCII-8BIT encoding.
|
|
2242
2413
|
#
|
|
2243
|
-
#
|
|
2244
|
-
#
|
|
2245
|
-
#
|
|
2246
|
-
# subprocess invocation.
|
|
2247
|
-
#
|
|
2248
|
-
# File.binread("testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
|
|
2249
|
-
# File.binread("testfile", 20) #=> "This is line one\nThi"
|
|
2250
|
-
# File.binread("testfile", 20, 10) #=> "ne one\nThis is line "
|
|
2251
|
-
# IO.binread("| cat testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
|
|
2252
|
-
#
|
|
2253
|
-
# See also IO.read for details about `name` and open_args.
|
|
2414
|
+
# When called from class IO (but not subclasses of IO), this method has
|
|
2415
|
+
# potential security vulnerabilities if called with untrusted input; see
|
|
2416
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2254
2417
|
#
|
|
2255
2418
|
def self.binread: (String name, ?Integer length, ?Integer offset) -> String
|
|
2256
2419
|
|
|
2257
2420
|
# <!--
|
|
2258
2421
|
# rdoc-file=io.c
|
|
2259
|
-
# - IO.binwrite(
|
|
2260
|
-
# - IO.binwrite(
|
|
2261
|
-
# - File.binwrite(name, string, [offset]) -> integer
|
|
2262
|
-
# - File.binwrite(name, string, [offset], open_args) -> integer
|
|
2422
|
+
# - IO.binwrite(command, string, offset = 0) -> integer
|
|
2423
|
+
# - IO.binwrite(path, string, offset = 0) -> integer
|
|
2263
2424
|
# -->
|
|
2264
|
-
#
|
|
2265
|
-
#
|
|
2425
|
+
# Behaves like IO.write, except that the stream is opened in binary mode with
|
|
2426
|
+
# ASCII-8BIT encoding.
|
|
2266
2427
|
#
|
|
2267
|
-
#
|
|
2268
|
-
#
|
|
2269
|
-
#
|
|
2270
|
-
# subprocess invocation.
|
|
2271
|
-
#
|
|
2272
|
-
# See also IO.read for details about `name` and open_args.
|
|
2428
|
+
# When called from class IO (but not subclasses of IO), this method has
|
|
2429
|
+
# potential security vulnerabilities if called with untrusted input; see
|
|
2430
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2273
2431
|
#
|
|
2274
2432
|
def self.binwrite: (String name, _ToS string, ?Integer offset, ?mode: String mode) -> Integer
|
|
2275
2433
|
|
|
2276
2434
|
# <!--
|
|
2277
2435
|
# rdoc-file=io.c
|
|
2278
|
-
# - IO.copy_stream(src, dst)
|
|
2279
|
-
# - IO.copy_stream(src, dst, copy_length)
|
|
2280
|
-
# - IO.copy_stream(src, dst, copy_length, src_offset)
|
|
2436
|
+
# - IO.copy_stream(src, dst, src_length = nil, src_offset = 0) -> integer
|
|
2281
2437
|
# -->
|
|
2282
|
-
#
|
|
2283
|
-
#
|
|
2284
|
-
#
|
|
2285
|
-
#
|
|
2286
|
-
#
|
|
2438
|
+
# Copies from the given `src` to the given `dst`, returning the number of bytes
|
|
2439
|
+
# copied.
|
|
2440
|
+
#
|
|
2441
|
+
# * The given `src` must be one of the following:
|
|
2442
|
+
#
|
|
2443
|
+
# * The path to a readable file, from which source data is to be read.
|
|
2444
|
+
# * An IO-like object, opened for reading and capable of responding to
|
|
2445
|
+
# method `:readpartial` or method `:read`.
|
|
2446
|
+
#
|
|
2447
|
+
#
|
|
2448
|
+
# * The given `dst` must be one of the following:
|
|
2449
|
+
#
|
|
2450
|
+
# * The path to a writable file, to which data is to be written.
|
|
2451
|
+
# * An IO-like object, opened for writing and capable of responding to
|
|
2452
|
+
# method `:write`.
|
|
2287
2453
|
#
|
|
2288
|
-
# This method returns the number of bytes copied.
|
|
2289
2454
|
#
|
|
2290
|
-
# If optional arguments are not given, the start position of the copy is the
|
|
2291
|
-
# beginning of the filename or the current file offset of the IO. The end
|
|
2292
|
-
# position of the copy is the end of file.
|
|
2293
2455
|
#
|
|
2294
|
-
#
|
|
2456
|
+
# The examples here use file `t.txt` as source:
|
|
2295
2457
|
#
|
|
2296
|
-
#
|
|
2458
|
+
# File.read('t.txt')
|
|
2459
|
+
# # => "First line\nSecond line\n\nThird line\nFourth line\n"
|
|
2460
|
+
# File.read('t.txt').size # => 47
|
|
2297
2461
|
#
|
|
2298
|
-
#
|
|
2299
|
-
#
|
|
2462
|
+
# If only arguments `src` and `dst` are given, the entire source stream is
|
|
2463
|
+
# copied:
|
|
2464
|
+
#
|
|
2465
|
+
# # Paths.
|
|
2466
|
+
# IO.copy_stream('t.txt', 't.tmp') # => 47
|
|
2467
|
+
#
|
|
2468
|
+
# # IOs (recall that a File is also an IO).
|
|
2469
|
+
# src_io = File.open('t.txt', 'r') # => #<File:t.txt>
|
|
2470
|
+
# dst_io = File.open('t.tmp', 'w') # => #<File:t.tmp>
|
|
2471
|
+
# IO.copy_stream(src_io, dst_io) # => 47
|
|
2472
|
+
# src_io.close
|
|
2473
|
+
# dst_io.close
|
|
2474
|
+
#
|
|
2475
|
+
# With argument `src_length` a non-negative integer, no more than that many
|
|
2476
|
+
# bytes are copied:
|
|
2477
|
+
#
|
|
2478
|
+
# IO.copy_stream('t.txt', 't.tmp', 10) # => 10
|
|
2479
|
+
# File.read('t.tmp') # => "First line"
|
|
2480
|
+
#
|
|
2481
|
+
# With argument `src_offset` also given, the source stream is read beginning at
|
|
2482
|
+
# that offset:
|
|
2483
|
+
#
|
|
2484
|
+
# IO.copy_stream('t.txt', 't.tmp', 11, 11) # => 11
|
|
2485
|
+
# IO.read('t.tmp') # => "Second line"
|
|
2300
2486
|
#
|
|
2301
2487
|
def self.copy_stream: (String | _Reader | _ReaderPartial src, String | _Writer dst, ?Integer copy_length, ?Integer src_offset) -> Integer
|
|
2302
2488
|
|
|
2303
2489
|
# <!--
|
|
2304
2490
|
# rdoc-file=io.c
|
|
2305
|
-
# - IO.popen(
|
|
2306
|
-
# - IO.popen(
|
|
2491
|
+
# - IO.popen(env = {}, cmd, mode = 'r', **opts) -> io
|
|
2492
|
+
# - IO.popen(env = {}, cmd, mode = 'r', **opts) {|io| ... } -> object
|
|
2307
2493
|
# -->
|
|
2308
|
-
#
|
|
2309
|
-
#
|
|
2494
|
+
# Executes the given command `cmd` as a subprocess whose $stdin and $stdout are
|
|
2495
|
+
# connected to a new stream `io`.
|
|
2310
2496
|
#
|
|
2311
|
-
#
|
|
2497
|
+
# This method has potential security vulnerabilities if called with untrusted
|
|
2498
|
+
# input; see [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2312
2499
|
#
|
|
2313
|
-
#
|
|
2500
|
+
# If no block is given, returns the new stream, which depending on given `mode`
|
|
2501
|
+
# may be open for reading, writing, or both. The stream should be explicitly
|
|
2502
|
+
# closed (eventually) to avoid resource leaks.
|
|
2314
2503
|
#
|
|
2315
|
-
#
|
|
2316
|
-
#
|
|
2317
|
-
#
|
|
2318
|
-
# [env, cmdname, arg1, ..., opts] : command name and zero or more arguments (no shell)
|
|
2319
|
-
# [env, [cmdname, argv0], arg1, ..., opts] : command name, argv[0] and zero or more arguments (no shell)
|
|
2320
|
-
# (env and opts are optional.)
|
|
2504
|
+
# If a block is given, the stream is passed to the block (again, open for
|
|
2505
|
+
# reading, writing, or both); when the block exits, the stream is closed, and
|
|
2506
|
+
# the block's value is assigned to global variable `$?` and returned.
|
|
2321
2507
|
#
|
|
2322
|
-
#
|
|
2323
|
-
#
|
|
2508
|
+
# Optional argument `mode` may be any valid IO mode. See [Access
|
|
2509
|
+
# Modes](rdoc-ref:File@Access+Modes).
|
|
2324
2510
|
#
|
|
2325
|
-
#
|
|
2326
|
-
# `argv` bypassing a shell. The array can contain a hash at first for
|
|
2327
|
-
# environments and a hash at last for options similar to #spawn.
|
|
2511
|
+
# Required argument `cmd` determines which of the following occurs:
|
|
2328
2512
|
#
|
|
2329
|
-
# The
|
|
2330
|
-
#
|
|
2331
|
-
# *
|
|
2513
|
+
# * The process forks.
|
|
2514
|
+
# * A specified program runs in a shell.
|
|
2515
|
+
# * A specified program runs with specified arguments.
|
|
2516
|
+
# * A specified program runs with specified arguments and a specified `argv0`.
|
|
2332
2517
|
#
|
|
2333
|
-
# # set IO encoding
|
|
2334
|
-
# IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
|
|
2335
|
-
# euc_jp_string = nkf_io.read
|
|
2336
|
-
# }
|
|
2337
2518
|
#
|
|
2338
|
-
#
|
|
2339
|
-
# # spawn option. See the document of Kernel.spawn.
|
|
2340
|
-
# IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
|
|
2341
|
-
# ls_result_with_error = ls_io.read
|
|
2342
|
-
# }
|
|
2519
|
+
# Each of these is detailed below.
|
|
2343
2520
|
#
|
|
2344
|
-
#
|
|
2345
|
-
#
|
|
2346
|
-
# ls_result_with_error = ls_io.read
|
|
2347
|
-
# }
|
|
2521
|
+
# The optional hash argument `env` specifies name/value pairs that are to be
|
|
2522
|
+
# added to the environment variables for the subprocess:
|
|
2348
2523
|
#
|
|
2349
|
-
#
|
|
2524
|
+
# IO.popen({'FOO' => 'bar'}, 'ruby', 'r+') do |pipe|
|
|
2525
|
+
# pipe.puts 'puts ENV["FOO"]'
|
|
2526
|
+
# pipe.close_write
|
|
2527
|
+
# pipe.gets
|
|
2528
|
+
# end => "bar\n"
|
|
2350
2529
|
#
|
|
2351
|
-
#
|
|
2352
|
-
# with a pipe. Ruby's end of the pipe will be passed as a parameter to the
|
|
2353
|
-
# block. At the end of block, Ruby closes the pipe and sets `$?`. In this case
|
|
2354
|
-
# IO.popen returns the value of the block.
|
|
2530
|
+
# Optional keyword arguments `opts` specify:
|
|
2355
2531
|
#
|
|
2356
|
-
#
|
|
2357
|
-
#
|
|
2358
|
-
#
|
|
2359
|
-
# version of the block will be passed `nil`, and the child's standard in and
|
|
2360
|
-
# standard out will be connected to the parent through the pipe. Not available
|
|
2361
|
-
# on all platforms.
|
|
2532
|
+
# * [Open options](rdoc-ref:IO@Open+Options).
|
|
2533
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
2534
|
+
# * Options for Kernel#spawn.
|
|
2362
2535
|
#
|
|
2363
|
-
#
|
|
2364
|
-
#
|
|
2365
|
-
#
|
|
2366
|
-
#
|
|
2367
|
-
#
|
|
2368
|
-
# IO.popen(
|
|
2369
|
-
#
|
|
2370
|
-
#
|
|
2371
|
-
#
|
|
2536
|
+
#
|
|
2537
|
+
# **Forked \Process**
|
|
2538
|
+
#
|
|
2539
|
+
# When argument `cmd` is the 1-character string `'-'`, causes the process to
|
|
2540
|
+
# fork:
|
|
2541
|
+
# IO.popen('-') do |pipe|
|
|
2542
|
+
# if pipe
|
|
2543
|
+
# $stderr.puts "In parent, child pid is #{pipe.pid}\n"
|
|
2544
|
+
# else
|
|
2545
|
+
# $stderr.puts "In child, pid is #{$$}\n"
|
|
2546
|
+
# end
|
|
2547
|
+
# end
|
|
2548
|
+
#
|
|
2549
|
+
# Output:
|
|
2550
|
+
#
|
|
2551
|
+
# In parent, child pid is 26253
|
|
2552
|
+
# In child, pid is 26253
|
|
2553
|
+
#
|
|
2554
|
+
# Note that this is not supported on all platforms.
|
|
2555
|
+
#
|
|
2556
|
+
# **Shell Subprocess**
|
|
2557
|
+
#
|
|
2558
|
+
# When argument `cmd` is a single string (but not `'-'`), the program named
|
|
2559
|
+
# `cmd` is run as a shell command:
|
|
2560
|
+
#
|
|
2561
|
+
# IO.popen('uname') do |pipe|
|
|
2562
|
+
# pipe.readlines
|
|
2563
|
+
# end
|
|
2564
|
+
#
|
|
2565
|
+
# Output:
|
|
2566
|
+
#
|
|
2567
|
+
# ["Linux\n"]
|
|
2568
|
+
#
|
|
2569
|
+
# Another example:
|
|
2570
|
+
#
|
|
2571
|
+
# IO.popen('/bin/sh', 'r+') do |pipe|
|
|
2572
|
+
# pipe.puts('ls')
|
|
2573
|
+
# pipe.close_write
|
|
2574
|
+
# $stderr.puts pipe.readlines.size
|
|
2575
|
+
# end
|
|
2576
|
+
#
|
|
2577
|
+
# Output:
|
|
2578
|
+
#
|
|
2579
|
+
# 213
|
|
2580
|
+
#
|
|
2581
|
+
# **Program Subprocess**
|
|
2582
|
+
#
|
|
2583
|
+
# When argument `cmd` is an array of strings, the program named `cmd[0]` is run
|
|
2584
|
+
# with all elements of `cmd` as its arguments:
|
|
2585
|
+
#
|
|
2586
|
+
# IO.popen(['du', '..', '.']) do |pipe|
|
|
2587
|
+
# $stderr.puts pipe.readlines.size
|
|
2588
|
+
# end
|
|
2589
|
+
#
|
|
2590
|
+
# Output:
|
|
2591
|
+
#
|
|
2592
|
+
# 1111
|
|
2593
|
+
#
|
|
2594
|
+
# **Program Subprocess with `argv0`**
|
|
2595
|
+
#
|
|
2596
|
+
# When argument `cmd` is an array whose first element is a 2-element string
|
|
2597
|
+
# array and whose remaining elements (if any) are strings:
|
|
2598
|
+
#
|
|
2599
|
+
# * `cmd[0][0]` (the first string in the nested array) is the name of a
|
|
2600
|
+
# program that is run.
|
|
2601
|
+
# * `cmd[0][1]` (the second string in the nested array) is set as the
|
|
2602
|
+
# program's `argv[0]`.
|
|
2603
|
+
# * `cmd[1..-1]` (the strings in the outer array) are the program's arguments.
|
|
2604
|
+
#
|
|
2605
|
+
#
|
|
2606
|
+
# Example (sets `$0` to 'foo'):
|
|
2607
|
+
#
|
|
2608
|
+
# IO.popen([['/bin/sh', 'foo'], '-c', 'echo $0']).read # => "foo\n"
|
|
2609
|
+
#
|
|
2610
|
+
# **Some Special Examples**
|
|
2611
|
+
#
|
|
2612
|
+
# # Set IO encoding.
|
|
2613
|
+
# IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
|
|
2614
|
+
# euc_jp_string = nkf_io.read
|
|
2372
2615
|
# }
|
|
2373
2616
|
#
|
|
2374
|
-
#
|
|
2617
|
+
# # Merge standard output and standard error using Kernel#spawn option. See Kernel#spawn.
|
|
2618
|
+
# IO.popen(["ls", "/", :err=>[:child, :out]]) do |io|
|
|
2619
|
+
# ls_result_with_error = io.read
|
|
2620
|
+
# end
|
|
2621
|
+
#
|
|
2622
|
+
# # Use mixture of spawn options and IO options.
|
|
2623
|
+
# IO.popen(["ls", "/"], :err=>[:child, :out]) do |io|
|
|
2624
|
+
# ls_result_with_error = io.read
|
|
2625
|
+
# end
|
|
2626
|
+
#
|
|
2627
|
+
# f = IO.popen("uname")
|
|
2628
|
+
# p f.readlines
|
|
2629
|
+
# f.close
|
|
2630
|
+
# puts "Parent is #{Process.pid}"
|
|
2631
|
+
# IO.popen("date") {|f| puts f.gets }
|
|
2632
|
+
# IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f.inspect}"}
|
|
2633
|
+
# p $?
|
|
2634
|
+
# IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f|
|
|
2635
|
+
# f.puts "bar"; f.close_write; puts f.gets
|
|
2636
|
+
# }
|
|
2637
|
+
#
|
|
2638
|
+
# Output (from last section):
|
|
2375
2639
|
#
|
|
2376
2640
|
# ["Linux\n"]
|
|
2377
2641
|
# Parent is 21346
|
|
@@ -2381,79 +2645,162 @@ class IO < Object
|
|
|
2381
2645
|
# #<Process::Status: pid 21352 exit 0>
|
|
2382
2646
|
# <foo>bar;zot;
|
|
2383
2647
|
#
|
|
2648
|
+
# Raises exceptions that IO.pipe and Kernel.spawn raise.
|
|
2649
|
+
#
|
|
2384
2650
|
def self.popen: (*untyped args) -> untyped
|
|
2385
2651
|
|
|
2386
2652
|
# <!--
|
|
2387
2653
|
# rdoc-file=io.c
|
|
2388
|
-
# - IO.foreach(
|
|
2389
|
-
# - IO.foreach(
|
|
2390
|
-
# - IO.foreach(
|
|
2391
|
-
# - IO.foreach(
|
|
2392
|
-
# -
|
|
2393
|
-
# -
|
|
2394
|
-
# -
|
|
2395
|
-
# - File.foreach(...) -> an_enumerator
|
|
2654
|
+
# - IO.foreach(path, sep = $/, **opts) {|line| block } -> nil
|
|
2655
|
+
# - IO.foreach(path, limit, **opts) {|line| block } -> nil
|
|
2656
|
+
# - IO.foreach(path, sep, limit, **opts) {|line| block } -> nil
|
|
2657
|
+
# - IO.foreach(command, sep = $/, **opts) {|line| block } -> nil
|
|
2658
|
+
# - IO.foreach(command, limit, **opts) {|line| block } -> nil
|
|
2659
|
+
# - IO.foreach(command, sep, limit, **opts) {|line| block } -> nil
|
|
2660
|
+
# - IO.foreach(...) -> an_enumerator
|
|
2396
2661
|
# -->
|
|
2397
|
-
#
|
|
2398
|
-
# separated by *sep*.
|
|
2662
|
+
# Calls the block with each successive line read from the stream.
|
|
2399
2663
|
#
|
|
2400
|
-
#
|
|
2664
|
+
# When called from class IO (but not subclasses of IO), this method has
|
|
2665
|
+
# potential security vulnerabilities if called with untrusted input; see
|
|
2666
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2401
2667
|
#
|
|
2402
|
-
#
|
|
2403
|
-
# class, a subprocess is created in the same way as Kernel#open, and its output
|
|
2404
|
-
# is returned. Consider to use File.foreach to disable the behavior of
|
|
2405
|
-
# subprocess invocation.
|
|
2668
|
+
# The first argument must be a string that is one of the following:
|
|
2406
2669
|
#
|
|
2407
|
-
#
|
|
2408
|
-
#
|
|
2670
|
+
# * Path: if `self` is a subclass of IO (File, for example), or if the string
|
|
2671
|
+
# *does* *not* start with the pipe character (`'|'`), the string is the path
|
|
2672
|
+
# to a file.
|
|
2673
|
+
# * Command: if `self` is the class IO, and if the string starts with the pipe
|
|
2674
|
+
# character, the rest of the string is a command to be executed as a
|
|
2675
|
+
# subprocess. This usage has potential security vulnerabilities if called
|
|
2676
|
+
# with untrusted input; see [Command
|
|
2677
|
+
# Injection](rdoc-ref:command_injection.rdoc).
|
|
2409
2678
|
#
|
|
2410
|
-
# *produces:*
|
|
2411
2679
|
#
|
|
2412
|
-
#
|
|
2413
|
-
#
|
|
2414
|
-
#
|
|
2415
|
-
#
|
|
2680
|
+
# With only argument `path` given, parses lines from the file at the given
|
|
2681
|
+
# `path`, as determined by the default line separator, and calls the block with
|
|
2682
|
+
# each successive line:
|
|
2683
|
+
#
|
|
2684
|
+
# File.foreach('t.txt') {|line| p line }
|
|
2685
|
+
#
|
|
2686
|
+
# Output: the same as above.
|
|
2687
|
+
#
|
|
2688
|
+
# For both forms, command and path, the remaining arguments are the same.
|
|
2689
|
+
#
|
|
2690
|
+
# With argument `sep` given, parses lines as determined by that line separator
|
|
2691
|
+
# (see [Line Separator](rdoc-ref:IO@Line+Separator)):
|
|
2692
|
+
#
|
|
2693
|
+
# File.foreach('t.txt', 'li') {|line| p line }
|
|
2694
|
+
#
|
|
2695
|
+
# Output:
|
|
2696
|
+
#
|
|
2697
|
+
# "First li"
|
|
2698
|
+
# "ne\nSecond li"
|
|
2699
|
+
# "ne\n\nThird li"
|
|
2700
|
+
# "ne\nFourth li"
|
|
2701
|
+
# "ne\n"
|
|
2702
|
+
#
|
|
2703
|
+
# Each paragraph:
|
|
2704
|
+
#
|
|
2705
|
+
# File.foreach('t.txt', '') {|paragraph| p paragraph }
|
|
2706
|
+
#
|
|
2707
|
+
# Output:
|
|
2708
|
+
#
|
|
2709
|
+
# "First line\nSecond line\n\n"
|
|
2710
|
+
# "Third line\nFourth line\n"
|
|
2711
|
+
#
|
|
2712
|
+
# With argument `limit` given, parses lines as determined by the default line
|
|
2713
|
+
# separator and the given line-length limit (see [Line
|
|
2714
|
+
# Limit](rdoc-ref:IO@Line+Limit)):
|
|
2715
|
+
#
|
|
2716
|
+
# File.foreach('t.txt', 7) {|line| p line }
|
|
2717
|
+
#
|
|
2718
|
+
# Output:
|
|
2719
|
+
#
|
|
2720
|
+
# "First l"
|
|
2721
|
+
# "ine\n"
|
|
2722
|
+
# "Second "
|
|
2723
|
+
# "line\n"
|
|
2724
|
+
# "\n"
|
|
2725
|
+
# "Third l"
|
|
2726
|
+
# "ine\n"
|
|
2727
|
+
# "Fourth l"
|
|
2728
|
+
# "line\n"
|
|
2729
|
+
#
|
|
2730
|
+
# With arguments `sep` and `limit` given, parses lines as determined by the
|
|
2731
|
+
# given line separator and the given line-length limit (see [Line Separator and
|
|
2732
|
+
# Line Limit](rdoc-ref:IO@Line+Separator+and+Line+Limit)):
|
|
2733
|
+
#
|
|
2734
|
+
# Optional keyword arguments `opts` specify:
|
|
2735
|
+
#
|
|
2736
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
2737
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
2738
|
+
# * [Line Options](rdoc-ref:IO@Line+Options).
|
|
2416
2739
|
#
|
|
2417
|
-
#
|
|
2418
|
-
#
|
|
2419
|
-
# about open_args.
|
|
2740
|
+
#
|
|
2741
|
+
# Returns an Enumerator if no block is given.
|
|
2420
2742
|
#
|
|
2421
2743
|
def self.foreach: (string | _ToPath path, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) { (String line) -> void } -> nil
|
|
2422
2744
|
| (string | _ToPath path, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Enumerator[String, nil]
|
|
2423
2745
|
|
|
2424
2746
|
# <!--
|
|
2425
2747
|
# rdoc-file=io.c
|
|
2426
|
-
# - IO.pipe
|
|
2427
|
-
# - IO.pipe(
|
|
2428
|
-
# - IO.pipe(
|
|
2429
|
-
# - IO.pipe(
|
|
2430
|
-
# - IO.pipe(
|
|
2748
|
+
# - IO.pipe(**opts) -> [read_io, write_io]
|
|
2749
|
+
# - IO.pipe(enc, **opts) -> [read_io, write_io]
|
|
2750
|
+
# - IO.pipe(ext_enc, int_enc, **opts) -> [read_io, write_io]
|
|
2751
|
+
# - IO.pipe(**opts) {|read_io, write_io] ...} -> object
|
|
2752
|
+
# - IO.pipe(enc, **opts) {|read_io, write_io] ...} -> object
|
|
2753
|
+
# - IO.pipe(ext_enc, int_enc, **opts) {|read_io, write_io] ...} -> object
|
|
2431
2754
|
# -->
|
|
2432
|
-
# Creates a pair of pipe endpoints
|
|
2433
|
-
#
|
|
2755
|
+
# Creates a pair of pipe endpoints, `read_io` and `write_io`, connected to each
|
|
2756
|
+
# other.
|
|
2434
2757
|
#
|
|
2435
|
-
# If
|
|
2436
|
-
# *read_io* and *write_io* are sent to the block as arguments. If read_io and
|
|
2437
|
-
# write_io are not closed when the block exits, they are closed. i.e. closing
|
|
2438
|
-
# read_io and/or write_io doesn't cause an error.
|
|
2758
|
+
# If argument `enc_string` is given, it must be a string containing one of:
|
|
2439
2759
|
#
|
|
2440
|
-
#
|
|
2760
|
+
# * The name of the encoding to be used as the external encoding.
|
|
2761
|
+
# * The colon-separated names of two encodings to be used as the external and
|
|
2762
|
+
# internal encodings.
|
|
2763
|
+
#
|
|
2764
|
+
#
|
|
2765
|
+
# If argument `int_enc` is given, it must be an Encoding object or encoding name
|
|
2766
|
+
# string that specifies the internal encoding to be used; if argument `ext_enc`
|
|
2767
|
+
# is also given, it must be an Encoding object or encoding name string that
|
|
2768
|
+
# specifies the external encoding to be used.
|
|
2769
|
+
#
|
|
2770
|
+
# The string read from `read_io` is tagged with the external encoding; if an
|
|
2771
|
+
# internal encoding is also specified, the string is converted to, and tagged
|
|
2772
|
+
# with, that encoding.
|
|
2773
|
+
#
|
|
2774
|
+
# If any encoding is specified, optional hash arguments specify the conversion
|
|
2775
|
+
# option.
|
|
2776
|
+
#
|
|
2777
|
+
# Optional keyword arguments `opts` specify:
|
|
2778
|
+
#
|
|
2779
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
2780
|
+
# * [Encoding Options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
2781
|
+
#
|
|
2782
|
+
#
|
|
2783
|
+
# With no block given, returns the two endpoints in an array:
|
|
2784
|
+
#
|
|
2785
|
+
# IO.pipe # => [#<IO:fd 4>, #<IO:fd 5>]
|
|
2786
|
+
#
|
|
2787
|
+
# With a block given, calls the block with the two endpoints; closes both
|
|
2788
|
+
# endpoints and returns the value of the block:
|
|
2789
|
+
#
|
|
2790
|
+
# IO.pipe {|read_io, write_io| p read_io; p write_io }
|
|
2791
|
+
#
|
|
2792
|
+
# Output:
|
|
2793
|
+
#
|
|
2794
|
+
# #<IO:fd 6>
|
|
2795
|
+
# #<IO:fd 7>
|
|
2441
2796
|
#
|
|
2442
|
-
#
|
|
2443
|
-
# argument, read string from pipe is tagged with the encoding specified. If the
|
|
2444
|
-
# argument is a colon separated two encoding names "A:B", the read string is
|
|
2445
|
-
# converted from encoding A (external encoding) to encoding B (internal
|
|
2446
|
-
# encoding), then tagged with B. If two optional arguments are specified, those
|
|
2447
|
-
# must be encoding objects or encoding names, and the first one is the external
|
|
2448
|
-
# encoding, and the second one is the internal encoding. If the external
|
|
2449
|
-
# encoding and the internal encoding is specified, optional hash argument
|
|
2450
|
-
# specify the conversion option.
|
|
2797
|
+
# Not available on all platforms.
|
|
2451
2798
|
#
|
|
2452
2799
|
# In the example below, the two processes close the ends of the pipe that they
|
|
2453
2800
|
# are not using. This is not just a cosmetic nicety. The read end of a pipe will
|
|
2454
2801
|
# not generate an end of file condition if there are any writers with the pipe
|
|
2455
2802
|
# still open. In the case of the parent process, the `rd.read` will never return
|
|
2456
|
-
# if it does not first issue a `wr.close
|
|
2803
|
+
# if it does not first issue a `wr.close`:
|
|
2457
2804
|
#
|
|
2458
2805
|
# rd, wr = IO.pipe
|
|
2459
2806
|
#
|
|
@@ -2464,7 +2811,7 @@ class IO < Object
|
|
|
2464
2811
|
# Process.wait
|
|
2465
2812
|
# else
|
|
2466
2813
|
# rd.close
|
|
2467
|
-
# puts
|
|
2814
|
+
# puts 'Sending message to parent'
|
|
2468
2815
|
# wr.write "Hi Dad"
|
|
2469
2816
|
# wr.close
|
|
2470
2817
|
# end
|
|
@@ -2479,113 +2826,168 @@ class IO < Object
|
|
|
2479
2826
|
|
|
2480
2827
|
# <!--
|
|
2481
2828
|
# rdoc-file=io.c
|
|
2482
|
-
# - IO.read(
|
|
2483
|
-
# -
|
|
2829
|
+
# - IO.read(command, length = nil, offset = 0, **opts) -> string or nil
|
|
2830
|
+
# - IO.read(path, length = nil, offset = 0, **opts) -> string or nil
|
|
2484
2831
|
# -->
|
|
2485
|
-
# Opens the
|
|
2486
|
-
#
|
|
2487
|
-
# before returning.
|
|
2832
|
+
# Opens the stream, reads and returns some or all of its content, and closes the
|
|
2833
|
+
# stream; returns `nil` if no bytes were read.
|
|
2488
2834
|
#
|
|
2489
|
-
#
|
|
2490
|
-
#
|
|
2491
|
-
#
|
|
2492
|
-
# invocation.
|
|
2835
|
+
# When called from class IO (but not subclasses of IO), this method has
|
|
2836
|
+
# potential security vulnerabilities if called with untrusted input; see
|
|
2837
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2493
2838
|
#
|
|
2494
|
-
#
|
|
2839
|
+
# The first argument must be a string; its meaning depends on whether it starts
|
|
2840
|
+
# with the pipe character (`'|'`):
|
|
2495
2841
|
#
|
|
2496
|
-
#
|
|
2842
|
+
# * If so (and if `self` is IO), the rest of the string is a command to be
|
|
2843
|
+
# executed as a subprocess.
|
|
2844
|
+
# * Otherwise, the string is the path to a file.
|
|
2497
2845
|
#
|
|
2498
|
-
# :encoding
|
|
2499
|
-
# : string or encoding
|
|
2500
2846
|
#
|
|
2501
|
-
#
|
|
2502
|
-
#
|
|
2847
|
+
# With only argument `command` given, executes the command in a shell, returns
|
|
2848
|
+
# its entire $stdout:
|
|
2503
2849
|
#
|
|
2504
|
-
#
|
|
2505
|
-
#
|
|
2850
|
+
# IO.read('| cat t.txt')
|
|
2851
|
+
# # => "First line\nSecond line\n\nThird line\nFourth line\n"
|
|
2506
2852
|
#
|
|
2507
|
-
#
|
|
2508
|
-
#
|
|
2509
|
-
# modes.
|
|
2853
|
+
# With only argument `path` given, reads in text mode and returns the entire
|
|
2854
|
+
# content of the file at the given path:
|
|
2510
2855
|
#
|
|
2511
|
-
#
|
|
2512
|
-
#
|
|
2856
|
+
# IO.read('t.txt')
|
|
2857
|
+
# # => "First line\nSecond line\n\nThird line\nFourth line\n"
|
|
2513
2858
|
#
|
|
2514
|
-
#
|
|
2515
|
-
#
|
|
2859
|
+
# On Windows, text mode can terminate reading and leave bytes in the file unread
|
|
2860
|
+
# when encountering certain special bytes. Consider using IO.binread if all
|
|
2861
|
+
# bytes in the file should be read.
|
|
2516
2862
|
#
|
|
2863
|
+
# For both forms, command and path, the remaining arguments are the same.
|
|
2517
2864
|
#
|
|
2518
|
-
#
|
|
2865
|
+
# With argument `length`, returns `length` bytes if available:
|
|
2866
|
+
#
|
|
2867
|
+
# IO.read('t.txt', 7) # => "First l"
|
|
2868
|
+
# IO.read('t.txt', 700)
|
|
2869
|
+
# # => "First line\r\nSecond line\r\n\r\nFourth line\r\nFifth line\r\n"
|
|
2870
|
+
#
|
|
2871
|
+
# With arguments `length` and `offset`, returns `length` bytes if available,
|
|
2872
|
+
# beginning at the given `offset`:
|
|
2519
2873
|
#
|
|
2520
|
-
#
|
|
2521
|
-
#
|
|
2522
|
-
#
|
|
2523
|
-
#
|
|
2524
|
-
#
|
|
2874
|
+
# IO.read('t.txt', 10, 2) # => "rst line\nS"
|
|
2875
|
+
# IO.read('t.txt', 10, 200) # => nil
|
|
2876
|
+
#
|
|
2877
|
+
# Optional keyword arguments `opts` specify:
|
|
2878
|
+
#
|
|
2879
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
2880
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
2525
2881
|
#
|
|
2526
2882
|
def self.read: (String name, ?Integer length, ?Integer offset, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode) -> String
|
|
2527
2883
|
|
|
2528
2884
|
# <!--
|
|
2529
2885
|
# rdoc-file=io.c
|
|
2530
|
-
# - IO.readlines(
|
|
2531
|
-
# - IO.readlines(
|
|
2532
|
-
# - IO.readlines(
|
|
2533
|
-
# -
|
|
2534
|
-
# -
|
|
2535
|
-
# -
|
|
2886
|
+
# - IO.readlines(command, sep = $/, **opts) -> array
|
|
2887
|
+
# - IO.readlines(command, limit, **opts) -> array
|
|
2888
|
+
# - IO.readlines(command, sep, limit, **opts) -> array
|
|
2889
|
+
# - IO.readlines(path, sep = $/, **opts) -> array
|
|
2890
|
+
# - IO.readlines(path, limit, **opts) -> array
|
|
2891
|
+
# - IO.readlines(path, sep, limit, **opts) -> array
|
|
2536
2892
|
# -->
|
|
2537
|
-
#
|
|
2538
|
-
#
|
|
2893
|
+
# Returns an array of all lines read from the stream.
|
|
2894
|
+
#
|
|
2895
|
+
# When called from class IO (but not subclasses of IO), this method has
|
|
2896
|
+
# potential security vulnerabilities if called with untrusted input; see
|
|
2897
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2898
|
+
#
|
|
2899
|
+
# The first argument must be a string; its meaning depends on whether it starts
|
|
2900
|
+
# with the pipe character (`'|'`):
|
|
2539
2901
|
#
|
|
2540
|
-
# If `
|
|
2541
|
-
#
|
|
2542
|
-
#
|
|
2543
|
-
# subprocess invocation.
|
|
2902
|
+
# * If so (and if `self` is IO), the rest of the string is a command to be
|
|
2903
|
+
# executed as a subprocess.
|
|
2904
|
+
# * Otherwise, the string is the path to a file.
|
|
2544
2905
|
#
|
|
2545
|
-
# a = File.readlines("testfile")
|
|
2546
|
-
# a[0] #=> "This is line one\n"
|
|
2547
2906
|
#
|
|
2548
|
-
#
|
|
2549
|
-
#
|
|
2907
|
+
# With only argument `command` given, executes the command in a shell, parses
|
|
2908
|
+
# its $stdout into lines, as determined by the default line separator, and
|
|
2909
|
+
# returns those lines in an array:
|
|
2550
2910
|
#
|
|
2551
|
-
# IO.readlines(
|
|
2911
|
+
# IO.readlines('| cat t.txt')
|
|
2912
|
+
# # => ["First line\n", "Second line\n", "\n", "Third line\n", "Fourth line\n"]
|
|
2552
2913
|
#
|
|
2553
|
-
#
|
|
2914
|
+
# With only argument `path` given, parses lines from the file at the given
|
|
2915
|
+
# `path`, as determined by the default line separator, and returns those lines
|
|
2916
|
+
# in an array:
|
|
2554
2917
|
#
|
|
2555
|
-
#
|
|
2918
|
+
# IO.readlines('t.txt')
|
|
2919
|
+
# # => ["First line\n", "Second line\n", "\n", "Third line\n", "Fourth line\n"]
|
|
2556
2920
|
#
|
|
2557
|
-
#
|
|
2921
|
+
# For both forms, command and path, the remaining arguments are the same.
|
|
2558
2922
|
#
|
|
2559
|
-
#
|
|
2560
|
-
#
|
|
2561
|
-
# and `\r\n` will be removed from the end of each line.
|
|
2923
|
+
# With argument `sep` given, parses lines as determined by that line separator
|
|
2924
|
+
# (see [Line Separator](rdoc-ref:IO@Line+Separator)):
|
|
2562
2925
|
#
|
|
2926
|
+
# # Ordinary separator.
|
|
2927
|
+
# IO.readlines('t.txt', 'li')
|
|
2928
|
+
# # =>["First li", "ne\nSecond li", "ne\n\nThird li", "ne\nFourth li", "ne\n"]
|
|
2929
|
+
# # Get-paragraphs separator.
|
|
2930
|
+
# IO.readlines('t.txt', '')
|
|
2931
|
+
# # => ["First line\nSecond line\n\n", "Third line\nFourth line\n"]
|
|
2932
|
+
# # Get-all separator.
|
|
2933
|
+
# IO.readlines('t.txt', nil)
|
|
2934
|
+
# # => ["First line\nSecond line\n\nThird line\nFourth line\n"]
|
|
2563
2935
|
#
|
|
2564
|
-
#
|
|
2936
|
+
# With argument `limit` given, parses lines as determined by the default line
|
|
2937
|
+
# separator and the given line-length limit (see [Line
|
|
2938
|
+
# Limit](rdoc-ref:IO@Line+Limit)):
|
|
2939
|
+
#
|
|
2940
|
+
# IO.readlines('t.txt', 7)
|
|
2941
|
+
# # => ["First l", "ine\n", "Second ", "line\n", "\n", "Third l", "ine\n", "Fourth ", "line\n"]
|
|
2942
|
+
#
|
|
2943
|
+
# With arguments `sep` and `limit` given, parses lines as determined by the
|
|
2944
|
+
# given line separator and the given line-length limit (see [Line Separator and
|
|
2945
|
+
# Line Limit](rdoc-ref:IO@Line+Separator+and+Line+Limit)):
|
|
2946
|
+
#
|
|
2947
|
+
# Optional keyword arguments `opts` specify:
|
|
2948
|
+
#
|
|
2949
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
2950
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
2951
|
+
# * [Line Options](rdoc-ref:IO@Line+Options).
|
|
2565
2952
|
#
|
|
2566
2953
|
def self.readlines: (String | _ToPath name, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Array[String]
|
|
2567
2954
|
|
|
2568
2955
|
# <!--
|
|
2569
2956
|
# rdoc-file=io.c
|
|
2570
|
-
# - IO.select(
|
|
2957
|
+
# - IO.select(read_ios, write_ios = [], error_ios = [], timeout = nil) -> array or nil
|
|
2571
2958
|
# -->
|
|
2572
|
-
#
|
|
2573
|
-
# until one or more of
|
|
2574
|
-
#
|
|
2575
|
-
#
|
|
2576
|
-
#
|
|
2959
|
+
# Invokes system call [select(2)](https://linux.die.net/man/2/select), which
|
|
2960
|
+
# monitors multiple file descriptors, waiting until one or more of the file
|
|
2961
|
+
# descriptors becomes ready for some class of I/O operation.
|
|
2962
|
+
#
|
|
2963
|
+
# Not implemented on all platforms.
|
|
2964
|
+
#
|
|
2965
|
+
# Each of the arguments `read_ios`, `write_ios`, and `error_ios` is an array of
|
|
2966
|
+
# IO objects.
|
|
2967
|
+
#
|
|
2968
|
+
# Argument `timeout` is an integer timeout interval in seconds.
|
|
2969
|
+
#
|
|
2970
|
+
# The method monitors the IO objects given in all three arrays, waiting for some
|
|
2971
|
+
# to be ready; returns a 3-element array whose elements are:
|
|
2972
|
+
#
|
|
2973
|
+
# * An array of the objects in `read_ios` that are ready for reading.
|
|
2974
|
+
# * An array of the objects in `write_ios` that are ready for writing.
|
|
2975
|
+
# * An array of the objects in `error_ios` have pending exceptions.
|
|
2976
|
+
#
|
|
2977
|
+
#
|
|
2978
|
+
# If no object becomes ready within the given `timeout`, `nil` is returned.
|
|
2577
2979
|
#
|
|
2578
2980
|
# IO.select peeks the buffer of IO objects for testing readability. If the IO
|
|
2579
2981
|
# buffer is not empty, IO.select immediately notifies readability. This "peek"
|
|
2580
2982
|
# only happens for IO objects. It does not happen for IO-like objects such as
|
|
2581
2983
|
# OpenSSL::SSL::SSLSocket.
|
|
2582
2984
|
#
|
|
2583
|
-
# The best way to use IO.select is invoking it after
|
|
2584
|
-
# #read_nonblock, #write_nonblock, etc. The methods raise an exception which
|
|
2585
|
-
# extended by IO::WaitReadable or IO::WaitWritable. The modules notify how
|
|
2586
|
-
# caller should wait with IO.select. If IO::WaitReadable is raised, the
|
|
2587
|
-
# should wait for reading. If IO::WaitWritable is raised, the caller
|
|
2588
|
-
# wait for writing.
|
|
2985
|
+
# The best way to use IO.select is invoking it after non-blocking methods such
|
|
2986
|
+
# as #read_nonblock, #write_nonblock, etc. The methods raise an exception which
|
|
2987
|
+
# is extended by IO::WaitReadable or IO::WaitWritable. The modules notify how
|
|
2988
|
+
# the caller should wait with IO.select. If IO::WaitReadable is raised, the
|
|
2989
|
+
# caller should wait for reading. If IO::WaitWritable is raised, the caller
|
|
2990
|
+
# should wait for writing.
|
|
2589
2991
|
#
|
|
2590
2992
|
# So, blocking read (#readpartial) can be emulated using #read_nonblock and
|
|
2591
2993
|
# IO.select as follows:
|
|
@@ -2600,7 +3002,7 @@ class IO < Object
|
|
|
2600
3002
|
# retry
|
|
2601
3003
|
# end
|
|
2602
3004
|
#
|
|
2603
|
-
# Especially, the combination of
|
|
3005
|
+
# Especially, the combination of non-blocking methods and IO.select is preferred
|
|
2604
3006
|
# for IO like objects such as OpenSSL::SSL::SSLSocket. It has #to_io method to
|
|
2605
3007
|
# return underlying IO object. IO.select calls #to_io to obtain the file
|
|
2606
3008
|
# descriptor to wait.
|
|
@@ -2626,13 +3028,13 @@ class IO < Object
|
|
|
2626
3028
|
# blocking. So, the caller should wait for ready for writability as above
|
|
2627
3029
|
# example.
|
|
2628
3030
|
#
|
|
2629
|
-
# The combination of
|
|
3031
|
+
# The combination of non-blocking methods and IO.select is also useful for
|
|
2630
3032
|
# streams such as tty, pipe socket socket when multiple processes read from a
|
|
2631
3033
|
# stream.
|
|
2632
3034
|
#
|
|
2633
3035
|
# Finally, Linux kernel developers don't guarantee that readability of select(2)
|
|
2634
|
-
# means readability of following read(2) even for a single process
|
|
2635
|
-
# select(2)
|
|
3036
|
+
# means readability of following read(2) even for a single process; see
|
|
3037
|
+
# [select(2)](https://linux.die.net/man/2/select)
|
|
2636
3038
|
#
|
|
2637
3039
|
# Invoking IO.select before IO#readpartial works well as usual. However it is
|
|
2638
3040
|
# not the best way to use IO.select.
|
|
@@ -2659,18 +3061,7 @@ class IO < Object
|
|
|
2659
3061
|
# string = string.byteslice(written..-1)
|
|
2660
3062
|
# end
|
|
2661
3063
|
#
|
|
2662
|
-
#
|
|
2663
|
-
# read_array
|
|
2664
|
-
# : an array of IO objects that wait until ready for read
|
|
2665
|
-
# write_array
|
|
2666
|
-
# : an array of IO objects that wait until ready for write
|
|
2667
|
-
# error_array
|
|
2668
|
-
# : an array of IO objects that wait for exceptions
|
|
2669
|
-
# timeout
|
|
2670
|
-
# : a numeric value in second
|
|
2671
|
-
#
|
|
2672
|
-
#
|
|
2673
|
-
# ### Example
|
|
3064
|
+
# Example:
|
|
2674
3065
|
#
|
|
2675
3066
|
# rp, wp = IO.pipe
|
|
2676
3067
|
# mesg = "ping "
|
|
@@ -2692,7 +3083,7 @@ class IO < Object
|
|
|
2692
3083
|
# end
|
|
2693
3084
|
# }
|
|
2694
3085
|
#
|
|
2695
|
-
#
|
|
3086
|
+
# Output:
|
|
2696
3087
|
#
|
|
2697
3088
|
# ping pong
|
|
2698
3089
|
# ping pong
|
|
@@ -2705,11 +3096,17 @@ class IO < Object
|
|
|
2705
3096
|
|
|
2706
3097
|
# <!--
|
|
2707
3098
|
# rdoc-file=io.c
|
|
2708
|
-
# - IO.sysopen(path,
|
|
3099
|
+
# - IO.sysopen(path, mode = 'r', perm = 0666) -> integer
|
|
2709
3100
|
# -->
|
|
2710
|
-
# Opens the given path
|
|
3101
|
+
# Opens the file at the given path with the given mode and permissions; returns
|
|
3102
|
+
# the integer file descriptor.
|
|
3103
|
+
#
|
|
3104
|
+
# If the file is to be readable, it must exist; if the file is to be writable
|
|
3105
|
+
# and does not exist, it is created with the given permissions:
|
|
2711
3106
|
#
|
|
2712
|
-
#
|
|
3107
|
+
# File.write('t.tmp', '') # => 0
|
|
3108
|
+
# IO.sysopen('t.tmp') # => 8
|
|
3109
|
+
# IO.sysopen('t.tmp', 'w') # => 9
|
|
2713
3110
|
#
|
|
2714
3111
|
def self.sysopen: (String path, ?String mode, ?String perm) -> Integer
|
|
2715
3112
|
|
|
@@ -2728,96 +3125,87 @@ class IO < Object
|
|
|
2728
3125
|
|
|
2729
3126
|
# <!--
|
|
2730
3127
|
# rdoc-file=io.c
|
|
2731
|
-
# - IO.write(
|
|
2732
|
-
# - IO.write(
|
|
2733
|
-
# - File.write(name, string [, offset]) -> integer
|
|
2734
|
-
# - File.write(name, string [, offset] [, opt]) -> integer
|
|
3128
|
+
# - IO.write(command, data, **opts) -> integer
|
|
3129
|
+
# - IO.write(path, data, offset = 0, **opts) -> integer
|
|
2735
3130
|
# -->
|
|
2736
|
-
# Opens the
|
|
2737
|
-
# returns the
|
|
2738
|
-
# returning. If *offset* is not given in write mode, the file is truncated.
|
|
2739
|
-
# Otherwise, it is not truncated.
|
|
3131
|
+
# Opens the stream, writes the given `data` to it, and closes the stream;
|
|
3132
|
+
# returns the number of bytes written.
|
|
2740
3133
|
#
|
|
2741
|
-
#
|
|
2742
|
-
#
|
|
2743
|
-
#
|
|
2744
|
-
# invocation.
|
|
3134
|
+
# When called from class IO (but not subclasses of IO), this method has
|
|
3135
|
+
# potential security vulnerabilities if called with untrusted input; see
|
|
3136
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
|
2745
3137
|
#
|
|
2746
|
-
#
|
|
2747
|
-
#
|
|
2748
|
-
# File.write("testfile", "0123456789") #=> 10
|
|
2749
|
-
# # File would now read: "0123456789"
|
|
2750
|
-
# IO.write("|tr a-z A-Z", "abc") #=> 3
|
|
2751
|
-
# # Prints "ABC" to the standard output
|
|
3138
|
+
# The first argument must be a string; its meaning depends on whether it starts
|
|
3139
|
+
# with the pipe character (`'|'`):
|
|
2752
3140
|
#
|
|
2753
|
-
# If
|
|
2754
|
-
#
|
|
3141
|
+
# * If so (and if `self` is IO), the rest of the string is a command to be
|
|
3142
|
+
# executed as a subprocess.
|
|
3143
|
+
# * Otherwise, the string is the path to a file.
|
|
2755
3144
|
#
|
|
2756
|
-
# :encoding
|
|
2757
|
-
# : string or encoding
|
|
2758
3145
|
#
|
|
2759
|
-
#
|
|
2760
|
-
#
|
|
3146
|
+
# With argument `command` given, executes the command in a shell, passes `data`
|
|
3147
|
+
# through standard input, writes its output to $stdout, and returns the length
|
|
3148
|
+
# of the given `data`:
|
|
2761
3149
|
#
|
|
2762
|
-
#
|
|
2763
|
-
# : string or integer
|
|
3150
|
+
# IO.write('| cat', 'Hello World!') # => 12
|
|
2764
3151
|
#
|
|
2765
|
-
#
|
|
2766
|
-
#
|
|
2767
|
-
#
|
|
3152
|
+
# Output:
|
|
3153
|
+
#
|
|
3154
|
+
# Hello World!
|
|
3155
|
+
#
|
|
3156
|
+
# With argument `path` given, writes the given `data` to the file at that path:
|
|
3157
|
+
#
|
|
3158
|
+
# IO.write('t.tmp', 'abc') # => 3
|
|
3159
|
+
# File.read('t.tmp') # => "abc"
|
|
2768
3160
|
#
|
|
2769
|
-
# :
|
|
2770
|
-
# : integer
|
|
3161
|
+
# If `offset` is zero (the default), the file is overwritten:
|
|
2771
3162
|
#
|
|
2772
|
-
#
|
|
3163
|
+
# IO.write('t.tmp', 'A') # => 1
|
|
3164
|
+
# File.read('t.tmp') # => "A"
|
|
2773
3165
|
#
|
|
2774
|
-
# :
|
|
2775
|
-
# : array
|
|
3166
|
+
# If `offset` in within the file content, the file is partly overwritten:
|
|
2776
3167
|
#
|
|
2777
|
-
#
|
|
2778
|
-
#
|
|
3168
|
+
# IO.write('t.tmp', 'abcdef') # => 3
|
|
3169
|
+
# File.read('t.tmp') # => "abcdef"
|
|
3170
|
+
# # Offset within content.
|
|
3171
|
+
# IO.write('t.tmp', '012', 2) # => 3
|
|
3172
|
+
# File.read('t.tmp') # => "ab012f"
|
|
2779
3173
|
#
|
|
3174
|
+
# If `offset` is outside the file content, the file is padded with null
|
|
3175
|
+
# characters `"\u0000"`:
|
|
2780
3176
|
#
|
|
2781
|
-
#
|
|
3177
|
+
# IO.write('t.tmp', 'xyz', 10) # => 3
|
|
3178
|
+
# File.read('t.tmp') # => "ab012f\u0000\u0000\u0000\u0000xyz"
|
|
3179
|
+
#
|
|
3180
|
+
# Optional keyword arguments `opts` specify:
|
|
3181
|
+
#
|
|
3182
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
|
3183
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
|
2782
3184
|
#
|
|
2783
3185
|
def self.write: (String name, _ToS arg0, ?Integer offset, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode) -> Integer
|
|
2784
3186
|
|
|
2785
3187
|
# <!--
|
|
2786
3188
|
# rdoc-file=io.c
|
|
2787
|
-
# - IO.for_fd(fd, mode
|
|
3189
|
+
# - IO.for_fd(fd, mode = 'r', **opts) -> io
|
|
2788
3190
|
# -->
|
|
2789
3191
|
# Synonym for IO.new.
|
|
2790
3192
|
#
|
|
2791
|
-
|
|
3193
|
+
alias self.for_fd self.new
|
|
2792
3194
|
|
|
2793
3195
|
# <!--
|
|
2794
3196
|
# rdoc-file=io.c
|
|
2795
|
-
# - IO.open(fd, mode=
|
|
2796
|
-
# - IO.open(fd, mode=
|
|
3197
|
+
# - IO.open(fd, mode = 'r', **opts) -> io
|
|
3198
|
+
# - IO.open(fd, mode = 'r', **opts) {|io| ... } -> object
|
|
2797
3199
|
# -->
|
|
2798
|
-
#
|
|
2799
|
-
# code block is given, it will be passed `io` as an argument, and the IO object
|
|
2800
|
-
# will automatically be closed when the block terminates. In this instance,
|
|
2801
|
-
# IO.open returns the value of the block.
|
|
3200
|
+
# Creates a new IO object, via IO.new with the given arguments.
|
|
2802
3201
|
#
|
|
2803
|
-
#
|
|
2804
|
-
#
|
|
2805
|
-
alias self.open self.for_fd
|
|
2806
|
-
|
|
2807
|
-
# <!--
|
|
2808
|
-
# rdoc-file=io.c
|
|
2809
|
-
# - IO.open(fd, mode="r" [, opt]) -> io
|
|
2810
|
-
# - IO.open(fd, mode="r" [, opt]) {|io| block } -> obj
|
|
2811
|
-
# -->
|
|
2812
|
-
# With no associated block, IO.open is a synonym for IO.new. If the optional
|
|
2813
|
-
# code block is given, it will be passed `io` as an argument, and the IO object
|
|
2814
|
-
# will automatically be closed when the block terminates. In this instance,
|
|
2815
|
-
# IO.open returns the value of the block.
|
|
3202
|
+
# With no block given, returns the IO object.
|
|
2816
3203
|
#
|
|
2817
|
-
#
|
|
3204
|
+
# With a block given, calls the block with the IO object and returns the block's
|
|
3205
|
+
# value.
|
|
2818
3206
|
#
|
|
2819
|
-
def self.open:
|
|
2820
|
-
|
|
|
3207
|
+
def self.open: (int fd, ?string | int mode, ?path: string?, **untyped opts) -> instance
|
|
3208
|
+
| [A] (int fd, ?string | int mode, ?path: string?, **untyped opts) { (instance) -> A } -> A
|
|
2821
3209
|
|
|
2822
3210
|
def bytes: () { (Integer arg0) -> untyped } -> self
|
|
2823
3211
|
| () -> ::Enumerator[Integer, self]
|
|
@@ -2829,37 +3217,118 @@ class IO < Object
|
|
|
2829
3217
|
| () -> ::Enumerator[Integer, self]
|
|
2830
3218
|
|
|
2831
3219
|
# <!-- rdoc-file=io.c -->
|
|
2832
|
-
#
|
|
2833
|
-
#
|
|
3220
|
+
# Calls the block with each remaining line read from the stream; returns `self`.
|
|
3221
|
+
# Does nothing if already at end-of-stream; See [Line IO](rdoc-ref:IO@Line+IO).
|
|
2834
3222
|
#
|
|
2835
|
-
#
|
|
3223
|
+
# With no arguments given, reads lines as determined by line separator `$/`:
|
|
2836
3224
|
#
|
|
2837
|
-
# f = File.new(
|
|
2838
|
-
# f.
|
|
3225
|
+
# f = File.new('t.txt')
|
|
3226
|
+
# f.each_line {|line| p line }
|
|
3227
|
+
# f.each_line {|line| fail 'Cannot happen' }
|
|
3228
|
+
# f.close
|
|
2839
3229
|
#
|
|
2840
|
-
#
|
|
3230
|
+
# Output:
|
|
3231
|
+
#
|
|
3232
|
+
# "First line\n"
|
|
3233
|
+
# "Second line\n"
|
|
3234
|
+
# "\n"
|
|
3235
|
+
# "Fourth line\n"
|
|
3236
|
+
# "Fifth line\n"
|
|
3237
|
+
#
|
|
3238
|
+
# With only string argument `sep` given, reads lines as determined by line
|
|
3239
|
+
# separator `sep`; see [Line Separator](rdoc-ref:IO@Line+Separator):
|
|
3240
|
+
#
|
|
3241
|
+
# f = File.new('t.txt')
|
|
3242
|
+
# f.each_line('li') {|line| p line }
|
|
3243
|
+
# f.close
|
|
3244
|
+
#
|
|
3245
|
+
# Output:
|
|
2841
3246
|
#
|
|
2842
|
-
#
|
|
2843
|
-
#
|
|
2844
|
-
#
|
|
2845
|
-
#
|
|
3247
|
+
# "First li"
|
|
3248
|
+
# "ne\nSecond li"
|
|
3249
|
+
# "ne\n\nFourth li"
|
|
3250
|
+
# "ne\nFifth li"
|
|
3251
|
+
# "ne\n"
|
|
2846
3252
|
#
|
|
2847
|
-
#
|
|
3253
|
+
# The two special values for `sep` are honored:
|
|
3254
|
+
#
|
|
3255
|
+
# f = File.new('t.txt')
|
|
3256
|
+
# # Get all into one string.
|
|
3257
|
+
# f.each_line(nil) {|line| p line }
|
|
3258
|
+
# f.close
|
|
3259
|
+
#
|
|
3260
|
+
# Output:
|
|
3261
|
+
#
|
|
3262
|
+
# "First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
3263
|
+
#
|
|
3264
|
+
# f.rewind
|
|
3265
|
+
# # Get paragraphs (up to two line separators).
|
|
3266
|
+
# f.each_line('') {|line| p line }
|
|
3267
|
+
#
|
|
3268
|
+
# Output:
|
|
3269
|
+
#
|
|
3270
|
+
# "First line\nSecond line\n\n"
|
|
3271
|
+
# "Fourth line\nFifth line\n"
|
|
3272
|
+
#
|
|
3273
|
+
# With only integer argument `limit` given, limits the number of bytes in each
|
|
3274
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
|
3275
|
+
#
|
|
3276
|
+
# f = File.new('t.txt')
|
|
3277
|
+
# f.each_line(8) {|line| p line }
|
|
3278
|
+
# f.close
|
|
3279
|
+
#
|
|
3280
|
+
# Output:
|
|
3281
|
+
#
|
|
3282
|
+
# "First li"
|
|
3283
|
+
# "ne\n"
|
|
3284
|
+
# "Second l"
|
|
3285
|
+
# "ine\n"
|
|
3286
|
+
# "\n"
|
|
3287
|
+
# "Fourth l"
|
|
3288
|
+
# "ine\n"
|
|
3289
|
+
# "Fifth li"
|
|
3290
|
+
# "ne\n"
|
|
3291
|
+
#
|
|
3292
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
|
3293
|
+
#
|
|
3294
|
+
# * Calls with the next line as determined by line separator `sep`.
|
|
3295
|
+
# * But returns no more bytes than are allowed by the limit.
|
|
3296
|
+
#
|
|
3297
|
+
#
|
|
3298
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
|
3299
|
+
# omitted:
|
|
3300
|
+
#
|
|
3301
|
+
# f = File.new('t.txt')
|
|
3302
|
+
# f.each_line(chomp: true) {|line| p line }
|
|
3303
|
+
# f.close
|
|
3304
|
+
#
|
|
3305
|
+
# Output:
|
|
3306
|
+
#
|
|
3307
|
+
# "First line"
|
|
3308
|
+
# "Second line"
|
|
3309
|
+
# ""
|
|
3310
|
+
# "Fourth line"
|
|
3311
|
+
# "Fifth line"
|
|
3312
|
+
#
|
|
3313
|
+
# Returns an Enumerator if no block is given.
|
|
3314
|
+
#
|
|
3315
|
+
# IO#each is an alias for IO#each_line.
|
|
2848
3316
|
#
|
|
2849
3317
|
def each_line: (?String sep, ?Integer limit) { (String arg0) -> untyped } -> self
|
|
2850
3318
|
| (?String sep, ?Integer limit) -> ::Enumerator[String, self]
|
|
2851
3319
|
|
|
2852
3320
|
# <!-- rdoc-file=io.c -->
|
|
2853
3321
|
# Returns `true` if the stream is positioned at its end, `false` otherwise; see
|
|
2854
|
-
# [Position](
|
|
3322
|
+
# [Position](rdoc-ref:IO@Position):
|
|
2855
3323
|
#
|
|
2856
3324
|
# f = File.open('t.txt')
|
|
2857
3325
|
# f.eof # => false
|
|
2858
3326
|
# f.seek(0, :END) # => 0
|
|
2859
3327
|
# f.eof # => true
|
|
3328
|
+
# f.close
|
|
2860
3329
|
#
|
|
2861
3330
|
# Raises an exception unless the stream is opened for reading; see
|
|
2862
|
-
# [Mode](
|
|
3331
|
+
# [Mode](rdoc-ref:File@Access+Modes).
|
|
2863
3332
|
#
|
|
2864
3333
|
# If `self` is a stream such as pipe or socket, this method blocks until the
|
|
2865
3334
|
# other end sends some data or closes it:
|
|
@@ -2879,7 +3348,7 @@ class IO < Object
|
|
|
2879
3348
|
# not behave as you intend with IO#eof?, unless you call IO#rewind first (which
|
|
2880
3349
|
# is not available for some streams).
|
|
2881
3350
|
#
|
|
2882
|
-
#
|
|
3351
|
+
# IO#eof? is an alias for IO#eof.
|
|
2883
3352
|
#
|
|
2884
3353
|
def eof?: () -> bool
|
|
2885
3354
|
|
|
@@ -2893,6 +3362,7 @@ class IO < Object
|
|
|
2893
3362
|
# $stdout.fileno # => 1
|
|
2894
3363
|
# $stderr.fileno # => 2
|
|
2895
3364
|
# File.open('t.txt').fileno # => 10
|
|
3365
|
+
# f.close
|
|
2896
3366
|
#
|
|
2897
3367
|
# IO#to_i is an alias for IO#fileno.
|
|
2898
3368
|
#
|