Чтение из stdin сбрасывают stdout?

stdout с буфером строки при соединении с терминалом, но я не забываю читать где-нибудь, что чтение (по крайней мере, от stdin) автоматически сбросит stdout. Все реализации C, которые я использовал, сделали это, но я не могу найти его в стандарте теперь.

Это действительно имеет смысл, что это прокладывает себе путь, иначе кодируйте как это:

printf("Type some input: ");
fgets(line, sizeof line, stdin);

нуждался бы в дополнительном fflush(stdout);

Таким образом, stdout, как гарантируют, будет сброшен здесь?

Править:

Как несколько ответов сказали, кажется, нет никакой гарантии в стандарте, что вывод к stdout в моем примере появится перед чтением от stdin, но с другой стороны, это намерение указано в (моя бесплатная черновая копия) стандарт:

Входная и выходная динамика интерактивных устройств должна произойти, как указано в 7.19.3. Намерение этих требований состоит в том, который освободил буфер, или вывод с буфером строки, кажется, как можно скорее, гарантируют, чтобы подсказки на самом деле появились до программы, ожидающей входа.

(Проект Комитета ISO/IEC 9899:TC2 - 6 мая 2005, страница 14).

Таким образом, кажется, что нет никакой гарантии, но это будет, вероятно, работать в большинстве реализаций так или иначе. (Известные последние слова...)

15
задан Ry- 13 January 2012 в 16:59
поделиться

6 ответов

С WCF или ASMX убедитесь, что вы добавляете свои сервисы на свои страницы, используя тег ASP: ScriptManager. Для вас будет создан JavaScript Proxies для вас, и это преимущество в том, что вам не нужно вообще разбираться, независимо от базового протокола. Это очень, очень мило. Этот пример является ASMX, но это каждый бит чистый, как с использованием WCF.

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services>
        <asp:ServiceReference Path="~/WebServices/Admin/HospitalLocationService.asmx" InlineScript="true" />
    </Services>
</asp:ScriptManager>

Кроме того, вы можете сделать ASMX отправлять JSON, добавив атрибуты ScriptService и ScriptMethod:

<System.Web.Services.WebService(Namespace:="http://www.fujimed.com/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
<ScriptService()> _
Public Class HospitalLocationService
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    <ScriptMethod()> _
    Public Function GetAll() As List(Of HospitalLocationEntity)
        Return (New HospitalLocation()).GetAll().Data
    End Function

    <WebMethod()> _
    <ScriptMethod()> _
    Public Function GetByID(ByVal ID As Integer) As HospitalLocationEntity
        Return (New HospitalLocation()).GetHospitalLocation(ID).Data
    End Function

End Class

Отрещающая службу без анализа (это то, что делает для вас ScriptManager):

 function editLocation(id) {
    vRIS.HospitalLocationService.GetByID(id, getComplete, getError);
 }

 function getComplete(results, context, methodName) {
    document.all['txtLocation'].value = results.Location;
    document.all['txtInterfaceID'].value = results.InterfaceID;
    document.all['selActive'].value = results.Active ? "true" : "false";
    document.all['hdnLocationID'].value = results.ID.toString();
 }

 function getError(errorInfo, context, methodName) {
    Alert(methodName + " : " + errorInfo);
    document.all['txtLocation'].value = "";
    document.all['txtInterfaceID'].value = "";
    document.all['selActive'].value = "false";
    document.all['hdnLocationID'].value = "";
 }

отредактировано для добавления: со всеми вышеуказанными Основываясь на ASMX, я бы все еще прошел WCF, для универсальности и способности определять контракты данных. Также расследуйте услуги WCF RIA; Они нацеливаются на поддержку AJAX, а также Silverlight, и он автоматизирует большую часть конфигурации WCF.

-121--2745551-

Нет, это не является частью стандарта. Конечно, возможно, что вы использовали внедрение библиотеки, где было описанное вами поведение произошло, но это нестандартное расширение, на котором вы не должны положиться.

2
ответ дан 1 December 2019 в 03:34
поделиться

Нет. Следите за межпроцессорными тупиками при работе с потоками STD, когда либо прочитайте на stdin, либо записать на блоках stdout.

1
ответ дан 1 December 2019 в 03:34
поделиться

Нет. stdin / stdout буферизованы. Вам необходимо откровенность fflush (stdout) , чтобы забафрованные данные в памяти клемма видеопородок / Unix можно выталкиваться на устройстве просмотра, такого как терминал. Буксировка данных может быть установлена ​​путем вызова SETVBUF .

Редактировать: Спасибо Джонатан, чтобы ответить на вопрос, чтение от stdin не промывает stdout. Возможно, я отступил с тангентом здесь, указав код, демонстрирующий, как использовать SETVBUF .

  #include 

  int main(void)
  {
     FILE *input, *output;
     char bufr[512];

     input = fopen("file.in", "r+b");
     output = fopen("file.out", "w");

     /* set up input stream for minimal disk access,
        using our own character buffer */
     if (setvbuf(input, bufr, _IOFBF, 512) != 0)
        printf("failed to set up buffer for input file\n");
     else
        printf("buffer set up for input file\n");

     /* set up output stream for line buffering using space that
        will be obtained through an indirect call to malloc */
     if (setvbuf(output, NULL, _IOLBF, 132) != 0)
        printf("failed to set up buffer for output file\n");
     else
        printf("buffer set up for output file\n");

     /* perform file I/O here */

     /* close files */
     fclose(input);
     fclose(output);
     return 0;
  }

Надеюсь, это поможет, С уважением, Том.

4
ответ дан 1 December 2019 в 03:34
поделиться

Нет, это не так.

5
ответ дан 1 December 2019 в 03:34
поделиться

Чтобы ответить на ваш вопрос, вы делают , нуждаются в дополнительном fflush (stdout); после вашего printf () вызов Убедитесь, что подсказка появится до того, как ваша программа пытается прочитать ввод. Чтение от stdin не fflush (stdout); для вас.

5
ответ дан 1 December 2019 в 03:34
поделиться

Нет. Вам нужно fflush (stdout); Многие реализации будут промываться при каждой новой строке, которые они отправляют вывод на терминал.

4
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: