Spec-Zone.ru › Nim 1

потоки

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

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

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

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

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

Пример StringStream

import 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 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 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

Типы

Stream = ref StreamObj
Все процедуры этого модуля используют этот тип. Процедуры напрямую не используют StreamObj. Исходный код Редактировать
StreamObj = object of RootObj
  closeImpl*: proc (s: Stream) {...}{.nimcall, raises: [Exception, 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 TaintedString): 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.
  pos: int
Объект потока строки. Исходный код Редактировать
FileStream = ref FileStreamObj

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

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

Исходный код Редактировать
FileStreamObj = object of Stream
  f: File

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

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

Исходный код Редактировать

Процедуры

proc flush(s: Stream) {...}{.raises: [IOError, OSError], tags: [WriteIOEffect].}

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

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

См. также:

  • процедура close

Пример:

from 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 close(s: Stream) {...}{.raises: [Exception, IOError, OSError],
                        tags: [WriteIOEffect].}

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

См. также:

  • процедура flush

Пример:

var strm = newStringStream("The first line\nthe second line\nthe third line")
## do something...
strm.close()
Исходный код Редактировать
proc atEnd(s: Stream): bool {...}{.raises: [IOError, OSError], tags: [].}
Проверяет, можно ли прочитать больше данных из 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 setPosition(s: Stream; pos: int) {...}{.raises: [IOError, OSError], tags: [].}
Устанавливает позицию 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 getPosition(s: Stream): int {...}{.raises: [IOError, OSError], tags: [].}
Возвращает текущую позицию в потоке 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 readData(s: Stream; buffer: pointer; bufLen: int): int {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}

Процедура низкого уровня, которая считывает данные в нетипизированный 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].}
Процедура низкого уровня, которая считывает данные в строку buffer по позиции slice.

Пример:

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

Пример:

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 peekData(s: Stream; buffer: pointer; bufLen: int): int {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}

Процедура низкого уровня, которая считывает данные в нетипизированный 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 writeData(s: Stream; buffer: pointer; bufLen: int) {...}{.
    raises: [IOError, OSError], tags: [WriteIOEffect].}

Процедура низкого уровня, которая записывает нетипизированный 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()
Исходный код Редактировать
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 write(s: Stream; x: string) {...}{.raises: [IOError, OSError],
                                   tags: [WriteIOEffect].}
Записывает строку x в поток s. Не записывается поле длины или завершающий ноль.

Пример:

