std.stdio

Переместиться к: chunks · File · isFileHandle · KeepTerminator · lines · LockType · openNetwork · popen · readf · readln · stderr · stdin · StdioException · stdout · toFile · write · writef · writefln · writeln

Стандартные функции ввода/вывода, которые расширяют core.stdc.stdio. Модуль core.stdc.stdio публично импортируется при импорте std.stdio.

Исходный код: std/stdio.d

Лицензия:
Boost License 1.0.
Авторы:
Walter Bright, Andrei Alexandrescu, Alex Rønne Petersen
alias KeepTerminator = std.typecons.Flag!"keepTerminator".Flag;
Если флаг KeepTerminator установлен на KeepTerminator.yes, тогда разделитель включается в возвращаемые строки.

Переместиться к: byChunk · byLine · byLineCopy · byRecord · clearerr · close · detach · eof · error · fdopen · fileno · flush · getFP · isOpen · lock · lockingBinaryWriter · lockingTextWriter · name · opAssign · open · popen · rawRead · rawWrite · readf · readln · reopen · rewind · seek · setvbuf · size · sync · tell · this · tmpfile · tryLock · unlock · windowsHandle · windowsHandleOpen · wrapFile · write · writef · writefln · writeln

struct File;
Инкапсулирует FILE*. Обычно D не пытается предоставлять тонкие обёртки над эквиалентными функциями в стандартной библиотеке C, но непосредственные манипуляции со значениями FILE* – ненадёжны и подвержены появлению ошибок во многих отношениях. Тип File гарантирует безопасную обработку, автоматическое закрытие файлов, а также множество удобств.
Управление нижележащим FILE* поддерживается способом подсчёта ссылок, так что как только последняя переменная File, связанная с данным FILE* выходит из области видимости, нижележащий FILE* автоматически закрыкрывается.

Пример:

// test.d
void main(string[] args)
{
    auto f = File("test.txt", "w"); // открыт для записи
    f.write("Hello");
    if (args.length > 1)
    {
        auto g = f; // теперь g и f пишут в один и тот же файл
                    // внутренний счетчик ссылок равен 2
        g.write(", ", args[1]);
        // g вышел из области видимости , счётчик ссылок уменьшился до 1
    }
    f.writeln("!");
    // f вышел из области видимости, количество ссылок упало до нуля,
    // лежащий в основе $(D FILE*) закрыт.
}
% rdmd test.d Jimmy
% cat test.txt
Hello, Jimmy!
% _

@safe this(string name, in char[] stdioOpenmode = "rb");

this(R1, R2)(R1 name)
if (isInputRange!R1 && isSomeChar!(ElementEncodingType!R1));

this(R1, R2)(R1 name, R2 mode)
if (isInputRange!R1 && isSomeChar!(ElementEncodingType!R1) && isInputRange!R2 && isSomeChar!(ElementEncodingType!R2));
Конструктор, принимающий имя name открываемого файла и режим открытия mode.
Копирование одного объекта File другому даст в результате два объекта File, ссылающихся на один и тот же нижележащий файл.
Деструктор автоматически закрывает файл, как только ни один объект File больше не ссылается на него.
Параметры:
string name диапазон или строка, представляющие имя файла
char[] stdioOpenmode диапазон или строка, представляющие режим открытия (с той же семантикой, как в стандартной библиотечной функции fopen в C)
Исключения:
ErrnoException, если файл не может быть открыт.
@safe void opAssign(File rhs);
Присваивает файл другому. Цель присвоения отделяется от какого бы то ни было файла, к которому она была прикреплена, и присоединяется к новому файлу.
@safe void open(string name, in char[] stdioOpenmode = "rb");
Сначала вызывает detach (бросая исключение при неудаче), затем пытается открыть файл с именем name в режиме stdioOpenmode. Режим имеет ту же семантику, как в стандартной библиотечной функции fopen в C.
Исключения:
ErrnoException в случае ошибки.
@trusted void reopen(string name, in char[] stdioOpenmode = "rb");
Повторное использование объекта File либо для открытия другого файла, либо для изменения режима открытия файла. Если name равно null, изменяется режим открытого в настоящий момент файла; в противном случае, открывается новый файл, заново используя FILE* из C. Функция имеет ту же семантику, как в стандартной библиотечной функции freopen в C.

Замечание: Вызов reopen с name, равным null, реализован не во всех средах выполнения C.

