Spec-Zone.ru › Nim

std/streams

Исходный кодИзменить

Этот модуль предоставляет интерфейс потока и два его реализации: FileStream и StringStream, которые реализуют интерфейс потока для объектов файлов Nim (File) и строк.

Другие модули могут предоставлять другие реализации для этого стандартного интерфейса потока.

Предупреждение: Из-за использования pointer, readData, peekData и

writeData интерфейсы недоступны в виртуальной машине во время компиляции и должны быть преобразованы из ptr string на бэкенде JS. Однако readDataStr доступен в общем случае вместо readData.

Основное использование

Основной порядок использования этого модуля:

  1. Открыть входной поток
  2. Читать или записывать в поток
  3. Закрыть поток

Пример StringStream

import std/streams

var strm = newStringStream("""The first line
the second line
the third line""")

var line = ""

while strm.readLine(line):
  echo line

# Output:
# The first line
# the second line
# the third line

strm.close()

Пример FileStream

Пример записи в поток файла:

import std/streams

var strm = newFileStream("somefile.txt", fmWrite)
var line = ""

if not isNil(strm):
  strm.writeLine("The first line")
  strm.writeLine("the second line")
  strm.writeLine("the third line")
  strm.close()

# Output (somefile.txt):
# The first line
# the second line
# the third line

Пример чтения из потока файла:

import std/streams

var strm = newFileStream("somefile.txt", fmRead)
var line = ""

if not isNil(strm):
  while strm.readLine(line):
    echo line
  strm.close()

# Output:
# The first line
# the second line
# the third line

См. также

  • модуль asyncstreams
  • модуль io для перечисления FileMode

Импорты

since

Типы

FileStream = ref FileStreamObj

Поток, который инкапсулирует File.

Примечание: Недоступен для бэкенда JS.

Исходный код Изменить
FileStreamObj = object of Stream

Объект потока файла.

Примечание: Недоступен для бэкенда JS.

Исходный код Изменить
Stream = ref StreamObj
Все процедуры этого модуля используют этот тип. Процедуры напрямую не используют StreamObj. Исходный код Изменить
StreamObj = object of RootObj
  closeImpl*: proc (s: Stream) {.nimcall, ...raises: [IOError, OSError],
                                 tags: [WriteIOEffect], gcsafe.}
  atEndImpl*: proc (s: Stream): bool {.nimcall,
                                       ...raises: [Defect, IOError, OSError],
                                       tags: [], gcsafe.}
  setPositionImpl*: proc (s: Stream; pos: int) {.nimcall,
      ...raises: [Defect, IOError, OSError], tags: [], gcsafe.}
  getPositionImpl*: proc (s: Stream): int {.nimcall,
      ...raises: [Defect, IOError, OSError], tags: [], gcsafe.}
  readDataStrImpl*: proc (s: Stream; buffer: var string; slice: Slice[int]): int {.
      nimcall, ...raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.}
  readLineImpl*: proc (s: Stream; line: var string): bool {.nimcall,
      ...raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.}
  readDataImpl*: proc (s: Stream; buffer: pointer; bufLen: int): int {.nimcall,
      ...raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.}
  peekDataImpl*: proc (s: Stream; buffer: pointer; bufLen: int): int {.nimcall,
      ...raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.}
  writeDataImpl*: proc (s: Stream; buffer: pointer; bufLen: int) {.nimcall,
      ...raises: [Defect, IOError, OSError], tags: [WriteIOEffect], gcsafe.}
  flushImpl*: proc (s: Stream) {.nimcall, ...raises: [Defect, IOError, OSError],
                                 tags: [WriteIOEffect], gcsafe.}

Интерфейс потока, поддерживающий запись или чтение.

Примечание:

  • Эти поля здесь не должны использоваться напрямую. Они доступны, чтобы реализация потока могла их переопределить.
