fwrite to stdout - неизвестные дополнительные байты [дубликат]

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

Вы можете сделать эту работу (если нужно), изменив подпись, чтобы включить переменная «состояние», передаваемая по ссылке на каждого вызывающего абонента:

private Action<Employee, Shift, QualCheckState> qualificationCheckCallback;

public class QualCheckState { public bool Passed { get; set; } }

// Call it thus:
var state = new QualCheckState { Passed = true }; // Hope for the best
qualificationCheckCallback(someEmployee, someShift, state);
if (state.Passed) {
    // Assume everyone passed
}

Имейте в виду, для этого требуется, чтобы вызываемые лица соблюдали подпись и не перезаписывали чье-либо несостоявшееся состояние:

public void SomeCallee(Employee e, Shift s, State state) {
   // If some other check failed, don't bother doing our check.
   if (!state.Passed) return;
   // Do some check here
   if (checkFailed) state.Passed = false;
}

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

public class QualCheckState {
    private List<bool> _results = new List<bool>();
    public bool Passed { get { return _results.All(s => s); }
    public void RecordResult(bool result) {
        _results.Add(result);
    }
}
5
задан Daniel Leung 28 April 2011 в 05:31
поделиться

4 ответа

Решение MSVC:

#include <io.h>
#include <fcntl.h>
...
_setmode(1,_O_BINARY)

Другие временные ряды могут предоставить решение C99 или альтернативный путь. EDIT: Я считаю, что setmode([file number],O_BINARY) возникла на Borland Turbo C, а другие компиляторы для MS-DOS и Windows имитировали его. Префикс _ делается для того, чтобы пространство имен было чистым и могло отсутствовать на некоторых компиляторах.

11
ответ дан Random832 19 August 2018 в 17:53
поделиться
  • 1
    Но он не поддерживает передачу NULL в качестве имени файла, а начальная строка, с которой вы начинаете, не обязательно имеет имя файла. – Random832 28 April 2011 в 05:01
  • 2
    Благодарю. Он работает даже без io.h, включенных в tinycc и mingw. на bcc32 io.h необходимо включить, а затем изменить _setmode на setmode. – Daniel Leung 28 April 2011 в 06:03
  • 3
    Начиная с Windows 10 (по крайней мере) этого недостаточно. Консоль выполняет собственный перевод, который должен быть отключен отдельно, установив режим консоли DISABLE_NEWLINE_AUTO_RETURN. (Константа определена в Windows 10 SDK, но не в Windows 8 SDK) – AnT 24 January 2018 в 10:15
  • 4
    @AnT OP не упоминает консоль. Я предположил, что stdout - это труба или файл, потому что невозможно определить разницу между одним CR и двумя строками, как в примере на консоли. – Random832 24 January 2018 в 16:27

Текстовый файл преобразует символ C '\n' в родную строку, заканчивающуюся на выходе, и преобразует собственную строку, заканчивающуюся на входе, в один '\n'.

Чтобы получить требуемый результат, вам нужно будет изменить stdout в поток двоичных файлов.

Частичный ответ найден здесь здесь . Если у вас есть библиотека, совместимая с C99, использование:

if (freopen(0, "wb", stdout) == 0)
    ...oops...operation failed...

попытается изменить стандартный вывод на двоичный поток. Однако в Windows может возникнуть проблема с библиотекой, совместимой с C99. Номинально это переносимый (поскольку стандартный) ответ. Вероятно, для выполнения одной и той же работы существует функция, специфичная для Windows.

2
ответ дан Jonathan Leffler 19 August 2018 в 17:53
поделиться
  • 1
    Используя freopen(). – Ignacio Vazquez-Abrams 28 April 2011 в 04:39
  • 2
    @Ignacio: да, спасибо - выяснили, что ... мы живем, мы учимся, мы отвечаем на вопросы. – Jonathan Leffler 28 April 2011 в 04:44
  • 3
    @James: Функция freopen() находится в <stdio.h> с версии 7 Unix, но поведение с нулевым указателем имени файла является новым на C99. В стандарте C89 ничего не говорится о нулевом указателе. – Jonathan Leffler 28 April 2011 в 05:10
  • 4
    Ах. Ну, я каждый день узнаю что-то новое о C. Благодаря! – James McNellis 28 April 2011 в 05:17
  • 5
    спасибо за понимание – Daniel Leung 28 April 2011 в 05:57
#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif

#ifdef __BORLANDC__
#define _setmode setmode
#endif

#include <stdio.h>

static void binary_stdout(void) {
#ifdef _WIN32
    _setmode(_fileno(stdout), _O_BINARY);
#endif
}

int main(void) {
    binary_stdout();
    printf("\n");
    return 0;
}
0
ответ дан Lassi 19 August 2018 в 17:53
поделиться

Просто введите символ LF, например: putc('\x0A', stdout)

0
ответ дан qrdl 19 August 2018 в 17:53
поделиться
  • 1
    Предположительно, вы имели в виду '\x0A'; нотация '\0x0A' - это многосимвольная константа, содержащая, по сути, 4 символа - NUL, x, 0, A. В результате реализована определенная реализация (поэтому вы можете определить, что она надежно, но она может варьироваться от платформы к платформе , или между компиляторами на одной платформе). – Jonathan Leffler 28 April 2011 в 05:27
  • 2
    Джонатан, спасибо, я исправляю. – qrdl 28 April 2011 в 05:47
Другие вопросы по тегам:

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