Исключения:
ErrnoException в случае ошибки.
@safe void popen(string command, in char[] stdioOpenmode = "r");
Сначала вызывает detach (бросая исключение при неудаче), затем выполняет команду command, вызывая стандартную библиотечную C-функцию popen.
Исключения:
ErrnoException в случае ошибки.
@safe void fdopen(int fd, in char[] stdioOpenmode = "rb");
Сначала вызывает detach (бросая исключение при неудаче), затем пытается присоединить данный файловый дескриптор к File. Режим должен быть совместим с режимом файлового дескриптора.
Исключения:
ErrnoException в случае ошибки.
void windowsHandleOpen(HANDLE handle, in char[] stdioOpenmode);
Сначала вызывает detach (бросая исключение при неудаче), затем пытается присоединить данный Windows HANDLE к File. Режим должен быть совместим с атрибутами доступа handle. Только для Windows.
Исключения:
ErrnoException в случае ошибки.
const pure nothrow @property @safe bool isOpen();
Возвращает true, если файл открыт.
const pure @property @trusted bool eof();
Возвращает true, если файл дошёл до конца (смотрите feof).
Исключения:
Exception, если файл не открыт.
const pure nothrow @property @safe string name();
Возвращает имя последнего открытого файла, если имеется. Если File был создан с помощью tmpfile и wrapFile, у него нет имени.
const pure nothrow @property @trusted bool error();
Если файл не открыт, возвращает true. В противном случае, возвращает ferror для файла.
@safe void detach();
Отсоединяется от нижележащего файла. Если является единственным владельцем, вызывает close.
Исключения:
ErrnoException при ошибке закрытия файла.
@trusted void close();
Если файл не был открыт, успешно тривиальным образом. В противном случае закрывает файл (вызовом fclose), бросая исключение при ошибке. Даже если было брошено исключение, впоследствии объект File пустой. Это отличается от detach тем, что всегда закрывает файл; следовательно, все остальные File-объекты, ссылающиеся на тот же дескриптор, увидят в дальнейшем файл закрытым.
Исключения:
ErrnoException при ошибке.
pure nothrow @safe void clearerr();
Если файл не открыт, успешно тривиальным образом. В противном случае, возвращает clearerr для файлового дескриптора.
@trusted void flush();
Сбрасывает буферы в FILE.
Вызывает fflush для файлового дескриптора.
Исключения:
Exception, если файл не открыт, или если вызов fflush потерпел неудачу.
@trusted void sync();
Заставляет любые данные, буферизованные операционной системой, записать на диск. Вызывайте flush перед вызовом этой функции, чтобы сбросить перед этим буферы FILE.
Эта функция вызывает FlushFileBuffers в Windows и fsync в POSIX для дескриптора файла.
Исключения:
Exception, если файл не открыт, или если вызов ОС потерпел неудачу.
T[] rawRead(T)(T[] buffer);
Вызывает fread для дескриптора файла. Количество читаемых элементов, и размер каждого элемента выводится, соответственно, из размера и типа входного массива.
Возвращает:
Срез массива buffer, содержащий данные, которые были действительно прочитаны. Он будет короче, чем buffer, если EOF был достигнут до заполнения буфера.
Исключения:
Exception, если buffer пуст. ErrnoException, если файл не открыт, или если вызов fread потерпел неудачу.
В Windows rawRead всегда читает в двоичном режиме.
Примеры:
static import std.file;

auto testFile = testFilename();
std.file.write(testFile, "\r\n\n\r\n");
scope(exit) std.file.remove(testFile);

auto f = File(testFile, "r");
auto buf = f.rawRead(new char[5]);
f.close();
assert(buf == "\r\n\n\r\n");
void rawWrite(T)(in T[] buffer);
Вызывает fwrite для дескриптора файла. Количество записанных элементов, и размер каждого элемента выводится, соответственно, из размера и типа входного массива. Выбрасывается ошибка, если буфер не смог быть записан полностью.
В Windows rawWrite всегда пишет в двоичном режиме.
Исключения:
ErrnoException, если файл не открыт, или если вызов fwrite потерпел неудачу.
Примеры:
static import std.file;

auto testFile = testFilename();
auto f = File(testFile, "w");
scope(exit) std.file.remove(testFile);

