язык программирования d: проблема со стандартным вводом или недопонимание?

#exception #d #stdin #dmd

#исключение #d #стандартный интерфейс #dmd

Вопрос:

Вот простая программа, которая считывает строки из stdin и выводит их в стандартный вывод.

 module test;

import std.stdio; 

void main(string[] args) 
{

    foreach (int i, string line; lines(stdin)) {
        writeln(line ~ " (test)");
    }
}
  

Я использую компилятор Windows DMD версии v2.052.

Если я сделаю : type file.txt | test.exe

Программа добавляет слово «test» к каждой строке file.txt и выводит их на консоль.

Однако я продолжаю получать ошибку в конце:

std.stdio.StdioException@stdstdio.d(2138): Bad file descriptor

Может быть, я что-то упускаю? Это сводит меня с ума! 🙂

Комментарии:

1. Я не знаком с командой type, возможно, она не отправляет EOF после завершения работы с файлом. В Linux вы просто делаете: ./test < file.txt

2. Вау. Проблема решается, если я использую это : test.exe < file.txt Превратите свой комментарий в ответ, и я отмечу его как решение: спасибо!

Ответ №1:

Это давняя ошибка: http://d.puremagic.com/issues/show_bug.cgi?id=3425

То, что вы пытаетесь сделать, определенно работает в операционных системах, отличных от Windows, и должно работать и в Windows. Я думаю, что это ошибка в реализации Digital Mars функций ввода-вывода C, которые обернуты std.stdio . Я пытался исправить эту ошибку раньше, но никогда даже не удавалось определить ее первопричину.

Ответ №2:

Я не знаком с командой type, возможно, она не отправляет EOF после завершения работы с файлом. В Linux вы просто делаете: ./test < file.txt

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

./test > output.txt