C стандартный вывод printf

У меня странная проблема с выводом данных. Я использую printf для печати строки char*, а затем после этого печатаю еще одну. Однако часть первой строки не печатается, и когда я печатаю вторую строку, к ней добавляется отсутствующая часть первой. Что здесь происходит?

Я пишу простую реализацию libpcap. Вот пример функции обратного вызова, которая даст те же результаты. Я попытался удалить буферизацию и добавить putchar('\n') после печати, но это не помогло.

void ParseData(u_char* useless, const struct pcap_pkthdr* pkthdr, const u_char* packet){
   int packetLen, i;
   packetLen = pkthdr->len;
   for (i = 0; i < packetLen; i++){
      putchar(packet[i]);
   }
}

person Ilia Choly    schedule 09.04.2010    source источник
comment
Не могли бы вы показать код? Это может помочь.   -  person ereOn    schedule 09.04.2010
comment
Хотите поделиться примером исходного кода и вывода?   -  person ndim    schedule 09.04.2010


Ответы (4)


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

  • После первого printf вызовите fflush(stdout);, чтобы очистить буфер.

  • В качестве альтернативы вызовите setbuf(stdout, NULL);, чтобы отключить буферизацию. Сделайте это, прежде чем делать какие-либо printfs.

  • Обход stdio путем кодирования API для конкретных платформ, таких как write (POSIX) или WriteFile (Windows). Обычно я бы рекомендовал против этого, особенно для чего-то вроде stdout..

person asveikau    schedule 09.04.2010

Есть вероятность, что ваш первый printf не имеет '\n' в конце. В некоторых случаях данные могут быть буферизованы и напечатаны вместе, когда встречается '\n'.

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

person Jay    schedule 09.04.2010

Это называется буферизацией файлового потока.

Вы можете отключить его или изменить размер буфера с помощью setvbuf(). Или просто fflush() после каждой печати. Однако буфер потока (обычно) очищается, когда присутствует признак конца строки (\n).

person jweyrich    schedule 09.04.2010

У меня есть аналогичный опыт, но это больше связано с двойным байтом. У меня есть 2 символа *, определяющие спину к спине. Я прочитал некоторый char в первую строку. Оказывается, это был двойной байт, поэтому оставшаяся часть строки переносится на вторую строку.

person Chuk Lee    schedule 09.04.2010