f.rawWrite("\r\n\n\r\n");
f.close();
assert(std.file.read(testFile) == "\r\n\n\r\n");
@trusted void seek(long offset, int origin = SEEK_SET);
Вызывает fseek для дескриптора файла.
Исключения:
Exception, если файл не открыт. ErrnoException, если вызов fseek потерпел неудачу.
const @property @trusted ulong tell();
Вызывает ftell для управляемого файлового дескриптора.
Исключения:
Exception , если файл не открыт. ErrnoException, если вызов ftell потерпел неудачу.
Примеры:
static import std.file;
import std.conv : text;

auto testFile = testFilename();
std.file.write(testFile, "abcdefghijklmnopqrstuvwqxyz");
scope(exit) { std.file.remove(testFile); }

auto f = File(testFile);
auto a = new ubyte[4];
f.rawRead(a);
assert(f.tell == 4, text(f.tell));
@safe void rewind();
Вызывает rewind для дескриптора файла.
Исключения:
Exception, если файл не открыт.

Переместиться к: 2

@trusted void setvbuf(size_t size, int mode = _IOFBF);
Вызывает setvbuf для дескриптора файла.
Исключения:
Exception, если файл не открыт. ErrnoException, если вызов setvbuf потерпел неудачу.
@trusted void setvbuf(void[] buf, int mode = _IOFBF);
Вызывает setvbuf для дескриптора файла.
Исключения:
Exception, если файл не открыт. ErrnoException, если вызов setvbuf потерпел неудачу.
void lock(LockType lockType = LockType.readWrite, ulong start = 0, ulong length = 0);
Блокирует определенный сегмент файла. Если сегмент файла уже заблокирован другим процессом, ожидает пока существующий lock не будет отпущен. Если одновременно start и length равны нулю, блокируется весь файл.
Блокировка, созданная с использованием lock иtryLock имеет следующие свойства:
  • Все блокировки автоматически освобождаются, когда процесс завершается.
  • Блокировки не наследуются дочерними процессами.
  • Закрытие файла отпустит все блокировки, связанные с файлом. На POSIX блокировки, приобретённые даже с помощью другого File, также будут отпущены.
  • Не все реализации NFS правильно осуществляют файловую блокировку.
bool tryLock(LockType lockType = LockType.readWrite, ulong start = 0, ulong length = 0);
Пытается заблокировать определенный сегмент файла. Если одновременно start и length равны нулю, блокируется весь файл.
Возвращает:
true, если блокировка была успешной, и false, если определенный сегмент файла уже был заблокирован.
void unlock(ulong start = 0, ulong length = 0);
Снимает блокировку с определённого сегмента файла.
void write(S...)(S args);
Записывает свои аргументы в текстовом формате в файл.
Исключения:
Exception , если файл не открыт. ErrnoException при ошибке записи в файл.
void writeln(S...)(S args);
Записывает свои аргументы в текстовом формате в файл, с последующим переводом строки.
Исключения:
Exception , если файл не открыт. ErrnoException при ошибке записи в файл.
void writef(Char, A...)(in Char[] fmt, A args);
Записывает свои аргументы в текстовом формате в файл, в соответствии с форматом в первом аргументе.
Исключения:
Exception, если файл не открыт. ErrnoException при ошибке записи в файл.
void writefln(Char, A...)(in Char[] fmt, A args);
Записывает свои аргументы в текстовом формате в файл, в соответствии с форматом в первом аргументе, с последующим переводом строки.
Исключения:
Exception, если файл не открыт. ErrnoException при ошибке записи в файл.

Переместиться к: 2

S readln(S = string)(dchar terminator = '\x0a')
if (isSomeString!S);
Читает строку из файлового дескриптора и возвращает её в виде заданного типа.
Эта версия управляет своим собственным буфером чтения, что означает одно распределение памяти для каждого вызова. Если вы не сохраняете ссылку на данные чтения, рассмотрите версию File.readln(buf), которая может предложить более высокую производительность, так как она может повторно использовать буфер чтения.
Параметры:
S Параметр шаблона; тип размещённого буфера, и возвращаемый тип. Установлен по умолчанию в string.
dchar terminator символ перевода строки (по умолчанию, '\n').

Замечание: Строковые терминаторы не поддерживаются из-за неоднозначности с readln(buf) ниже.

Возвращает:
Строку, которая была прочитана, включая символ перевода строки.
Исключения:
StdioException при ощибке ввода/вывода, или UnicodeException при ошибке преобразований Unicode.

Example:

