C stdout printf - PullRequest
       15

C stdout printf

0 голосов
/ 09 апреля 2010

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

Я пишу простую имплиментацию libpcap. Вот пример функции обратного вызова, которая даст те же результаты. Я попытался удалить буферизацию и добавить путчар ('\ 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]);
   }
}

Ответы [ 4 ]

7 голосов
/ 09 апреля 2010

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

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

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

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

2 голосов
/ 09 апреля 2010

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

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

1 голос
/ 09 апреля 2010

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

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

0 голосов
/ 09 апреля 2010

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

...