var strm = newStringStream("")
strm.write("THE 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].}
Записывает одну или несколько строк в поток. Не записываются поля длины или завершающие нули.

Пример:

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

Пример:

var strm = newStringStream("")
strm.writeLine(1, 2)
strm.writeLine(3, 4)
strm.setPosition(0)
doAssert strm.readAll() == "12\n34\n"
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 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 readChar(s: Stream): char {...}{.raises: [IOError, OSError],
                                 tags: [ReadIOEffect].}

Считывает символ из потока 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 peekChar(s: Stream): char {...}{.raises: [IOError, OSError],
                                 tags: [ReadIOEffect].}
Предварительно просматривает символ из потока s. Возбуждает IOError если произошла ошибка. Возвращает '\0' как маркер конца файла.

Пример:

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

Считывает 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 peekBool(s: Stream): bool {...}{.raises: [IOError, OSError],
                                 tags: [ReadIOEffect].}

Предварительно просматривает 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 readInt8(s: Stream): int8 {...}{.raises: [IOError, OSError],
                                 tags: [ReadIOEffect].}

Считывает 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 peekInt8(s: Stream): int8 {...}{.raises: [IOError, OSError],
                                 tags: [ReadIOEffect].}

Предварительно просматривает 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 readInt16(s: Stream): int16 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Считывает 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 peekInt16(s: Stream): int16 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Просматривает 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 readInt32(s: Stream): int32 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Считывает 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 peekInt32(s: Stream): int32 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Просматривает 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 readInt64(s: Stream): int64 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Считывает 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 peekInt64(s: Stream): int64 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Просматривает 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 readUint8(s: Stream): uint8 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Считывает 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 peekUint8(s: Stream): uint8 {...}{.raises: [IOError, OSError],
                                   tags: [ReadIOEffect].}

Просматривает 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 readUint16(s: Stream): uint16 {...}{.raises: [IOError, OSError],
                                     tags: [ReadIOEffect].}

Считывает 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 peekUint16(s: Stream): uint16 {...}{.raises: [IOError, OSError],
                                     tags: [ReadIOEffect].}

Просматривает 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 readUint32(s: Stream): uint32 {...}{.raises: [IOError, OSError],
                                     tags: [ReadIOEffect].}

Считывает 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 peekUint32(s: Stream): uint32 {...}{.raises: [IOError, OSError],
                                     tags: [ReadIOEffect].}

Просматривает 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 readUint64(s: Stream): uint64 {...}{.raises: [IOError, OSError],
                                     tags: [ReadIOEffect].}

Считывает 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 peekUint64(s: Stream): uint64 {...}{.raises: [IOError, OSError],
                                     tags: [ReadIOEffect].}

Просматривает 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 readFloat32(s: Stream): float32 {...}{.raises: [IOError, OSError],
                                       tags: [ReadIOEffect].}

Считывает 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 peekFloat32(s: Stream): float32 {...}{.raises: [IOError, OSError],
                                       tags: [ReadIOEffect].}

Просматривает 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 readFloat64(s: Stream): float64 {...}{.raises: [IOError, OSError],
                                       tags: [ReadIOEffect].}

Считывает 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 peekFloat64(s: Stream): float64 {...}{.raises: [IOError, OSError],
                                       tags: [ReadIOEffect].}

Просматривает 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 readStr(s: Stream; length: int; str: var TaintedString) {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}
Считывает строку длины length из потока s. Вызывает IOError при возникновении ошибки. Исходный код Изменить
proc readStr(s: Stream; length: int): TaintedString {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}
Считывает строку длины 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 peekStr(s: Stream; length: int; str: var TaintedString) {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}
Просматривает строку длины length из потока s. Вызывает IOError при возникновении ошибки. Исходный код Изменить
proc peekStr(s: Stream; length: int): TaintedString {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}
Просматривает строку длиной 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 readLine(s: Stream; line: var TaintedString): bool {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}

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

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

См. также:

  • readLine(Stream) proc
  • peekLine(Stream) proc
  • peekLine(Stream, TaintedString) 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 peekLine(s: Stream; line: var TaintedString): bool {...}{.
    raises: [IOError, OSError], tags: [ReadIOEffect].}

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

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

См. также:

  • readLine(Stream) proc
  • readLine(Stream, TaintedString) 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 readLine(s: Stream): TaintedString {...}{.raises: [IOError, OSError],
    tags: [ReadIOEffect].}

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

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

См. также:

  • readLine(Stream, TaintedString) proc
  • peekLine(Stream) proc
  • peekLine(Stream, TaintedString) 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 peekLine(s: Stream): TaintedString {...}{.raises: [IOError, OSError],
    tags: [ReadIOEffect].}

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

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

См. также:

  • readLine(Stream) proc
  • readLine(Stream, TaintedString) proc
  • peekLine(Stream, TaintedString) 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 newStringStream(s: string = ""): owned StringStream {...}{.raises: [], tags: [].}

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

См. также:

  • newFileStream proc создает поток файла из открытого файла.
  • newFileStream proc создает поток файла из имени файла и режима.
  • openFileStream 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"
strm.close()
Исходный код Редактировать
proc newFileStream(f: File): owned FileStream {...}{.raises: [], tags: [].}

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

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

См. также:

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

Пример:

## 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: [].}

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

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

Примечание:

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

См. также:

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

Пример:

from 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 openFileStream(filename: string; mode: FileMode = fmRead;
                    bufSize: int = -1): owned FileStream {...}{.raises: [IOError],
    tags: [].}

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

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

См. также:

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

Пример:

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()
Исходный код Редактировать

Итераторы

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

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

См. также:

  • readLine(Stream) proc
  • readLine(Stream, TaintedString) 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–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/streams.html

Spec-Zone.ru

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