// Читает $(D stdin) и пишет это в $(D stdout).
import std.stdio;

void main()
{
    string line;
    while ((line = stdin.readln()) !is null)
        write(line);
}

size_t readln(C)(ref C[] buf, dchar terminator = '\x0a')
if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum));

size_t readln(C, R)(ref C[] buf, R terminator)
if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum) && isBidirectionalRange!R && is(typeof(terminator.front == (dchar).init)));
Читает строку из файлового дескриптора и записыфвает её в buf[], включая символ перевода строки.
Это может быть быстрее, чем line = File.readln(), поскольку вы можете многократно использовать буфер для каждого вызова. Заметьте, что повторное использование буфера означает, что вы должны скопировать предыдущее содержимое, если вы хотите сохранить его.
Параметры:
C[] buf Буфер, используемый для хранения результирующих данных. buf iизменит размер при необходимости.
dchar terminator символ перевода строки (по умолчанию, '\n'). Используйте std.ascii.newline для портируемости (если файл не был открыт в текстовом режиме).
Возвращает:
0 для конца файла, в противном случае количество прочитанных символов
Исключения:
StdioException при ощибке ввода/вывода, или UnicodeException при ошибке преобразований Unicode.

Example:

// Читать строки из $(D stdin) в string
// Игнорирует строки, начинающиеся с '#'
// Пишет string в $(D stdout)

void main()
{
    string output;
    char[] buf;

    while (stdin.readln(buf))
    {
        if (buf[0] == '#')
            continue;

        output ~= buf;
    }

    write(output);
}
Этот метод может быть более эффективным чем в предыдущем примере, поскольку stdin.readln(buf) повторно использует (если возможно) память, распределённую для буфера, поскольку buf, whereas line = stdin.readln() распределяет новую память для каждой строки.
Для еще более высокой производительности вы можете помочь readln , передавая большой буфер, чтобы избежать перераспределений памяти. Это может быть сделано посредством повторного использования самого большого буфера, возвращённого readln:

Example:

// Читать строки из $(D stdin) считать слова

void main()
{
    char[] buf;
    size_t words = 0;

    while (!stdin.eof)
    {
        char[] line = buf;
        stdin.readln(line);
        if (line.length > buf.length)
            buf = line;

        words += line.split.length;
    }

    writeln(words);
}
Это на самом деле то, что внутренне делает byLine, так что рекомендуется его использовать, если вы хотите обработать весь файл.

uint readf(Data...)(in char[] format, Data data);
Прочитать данные data из файла в соответствии с заданным описателем формата, используя std.format.formattedRead.
Примеры:
// @system из-за использования readf
static import std.file;

auto deleteme = testFilename();
std.file.write(deleteme, "hello\nworld\ntrue\nfalse\n");
scope(exit) std.file.remove(deleteme);
string s;
auto f = File(deleteme);
f.readf("%s\n", &s);
assert(s == "hello", "["~s~"]");
f.readf("%s\n", &s);
assert(s == "world", "["~s~"]");

// Issue 11698
bool b1, b2;
f.readf("%s\n%s\n", &b1, &b2);
assert(b1 == true && b2 == false);
static @safe File tmpfile();
Возвращает временный файл, вызывая tmpfile. Заметьте, что созданный файл не имеет имени.
static @safe File wrapFile(FILE* f);
Небезопасная функция, которая завёртывает существующий FILE*. Результирующий File никогда по своей инициативе не закрывает файл. Заметьте, что созданный файл не имеет имени.
pure @safe FILE* getFP();
Возвращает FILE*, соответствующий этому объекту.
const @property @trusted int fileno();
Возвращает номер файла, соответствующий этому объекту.
@property HANDLE windowsHandle();
Возвращает нижележащий HANDLE операционной системы (только для Windows).
auto byLine(Terminator = char, Char = char)(KeepTerminator keepTerminator = No.keepTerminator, Terminator terminator = '\x0a')
if (isScalarType!Terminator);

auto byLine(Terminator, Char = char)(KeepTerminator keepTerminator, Terminator terminator)
if (is(Unqual!(ElementEncodingType!Terminator) == Char));
Возвращает входной диапазон, настроенный для чтения из файлового дескриптора по одной строке за раз.
Тип элементов для диапазона будет Char[]. Примитивы дипазона могут бросить исключения StdioException при ошибке ввода/вывода.