Исходный код Изменить
StringStream = ref StringStreamObj
Поток, который инкапсулирует строку. Исходный код Изменить
StringStreamObj = object of StreamObj
  data*: string              ## A string data.
                             ## This is updated when called `writeLine` etc.
Объект потока строки. Исходный код Изменить

Процедуры

proc atEnd(s: Stream): bool {....raises: [IOError, OSError], tags: [], forbids: [].}
Проверяет, можно ли прочитать больше данных из s. Возвращает true , если все данные были прочитаны.

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
var line = ""
doAssert strm.atEnd() == false
while strm.readLine(line):
  discard
doAssert strm.atEnd() == true
strm.close()
Исходный код Редактировать
proc close(s: Stream) {....raises: [IOError, OSError], tags: [WriteIOEffect],
                        forbids: [].}

Закрывает поток s.

См. также:

  • процедура flush

Пример:

block:
  let strm = newStringStream("The first line\nthe second line\nthe third line")
  ## do something...
  strm.close()
  
block:
  let strm = newFileStream("amissingfile.txt")
  # deferring works even if newFileStream fails
  defer: strm.close()
  if not isNil(strm):
    ## do something...
Исходный код Редактировать
proc flush(s: Stream) {....raises: [IOError, OSError], tags: [WriteIOEffect],
                        forbids: [].}

Очищает буферы, которые может использовать поток s.

Эта процедура вызывает передачу любых не записанных данных для данного потока в среду хоста для записи в файл.

См. также:

  • процедура close

Пример:

from std/os import removeFile

var strm = newFileStream("somefile.txt", fmWrite)

doAssert "Before write:" & readFile("somefile.txt") == "Before write:"
strm.write("hello")
doAssert "After  write:" & readFile("somefile.txt") == "After  write:"

strm.flush()
doAssert "After  flush:" & readFile("somefile.txt") == "After  flush:hello"
strm.write("HELLO")
strm.flush()
doAssert "After  flush:" & readFile("somefile.txt") == "After  flush:helloHELLO"

strm.close()
doAssert "After  close:" & readFile("somefile.txt") == "After  close:helloHELLO"
removeFile("somefile.txt")
Исходный код Редактировать
proc getPosition(s: Stream): int {....raises: [IOError, OSError], tags: [],
                                   forbids: [].}
Возвращает текущую позицию в потоке s.

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
doAssert strm.getPosition() == 0
discard strm.readLine()
doAssert strm.getPosition() == 15
strm.close()
Исходный код Редактировать
proc newFileStream(f: File): owned FileStream {....raises: [], tags: [],
    forbids: [].}

Создаёт новый поток из файла f.

Примечание: Не доступно для JS-бекенда.

См. также:

  • процедура newStringStream создаёт новый поток из строки.
  • процедура newFileStream аналогична использованию процедуры open в примерах.
  • процедура openFileStream создаёт поток файла из имени файла и режима.

Пример:

## Input (somefile.txt):
## The first line
## the second line
## the third line
var f: File
if open(f, "somefile.txt", fmRead, -1):
  var strm = newFileStream(f)
  var line = ""
  while strm.readLine(line):
    echo line
  ## Output:
  ## The first line
  ## the second line
  ## the third line
  strm.close()
Исходный код Редактировать
proc newFileStream(filename: string; mode: FileMode = fmRead; bufSize: int = -1): owned
    FileStream {....raises: [], tags: [], forbids: [].}

Создаёт новый поток из файла с именем filename в режиме mode.

Если файл не может быть открыт, возвращается nil. См. модуль io для списка доступных перечислений FileMode.

Примечание:

  • Эта функция возвращает nil в случае неудачи. Для предотвращения неожиданного поведения и обеспечения правильной обработки ошибок, используйте процедуру openFileStream вместо неё.
  • Не доступно для JS-бекенда.

См. также:

  • процедура newStringStream создаёт новый поток из строки.
  • процедура newFileStream создаёт поток файла из открытого файла.
  • процедура openFileStream создаёт поток файла из имени файла и режима.

Пример:

