#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