Замечание: Каждое переднее значение (front) не будет сохраняться после вызова popFront, так что вызывающий код должен скопировать его содержимое (например, вызывая to!string) когда сохранение необходимо. Если вызывающему оператору нужно сохранить копию каждой строки, используйте вместо этого функцию byLineCopy.

Параметры:
Char Тип символов для каждой строки, по-умолчанию char.
KeepTerminator keepTerminator Используйте Yes.keepTerminator чтобы включить terminator в конце каждой строки.
Terminator terminator Разделитель строк ('\n' по-умолчанию). Используйте std.ascii.newline для портируемости (если файл не был открыт в текстовом режиме).

Пример:

import std.algorithm, std.stdio, std.string;
// Количество слов в файле с использованием диапазонов.
void main()
{
    auto file = File("file.txt"); // Открыто для чтения
    const wordCount = file.byLine()            // Прочесть строки
                          .map!split           // Разделить на слова
                          .map!(a => a.length) // Подсчитать количество слов в строках
                          .sum();              // Общее количество слов
    writeln(wordCount);
}

Пример:

import std.range, std.stdio;
// Количество строк с использованием foreach.
void main()
{
    auto file = File("file.txt"); // Открыто для чтения
    auto range = file.byLine();
    // Печать первых трёх строк 
    foreach (line; range.take(3))
        writeln(line);
    // Печать остальных строк, начинающихся с '#'
    foreach (line; range)
    {
        if (!line.empty && line[0] == '#')
            writeln(line);
    }
}
Обратите внимание, что ни один пример не получал доступ к данным строки, возвращаемой front после того, как был сделан соответствующий вызов popFront (поскольку содержание вполне может измениться).

auto byLineCopy(Terminator = char, Char = immutable(char))(KeepTerminator keepTerminator = No.keepTerminator, Terminator terminator = '\x0a')
if (isScalarType!Terminator);

auto byLineCopy(Terminator, Char = immutable(char))(KeepTerminator keepTerminator, Terminator terminator)
if (is(Unqual!(ElementEncodingType!Terminator) == Unqual!Char));
Возвращает входной диапазон, настроенный для чтения из файлового дескриптора по одной строке за раз. Каждая строка будет выделяться заново. front будет кешировать своё значение, чтобы позволить повторные вызовы без лишних распределений памяти.

Замечание: Из-за кэширования byLineCopy может быть более эффективной по использованию памяти, чем File.byLine.map!idup.

Типом элементов для диапазона будет Char[]. Примитивы диапазона могут бросить исключение StdioException при ошибке ввода/вывода.

Параметры:
Char Тип символов для каждой строки, по умолчанию immutable char.
KeepTerminator keepTerminator Используйте Yes.keepTerminator, чтобы включить terminator в конце каждой строки.
Terminator terminator Разделитель строк ('\n' по-умолчанию). Используйте std.ascii.newline для портируемости (если файл не был открыт в текстовом режиме).

Пример:

import std.algorithm, std.array, std.stdio;
// Печать отсортированных строк файла.
void main()
{
    auto sortedLines = File("file.txt")   // Открыть для чтения
                       .byLineCopy()      // Чтение сохраняющихся строк
                       .array()           // в массив
                       .sort();           // затем их сортировка
    foreach (line; sortedLines)
        writeln(line);
}

Смотрите также:
ByRecord!Fields byRecord(Fields...)(string format);
Создаёт входной диапазон, настроенный для выполнения грамматического разбора одной строки из файла в кортеж.
Примитивы диапазона могут бросить исключение StdioException при ошибке ввода/вывода.
Параметры:
file дескриптор разбираемого файла
string format Формат записи кортежа
Возвращает:
Входной диапазон, настроенный для выполнения грамматического разбора одной строки из файла в кортеж.
Смотрите также:
Это похоже на byLine с использованием format под капотом.
Примеры:
static import std.file;
import std.typecons : tuple;

// подготовка тестового файла
auto testFile = testFilename();
scope(failure) printf("Failed test at line %d\n", __LINE__);
std.file.write(testFile, "1 2\n4 1\n5 100");
scope(exit) std.file.remove(testFile);

File f = File(testFile);
scope(exit) f.close();

auto expected = [tuple(1, 2), tuple(4, 1), tuple(5, 100)];
uint i;
foreach (e; f.byRecord!(int, int)("%s %s"))
{
    assert(e == expected[i++]);
}
Я в этом примере так и не понял, где брать функцию testFilename(), поэтому вместо неё просто открыл объект File, передав в него имя файла – прим. пер.
auto byChunk(size_t chunkSize);