from std/os import removeFile
var strm = newFileStream("somefile.txt", fmWrite)
if not isNil(strm):
  strm.writeLine("The first line")
  strm.writeLine("the second line")
  strm.writeLine("the third line")
  strm.close()
  ## Output (somefile.txt)
  ## The first line
  ## the second line
  ## the third line
  removeFile("somefile.txt")
Исходный код Редактировать
proc newStringStream(s: sink string = ""): owned StringStream {....raises: [],
    tags: [], forbids: [].}

Создаёт новый поток из строки s.

См. также:

  • процедура newFileStream создаёт поток файла из открытого файла.
  • процедура newFileStream создаёт поток файла из имени файла и режима.
  • процедура openFileStream создаёт поток файла из имени файла и режима.

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
doAssert strm.readLine() == "The first line"
doAssert strm.readLine() == "the second line"
doAssert strm.readLine() == "the third line"
strm.close()
Исходный код Редактировать
proc openFileStream(filename: string; mode: FileMode = fmRead; bufSize: int = -1): owned
    FileStream {....raises: [IOError], tags: [], forbids: [].}

Создаёт новый поток из файла с именем filename в режиме mode. Если файл не может быть открыт, генерируется исключение IO.

Примечание: Не доступно для JS-бекенда.

См. также:

  • процедура newStringStream создаёт новый поток из строки.
  • процедура newFileStream создаёт поток файла из открытого файла.
  • процедура newFileStream создаёт поток файла из имени файла и режима.

Пример:

try:
  ## Input (somefile.txt):
  ## The first line
  ## the second line
  ## the third line
  var strm = openFileStream("somefile.txt")
  echo strm.readLine()
  ## Output:
  ## The first line
  strm.close()
except:
  stderr.write getCurrentExceptionMsg()
Исходный код Редактировать
proc peek[T](s: Stream; result: var T)

Общее представление. Читает result из потока s.

Примечание: Не доступно для JS-бекенда. Используйте peekStr на данный момент.

Пример:

var strm = newStringStream("012")
## peekInt
var i: int8
strm.peek(i)
doAssert i == 48
## peekData
var buffer: array[2, char]
strm.peek(buffer)
doAssert buffer == ['0', '1']
strm.close()
Исходный код Редактировать
proc peekBool(s: Stream): bool {....raises: [IOError, OSError],
                                 tags: [ReadIOEffect], forbids: [].}

Читает bool из потока s.

Bool занимает один байт и он равен true для любого ненулевого (0000_0000) значения. Генерирует IOError если произошла ошибка.

Примечание: Не доступно для JS-бекенда. Используйте peekStr на данный момент.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(true)
strm.write(false)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekBool() == true
## not false
doAssert strm.peekBool() == true
doAssert strm.readBool() == true
doAssert strm.peekBool() == false
strm.close()
Исходный код Редактировать
proc peekChar(s: Stream): char {....raises: [IOError, OSError],
                                 tags: [ReadIOEffect], forbids: [].}
Читает char из потока s. Генерирует IOError если произошла ошибка. Возвращает '\0' в качестве маркера EOF.

Пример:

var strm = newStringStream("12\n3")
doAssert strm.peekChar() == '1'
doAssert strm.peekChar() == '1'
discard strm.readAll()
doAssert strm.peekChar() == '\x00'
strm.close()
Исходный код Редактировать
proc peekData(s: Stream; buffer: pointer; bufLen: int): int {.
    ...raises: [IOError, OSError], tags: [ReadIOEffect], forbids: [].}

Процедура низкого уровня, которая считывает данные в нетипизированный buffer размера bufLen без изменения позиции потока.

Примечание JS: buffer обрабатывается как ptr string и записывается между 0..<bufLen.

Пример:

