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).
Таким образом, кажется, что нет никакой гарантии, но это будет, вероятно, работать в большинстве реализаций так или иначе. (Известные последние слова...)
С 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-Нет, это не является частью стандарта. Конечно, возможно, что вы использовали внедрение библиотеки, где было описанное вами поведение произошло, но это нестандартное расширение, на котором вы не должны положиться.
Нет. Следите за межпроцессорными тупиками при работе с потоками STD, когда либо прочитайте на stdin, либо записать на блоках stdout.
Нет. 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; }
Надеюсь, это поможет, С уважением, Том.
Чтобы ответить на ваш вопрос, вы делают , нуждаются в дополнительном fflush (stdout);
после вашего printf ()
вызов Убедитесь, что подсказка появится до того, как ваша программа пытается прочитать ввод. Чтение от stdin
не fflush (stdout);
для вас.
Нет. Вам нужно fflush (stdout); Многие реализации будут промываться при каждой новой строке, которые они отправляют вывод на терминал.