ByChunk byChunk(ubyte[] buffer);
Возвращает входной диапазон, настроенный для чтения из файла по куску за один раз.
Тип элементов для диапазона будет ubyte[]. Примитивы дипазона могут бросить исключение StdioException при ошибке ввода/вывода.

Пример:

void main()
{
    // Прочитайть со стандартного входа 4KB за один раз
    foreach (ubyte[] buffer; stdin.byChunk(4096))
    {
        ... использовать buffer ...
    }
}
Параметр может быть числом (как показано в примере выше) предписывающим размер каждого куска. Кроме того, byChunk может принимать предоставленный пользователем буфер, который он использует непосредственно.

Пример:

void main()
{
    // Прочитайть со стандартного входа 4KB за один раз
    foreach (ubyte[] buffer; stdin.byChunk(new ubyte[4096]))
    {
        ... использовать buffer ...
    }
}
В любом случае, содержимое buffer используется повторно в течение всех вызовов. Это означает, что front не сохраняется после вызова popFront, так что если требуется сохранение, вызывающий код должен скопировать его содержимое (например, вызывая buffer.dup).
В примере выше, buffer.length (длина буфера) равна 4096 для всех итераций, за исключением последней, в её случае buffer.length может быть меньше, чем 4096 (но всегда больше, чем нуль).
С упомянутыми ограничениями, byChunks работает с любым алгоритмом, совместимым с входными диапазонами.

Пример:

// Эффективное копирование файла, по 1MB за один раз.
import std.algorithm, std.stdio;
void main()
{
    stdin.byChunk(1024 * 1024).copy(stdout.lockingTextWriter());
}
Можно использовать std.algorithm.iteration.joiner для ленивого соединения кусков вместе в единственный диапазон.

Пример:

import std.algorithm, std.stdio;
void main()
{
    //Диапазон диапазонов
    static assert(is(typeof(stdin.byChunk(4096).front) == ubyte[]));
    //Диапазон элементов
    static assert(is(typeof(stdin.byChunk(4096).joiner.front) == ubyte));
}

Возвращает:
Вызов byChunk возвращает диапазон, инициализированный объектом File и выделенным буфером.
Исключения:
Если предоставленный пользователем размер равен нулю или предоставленный пользователем буфер пуст, бросается исключение. В случае ошибки ввода/вывода бросается исключение StdioException.
@safe auto lockingTextWriter();
Возвращает выходной диапазон, который блокирует файл и позволяет быструю запись в него.
Смотрите пример в описании byChunk.
auto lockingBinaryWriter();
Возвращает выходной диапазон, который блокирует файл и позволяет быструю запись в него.

Пример: Формирует изображение в градациях серого множества Мандельброта в двоичном Netpbm-формате на стандартный вывод.

import std.algorithm, std.range, std.stdio;

void main()
{
    enum size = 500;
    writef("P5\n%d %d %d\n", size, size, ubyte.max);

    iota(-1, 3, 2.0/size).map!(y =>
        iota(-1.5, 0.5, 2.0/size).map!(x =>
            cast(ubyte)(1+
                recurrence!((a, n) => x + y*1i + a[n-1]^^2)(0+0i)
                .take(ubyte.max)
                .countUntil!(z => z.re^^2 + z.im^^2 > 4))
        )
    )
    .copy(stdout.lockingBinaryWriter);
}

@property @safe ulong size();
Получить размер файла, ulong.max, если файл без возможности поиска, но по-прежнему бросает исключение в случае фактической ошибки.

Переместиться к: read · readWrite