var strm = newStringStream("abcde")
var buffer: array[6, char]
doAssert strm.peekData(addr(buffer), 1024) == 5
doAssert buffer == ['a', 'b', 'c', 'd', 'e', '\x00']
doAssert strm.atEnd() == false
strm.close()
Исходный код Редактировать
proc peekFloat32(s: Stream): float32 {....raises: [IOError, OSError],
                                       tags: [ReadIOEffect], forbids: [].}

Читает float32 из потока s. Генерирует IOError если произошла ошибка.

Примечание: Не доступно для JS-бекенда. Используйте peekStr на данный момент.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'f32)
strm.write(2'f32)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekFloat32() == 1'f32
## not 2'f32
doAssert strm.peekFloat32() == 1'f32
doAssert strm.readFloat32() == 1'f32
doAssert strm.peekFloat32() == 2'f32
strm.close()
Исходный код Редактировать
proc peekFloat64(s: Stream): float64 {....raises: [IOError, OSError],
                                       tags: [ReadIOEffect], forbids: [].}

Читает float64 из потока s. Генерирует IOError если произошла ошибка.

Примечание: Не доступно для JS-бекенда. Используйте peekStr на данный момент.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'f64)
strm.write(2'f64)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekFloat64() == 1'f64
## not 2'f64
doAssert strm.peekFloat64() == 1'f64
doAssert strm.readFloat64() == 1'f64
doAssert strm.peekFloat64() == 2'f64
strm.close()
Исходный код Редактировать
proc peekInt8(s: Stream): int8 {....raises: [IOError, OSError],
                                 tags: [ReadIOEffect], forbids: [].}

Читает int8 из потока s. Генерирует IOError если произошла ошибка.

Примечание: Не доступно для JS-бекенда. Используйте peekStr на данный момент.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i8)
strm.write(2'i8)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekInt8() == 1'i8
## not 2'i8
doAssert strm.peekInt8() == 1'i8
doAssert strm.readInt8() == 1'i8
doAssert strm.peekInt8() == 2'i8
strm.close()
Исходный код Редактировать
proc peekInt16(s: Stream): int16 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Читает int16 из потока s. Генерирует IOError если произошла ошибка.

Примечание: Не доступно для JS-бекенда. Используйте peekStr на данный момент.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i16)
strm.write(2'i16)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekInt16() == 1'i16
## not 2'i16
doAssert strm.peekInt16() == 1'i16
doAssert strm.readInt16() == 1'i16
doAssert strm.peekInt16() == 2'i16
strm.close()
Исходный код Редактировать
proc peekInt32(s: Stream): int32 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Просматривает целое число int32 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте peekStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i32)
strm.write(2'i32)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekInt32() == 1'i32
## not 2'i32
doAssert strm.peekInt32() == 1'i32
doAssert strm.readInt32() == 1'i32
doAssert strm.peekInt32() == 2'i32
strm.close()
Исходный код Редактировать
proc peekInt64(s: Stream): int64 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Просматривает целое число int64 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте peekStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i64)
strm.write(2'i64)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekInt64() == 1'i64
## not 2'i64
doAssert strm.peekInt64() == 1'i64
doAssert strm.readInt64() == 1'i64
doAssert strm.peekInt64() == 2'i64
strm.close()
Исходный код Редактировать
proc peekLine(s: Stream): string {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Просматривает строку из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Это не очень эффективно.

См. также:

  • readLine(Stream) proc
  • readLine(Stream, string) proc
  • peekLine(Stream, string) proc

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
doAssert strm.peekLine() == "The first line"
## not "the second line"
doAssert strm.peekLine() == "The first line"
doAssert strm.readLine() == "The first line"
doAssert strm.peekLine() == "the second line"
strm.close()
Исходный код Редактировать
proc peekLine(s: Stream; line: var string): bool {....raises: [IOError, OSError],
    tags: [ReadIOEffect], forbids: [].}

Просматривает строку текста из потока s в line. line не должно быть nil! Может выбросить исключение IO.

Строка текста может быть ограничена CR, LF или CRLF. Символ(ы) новой строки не входят в возвращаемую строку. Возвращает false если достигнут конец файла, true в противном случае. Если возвращается false, line не содержит новых данных.

См. также:

  • readLine(Stream) proc
  • readLine(Stream, string) proc
  • peekLine(Stream) proc

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
var line = ""
doAssert strm.peekLine(line) == true
doAssert line == "The first line"
doAssert strm.peekLine(line) == true
## not "the second line"
doAssert line == "The first line"
doAssert strm.readLine(line) == true
doAssert line == "The first line"
doAssert strm.peekLine(line) == true
doAssert line == "the second line"
strm.close()
Исходный код Редактировать
proc peekStr(s: Stream; length: int): string {....raises: [IOError, OSError],
    tags: [ReadIOEffect], forbids: [].}
Просматривает строку длиной length из потока s. Вызывает IOError при возникновении ошибки.

Пример:

var strm = newStringStream("abcde")
doAssert strm.peekStr(2) == "ab"
## not "cd
doAssert strm.peekStr(2) == "ab"
doAssert strm.readStr(2) == "ab"
doAssert strm.peekStr(2) == "cd"
strm.close()
Исходный код Редактировать
proc peekStr(s: Stream; length: int; str: var string) {.
    ...raises: [IOError, OSError], tags: [ReadIOEffect], forbids: [].}
Просматривает строку длиной length из потока s. Вызывает IOError при возникновении ошибки. Исходный код Редактировать
proc peekUint8(s: Stream): uint8 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Просматривает uint8 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте peekStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u8)
strm.write(2'u8)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekUint8() == 1'u8
## not 2'u8
doAssert strm.peekUint8() == 1'u8
doAssert strm.readUint8() == 1'u8
doAssert strm.peekUint8() == 2'u8
strm.close()
Исходный код Редактировать
proc peekUint16(s: Stream): uint16 {....raises: [IOError, OSError],
                                     tags: [ReadIOEffect], forbids: [].}

Просматривает uint16 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте peekStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u16)
strm.write(2'u16)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekUint16() == 1'u16
## not 2'u16
doAssert strm.peekUint16() == 1'u16
doAssert strm.readUint16() == 1'u16
doAssert strm.peekUint16() == 2'u16
strm.close()
Исходный код Редактировать
proc peekUint32(s: Stream): uint32 {....raises: [IOError, OSError],
                                     tags: [ReadIOEffect], forbids: [].}

Просматривает uint32 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте peekStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u32)
strm.write(2'u32)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekUint32() == 1'u32
## not 2'u32
doAssert strm.peekUint32() == 1'u32
doAssert strm.readUint32() == 1'u32
doAssert strm.peekUint32() == 2'u32
strm.close()
Исходный код Редактировать
proc peekUint64(s: Stream): uint64 {....raises: [IOError, OSError],
                                     tags: [ReadIOEffect], forbids: [].}

Просматривает uint64 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте peekStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u64)
strm.write(2'u64)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.peekUint64() == 1'u64
## not 2'u64
doAssert strm.peekUint64() == 1'u64
doAssert strm.readUint64() == 1'u64
doAssert strm.peekUint64() == 2'u64
strm.close()
Исходный код Редактировать
proc read[T](s: Stream; result: var T)

Процедура общего чтения. Читает result из потока s.

Примечание: Не доступно для бэкенда JS. Используйте readStr пока.

Пример:

var strm = newStringStream("012")
## readInt
var i: int8
strm.read(i)
doAssert i == 48
## readData
var buffer: array[2, char]
strm.read(buffer)
doAssert buffer == ['1', '2']
strm.close()
Исходный код Редактировать
proc readAll(s: Stream): string {....raises: [IOError, OSError],
                                  tags: [ReadIOEffect], forbids: [].}
Читает все доступные данные.

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
doAssert strm.readAll() == "The first line\nthe second line\nthe third line"
doAssert strm.atEnd() == true
strm.close()
Исходный код Редактировать
proc readBool(s: Stream): bool {....raises: [IOError, OSError],
                                 tags: [ReadIOEffect], forbids: [].}

Читает bool из потока s.

bool имеет длину один байт, и он равен true для каждого ненулевого (0000_0000) значения. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(true)
strm.write(false)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readBool() == true
doAssert strm.readBool() == false
doAssertRaises(IOError): discard strm.readBool()
strm.close()
Исходный код Редактировать
proc readChar(s: Stream): char {....raises: [IOError, OSError],
                                 tags: [ReadIOEffect], forbids: [].}

Читает char из потока s.

Вызывает IOError при возникновении ошибки. Возвращает '\0' как маркер конца потока.

Пример:

var strm = newStringStream("12\n3")
doAssert strm.readChar() == '1'
doAssert strm.readChar() == '2'
doAssert strm.readChar() == '\n'
doAssert strm.readChar() == '3'
doAssert strm.readChar() == '\x00'
strm.close()
Исходный код Редактировать
proc readData(s: Stream; buffer: pointer; bufLen: int): int {.
    ...raises: [IOError, OSError], tags: [ReadIOEffect], forbids: [].}

Процедура низкого уровня, которая читает данные в нетипизированный buffer размера bufLen.

Примечание для JS: buffer обрабатывается как ptr string и записывается между 0..<bufLen.

Пример:

var strm = newStringStream("abcde")
var buffer: array[6, char]
doAssert strm.readData(addr(buffer), 1024) == 5
doAssert buffer == ['a', 'b', 'c', 'd', 'e', '\x00']
doAssert strm.atEnd() == true
strm.close()
Исходный код Редактировать
proc readDataStr(s: Stream; buffer: var string; slice: Slice[int]): int {.
    ...raises: [IOError, OSError], tags: [ReadIOEffect], forbids: [].}
Процедура низкого уровня, которая читает данные в строку buffer по адресу slice.

Пример:

var strm = newStringStream("abcde")
var buffer = "12345"
doAssert strm.readDataStr(buffer, 0..3) == 4
doAssert buffer == "abcd5"
strm.close()
Исходный код Редактировать
proc readFloat32(s: Stream): float32 {....raises: [IOError, OSError],
                                       tags: [ReadIOEffect], forbids: [].}

Читает float32 из потока s. Вызывает IOError при возникновении ошибки.

Примечание: Не доступно для бэкенда JS. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'f32)
strm.write(2'f32)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readFloat32() == 1'f32
doAssert strm.readFloat32() == 2'f32
doAssertRaises(IOError): discard strm.readFloat32()
strm.close()
Исходный код Редактировать
proc readFloat64(s: Stream): float64 {....raises: [IOError, OSError],
                                       tags: [ReadIOEffect], forbids: [].}

Считывает float64 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'f64)
strm.write(2'f64)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readFloat64() == 1'f64
doAssert strm.readFloat64() == 2'f64
doAssertRaises(IOError): discard strm.readFloat64()
strm.close()
Исходный код Редактировать
proc readInt8(s: Stream): int8 {....raises: [IOError, OSError],
                                 tags: [ReadIOEffect], forbids: [].}

Считывает int8 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i8)
strm.write(2'i8)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readInt8() == 1'i8
doAssert strm.readInt8() == 2'i8
doAssertRaises(IOError): discard strm.readInt8()
strm.close()
Исходный код Редактировать
proc readInt16(s: Stream): int16 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Считывает int16 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i16)
strm.write(2'i16)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readInt16() == 1'i16
doAssert strm.readInt16() == 2'i16
doAssertRaises(IOError): discard strm.readInt16()
strm.close()
Исходный код Редактировать
proc readInt32(s: Stream): int32 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Считывает int32 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i32)
strm.write(2'i32)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readInt32() == 1'i32
doAssert strm.readInt32() == 2'i32
doAssertRaises(IOError): discard strm.readInt32()
strm.close()
Исходный код Редактировать
proc readInt64(s: Stream): int64 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Считывает int64 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'i64)
strm.write(2'i64)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readInt64() == 1'i64
doAssert strm.readInt64() == 2'i64
doAssertRaises(IOError): discard strm.readInt64()
strm.close()
Исходный код Редактировать
proc readLine(s: Stream): string {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Считывает строку из потока s. Вызывает IOError в случае ошибки.

Примечание: Это не очень эффективно.

См. также:

  • readLine(Stream, string) proc
  • peekLine(Stream) proc
  • peekLine(Stream, string) proc

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
doAssert strm.readLine() == "The first line"
doAssert strm.readLine() == "the second line"
doAssert strm.readLine() == "the third line"
doAssertRaises(IOError): discard strm.readLine()
strm.close()
Исходный код Редактировать
proc readLine(s: Stream; line: var string): bool {....raises: [IOError, OSError],
    tags: [ReadIOEffect], forbids: [].}

Считывает строку текста из потока s в line. line не должно быть nil! Может вызвать исключение IO.

Строка текста может быть ограничена LF или CRLF. Символ(ы) новой строки не входят в возвращаемую строку. Возвращает false если достигнут конец файла, true в противном случае. Если возвращается false, line не содержит новых данных.

См. также:

  • readLine(Stream) proc
  • peekLine(Stream) proc
  • peekLine(Stream, string) proc

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
var line = ""
doAssert strm.readLine(line) == true
doAssert line == "The first line"
doAssert strm.readLine(line) == true
doAssert line == "the second line"
doAssert strm.readLine(line) == true
doAssert line == "the third line"
doAssert strm.readLine(line) == false
doAssert line == ""
strm.close()
Исходный код Редактировать
proc readStr(s: Stream; length: int): string {....raises: [IOError, OSError],
    tags: [ReadIOEffect], forbids: [].}
Считывает строку длиной length из потока s. Вызывает IOError в случае ошибки.

Пример:

var strm = newStringStream("abcde")
doAssert strm.readStr(2) == "ab"
doAssert strm.readStr(2) == "cd"
doAssert strm.readStr(2) == "e"
doAssert strm.readStr(2) == ""
strm.close()
Исходный код Редактировать
proc readStr(s: Stream; length: int; str: var string) {.
    ...raises: [IOError, OSError], tags: [ReadIOEffect], forbids: [].}
Считывает строку длиной length из потока s. Вызывает IOError в случае ошибки. Исходный код Редактировать
proc readUint8(s: Stream): uint8 {....raises: [IOError, OSError],
                                   tags: [ReadIOEffect], forbids: [].}

Считывает uint8 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u8)
strm.write(2'u8)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readUint8() == 1'u8
doAssert strm.readUint8() == 2'u8
doAssertRaises(IOError): discard strm.readUint8()
strm.close()
Исходный код Редактировать
proc readUint16(s: Stream): uint16 {....raises: [IOError, OSError],
                                     tags: [ReadIOEffect], forbids: [].}

Считывает uint16 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u16)
strm.write(2'u16)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readUint16() == 1'u16
doAssert strm.readUint16() == 2'u16
doAssertRaises(IOError): discard strm.readUint16()
strm.close()
Исходный код Редактировать
proc readUint32(s: Stream): uint32 {....raises: [IOError, OSError],
                                     tags: [ReadIOEffect], forbids: [].}

Считывает uint32 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u32)
strm.write(2'u32)
strm.flush()
strm.setPosition(0)

## get data
doAssert strm.readUint32() == 1'u32
doAssert strm.readUint32() == 2'u32
doAssertRaises(IOError): discard strm.readUint32()
strm.close()
Исходный код Редактировать
proc readUint64(s: Stream): uint64 {....raises: [IOError, OSError],
                                     tags: [ReadIOEffect], forbids: [].}

Считывает uint64 из потока s. Вызывает IOError в случае ошибки.

Примечание: Не доступно для JS бэкенда. Используйте readStr пока.

Пример:

var strm = newStringStream()
## setup for reading data
strm.write(1'u64)
strm.write(2'u64)
strm.flush()
strm.setPosition(0)
## get data
doAssert strm.readUint64() == 1'u64
doAssert strm.readUint64() == 2'u64
doAssertRaises(IOError): discard strm.readUint64()
strm.close()
Исходный код Редактировать
proc setPosition(s: Stream; pos: int) {....raises: [IOError, OSError], tags: [],
                                        forbids: [].}
Устанавливает позицию pos потока s.

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
strm.setPosition(4)
doAssert strm.readLine() == "first line"
strm.setPosition(0)
doAssert strm.readLine() == "The first line"
strm.close()
Исходный код Редактировать
proc write(s: Stream; args: varargs[string, `$`]) {....raises: [IOError, OSError],
    tags: [WriteIOEffect], forbids: [].}
Записывает одну или несколько строк в поток. Не записываются поля длины или завершающие нули.

Пример:

var strm = newStringStream("")
strm.write(1, 2, 3, 4)
strm.setPosition(0)
doAssert strm.readLine() == "1234"
strm.close()
Исходный код Редактировать
proc write(s: Stream; x: string) {....raises: [IOError, OSError],
                                   tags: [WriteIOEffect], forbids: [].}
Записывает строку x в поток s. Не записывается поле длины или завершающий ноль.

Пример:

var strm = newStringStream("")
strm.write("THE FIRST LINE")
strm.setPosition(0)
doAssert strm.readLine() == "THE FIRST LINE"
strm.close()
Исходный код Редактировать
proc write[T](s: Stream; x: T)

Процедура записи универсального типа. Записывает x в поток s. Реализация:

Примечание: Не доступно для JS бэкенда. Используйте write(Stream, string) пока.

s.writeData(s, unsafeAddr(x), sizeof(x))

Пример:

var strm = newStringStream("")
strm.write("abcde")
strm.setPosition(0)
doAssert strm.readAll() == "abcde"
strm.close()
Исходный код Редактировать
proc writeData(s: Stream; buffer: pointer; bufLen: int) {.
    ...raises: [IOError, OSError], tags: [WriteIOEffect], forbids: [].}

Процедура низкого уровня, которая записывает нетипизированный buffer размера bufLen в поток s.

Примечание JS: buffer обрабатывается как ptr string и читается между 0..<bufLen.

Пример:

## writeData
var strm = newStringStream("")
var buffer = ['a', 'b', 'c', 'd', 'e']
strm.writeData(addr(buffer), sizeof(buffer))
doAssert strm.atEnd() == true
## readData
strm.setPosition(0)
var buffer2: array[6, char]
doAssert strm.readData(addr(buffer2), sizeof(buffer2)) == 5
doAssert buffer2 == ['a', 'b', 'c', 'd', 'e', '\x00']
strm.close()
Исходный код Редактировать
END_OF_DOCUMENT_MARKER
proc writeLine(s: Stream; args: varargs[string, `$`]) {.
    ...raises: [IOError, OSError], tags: [WriteIOEffect], forbids: [].}
Записывает одну или несколько строк в поток s, после чего переходит на новую строку. Поле длины или завершающий нуль не записываются.

Пример:

var strm = newStringStream("")
strm.writeLine(1, 2)
strm.writeLine(3, 4)
strm.setPosition(0)
doAssert strm.readAll() == "12\n34\n"
strm.close()
Исходный код Редактировать

Итераторы

iterator lines(s: Stream): string {....raises: [IOError, OSError],
                                    tags: [ReadIOEffect], forbids: [].}

Итерируется по каждой строке в потоке. Итерация основана на readLine.

См. также:

  • readLine(Stream) proc
  • readLine(Stream, string) proc

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
var lines: seq[string]
for line in strm.lines():
  lines.add line
doAssert lines == @["The first line", "the second line", "the third line"]
strm.close()
Исходный код Редактировать

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/streams.html

Spec-Zone.ru

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