enum LockType: int;
Используется для определения типа блокировки для File.lock и File.tryLock.
read
Определяет блокировку чтения (многопользовательскую). Блокировка чтения запрещает всем процессам доступ на запись к определенному региону файла, включая процесс, который первым заблокировал регион. Все процессы могут читать заблокированный регион. Множество одновременных блокировок чтения допускаются, пока нет исключительных блокировок.
readWrite
Определяет блокировку чтения/записи (исключительную). Блокировка чтения/записи запрещает всем остальным процессам как доступ на чтение, так и на запись к заблокированному региону файла. Если сегмент имеет исключительную блокировку, он не может иметь никаких многопользовательских блокировок или других исключительные блокировок.
enum auto isFileHandle(T);
Указывает, является ли T дескриптором файлов, то есть типом, неявно преобразуемым в File, или указателем на core.stdc.stdio.FILE.
Возвращает:
true, если T является дескриптором файлов, false в противном случае.
Примеры:
static assert(isFileHandle!(FILE*));
static assert(isFileHandle!(File));
void write(T...)(T args)
if (!is(T[0] : File));
Для каждого аргумента arg в args, форматирует аргумент (в соответствии с to!(string)(arg)) и записывает результирующую строку в args[0]. Вызов без каких-либо аргументов не будет компилироваться.
Параметры:
T args элементы, записываемые в stdout
Исключения:
В случае ошибки ввода/вывода, бросается исключение StdioException.
void writeln(T...)(T args);
Эквивалентно write(args, '\n'). Вызов writeln без аргументов допустим, и просто печатает новую строку на стандартный вывод.
Параметры:
T args элементы, записываемые в stdout
Исключения:
В случае ошибки ввода/вывода, бросается исключение StdioException.
void writef(T...)(T args);
Пишет форматированные данные на стандартный вывод (без перевода строки в конце).
Параметры:
T args Первым аргументом args[0] должна быть форматирующая строка, определяющая как форматировать остальные аргументы. Для полного описания синтаксиса форматирующей строки, и того, как она управляет форматированием остальных аргументов, пожалуйста обратитесь к документации по std.format.formattedWrite.

Замечание: Раньше, в более старых версиях Phobos, было возможно написать:

writef(stderr, "%s", "message");
чтобы печатать сообщение в stderr. Этот синтаксис не больше не поддерживается, и заменён на:
stderr.writef("%s", "message");

void writefln(T...)(T args);
Эквивалентно writef(args, '\n').
uint readf(A...)(in char[] format, A args);
Читает данные из stdin согласно определенному описателю формата, используя std.format.formattedRead.

Переместиться к: 2

S readln(S = string)(dchar terminator = '\x0a')
if (isSomeString!S);
Читает строку из stdin.
Эта версия управляет своим собственным буфером чтения, который означает одно распределение памяти на вызов. Если вы не сохраняете ссылку на прочитанные данные, рассмотрите версию readln(buf), которая может предложить лучшую производительность, так как может многократно использовать свой буфер чтения.
Возвращает:
Прочитанная строка, включая символ перевода строки terminator.
Параметры:
S Параметр шаблона; тип размещаемого буфера, и возвращаемый тип. Установлен по умолчанию в string.
dchar terminator Символ перевода строки (по умолчанию, '\n').

Замечание: Терминаторы строки не поддерживаются из-за неоднозначности с readln(buf) ниже.

Исключения:
StdioException при ошибке ввода/вывода, или UnicodeException при ошибке преобразования Unicode.

Пример: Читает stdin и записывает в stdout.

import std.stdio;

void main()
{
    string line;
    while ((line = readln()) !is null)
        write(line);
}

size_t readln(C)(ref C[] buf, dchar terminator = '\x0a')
if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum));

size_t readln(C, R)(ref C[] buf, R terminator)
if (isSomeChar!C && is(Unqual!C == C) && !is(C == enum) && isBidirectionalRange!R && is(typeof(terminator.front == (dchar).init)));
Читает строку из stdin и пишет её в buf[], включая символ перевода строки.
Это может быть быстрее, чем line = readln(), поскольку вы можете многократно использовать буфер для каждого вызова. Заметьте, что повторное использование буфера означает, что вы должны скопировать предыдущее содержимое, если вам нужно его сохранить.
Возвращает:
size_t 0 для конца файла, в противном случае количество прочитанных символов
Параметры:
C[] buf Буфер, используемый для хранения данных полученной строки. buf изменит размеры при необходимости.
dchar terminator Символ перевода строки (по умолчанию, '\n'). Используйте std.ascii.newline для портируемости (если файл не был открыт в текстовом режиме).
Исключения:
StdioException при ошибке ввода/вывода, или UnicodeException при ошибке преобразования Unicode.

Пример: Читает stdin и записывает в stdout.

import std.stdio;

void main()
{
    char[] buf;
    while (readln(buf))
        write(buf);
}

nothrow @nogc @trusted FILE* popen(R1, R2)(R1 name, R2 mode = "r")
if ((isInputRange!R1 && isSomeChar!(ElementEncodingType!R1) || isSomeString!R1) && (isInputRange!R2 && isSomeChar!(ElementEncodingType!R2) || isSomeString!R2));
Удобная функция, которая перенаправляет к core.sys.posix.stdio.popen с соответственно построенными строками в стиле С.

Переместиться к: this

struct lines;
Итерирует все строки файла с использованием foreach.

Пример:

void main()
{
  foreach (string line; lines(stdin))
  {
    ... use line ...
  }
}
Символ перевода строки (по умолчанию '\n' ) является частью прочитанной строки (он может отсутствовать в последней строке файла). Для строки line поддерживается несколько типов, и поведение lines изменяется соответственно:
  1. Если line имеет тип string, wstring, или dstring, новая строка соответствующего типа распределяется в памяти при каждом чтении.
  2. Если line имеет тип char[], wchar[], dchar[], содержимое line будет перезаписываться при чтении.
  3. Если line имеет тип immutable(ubyte)[], поведение аналогично случаю (1), за исключением того, что не будет попыток проверять UTF на входе.
  4. Если line имеет тип ubyte[], поведение аналогично случаю (2), за исключением того, что не будет попыток проверять UTF на входе.
Во всех случаях, двух-аргументные версии также принимаются, в этом случае первый аргумент (целого типа, например, ulong или uint), отслеживает начинающийся с нуля номер текущей строки.

Пример:

  foreach (ulong i, string line; lines(stdin))
  {
    ... use line ...
  }
В случае ошибки ввода/вывода, бросается исключение StdioException.

Смотрите также:
this(File f, dchar terminator = '\x0a');
Конструктор.
Параметры:
File f Файл для построчного чтения.
dchar terminator Разделитель строк (по-умолчанию '\n').
auto chunks(File f, size_t size);
Итерирует весь файл по куску за один раз с использованием foreach.

Пример:

void main()
{
    foreach (ubyte[] buffer; chunks(stdin, 4096))
    {
        ... use buffer ...
    }
}
Содержимое буфера buffer перезаписывается при вызовах. В примере выше, buffer.length равно 4096 для всех итераций, за исключением последней, в этом случае buffer.length может быть меньше, чем 4096 (но всегда больше, чем нуль).
В случае ошибки ввода/вывода, бросается исключение StdioException.

void toFile(T)(T data, string fileName)
if (is(typeof(copy(data, stdout.lockingBinaryWriter))));
Пишет массив или диапазон в файл. Короткая запись для data.copy(File(fileName, "wb").lockingBinaryWriter). Подобно std.file.write, строки записываются как есть, а не кодируются в соответствии с ориентацией файла.

Переместиться к: errno · opCall · this

class StdioException: object.Exception;
Бросаемые исключения в случае ошибок ввода/вывода.
uint errno;
Код ошибки операционной системы.
@trusted this(string message, uint e = core.stdc.errno.errno);
Инициализация с сообщением message и кодом ошибки.
static void opCall(string msg);

static void opCall();
Удобная функция, которая бросает исключение StdioException.
File stdin;
Стандартный поток ввода.
Недостатки:
Из-за bug 15768, переназначение stdin в другой экземпляр File, кроме встроенного, не является потокобезопасным.
Примеры:
// Чтение stdin, сортировка строк, запись в stdout
import std.stdio, std.array, std.algorithm : sort, copy;

void main() {
    stdin                       // чтение из stdin
    .byLineCopy(Yes.keepTerminator) // копирование каждой строки
    .array()                    // преобразование в массив строк
    .sort()                     // сортировка строк
    .copy(                      // копирование вывода .sort в выходной диапазон
        stdout.lockingTextWriter()); // выходной диапазон
}
File stdout;
Стандартный поток вывода.
Недостатки:
Из-за bug 15768, переназначение stdout в другой экземпляр File, кроме встроенного, не является потокобезопасным.
File stderr;
Стандартный поток ошибок.
Недостатки:
Из-за bug 15768, переназначение stderr в другой экземпляр File, кроме встроенного, не является потокобезопасным.
File openNetwork(string host, ushort port);
Экспериментальный сетевой доступ через файловый интерфейс
Открывает TCP-соединение к данному хосту host и порту port, затем возвращает структуру File с доступом на чтение и запись через такой же интерфейс, как с любым другим файлом (это означает, что writef и диапазоны Byline работают!).
Авторы:
Adam D. Ruppe
Недостатки:
Работает только в Linux