2013-02-24 5 views
0

Я новичок в программировании. Я пытался выяснить временную задержку, чтобы замедлить выполнение моей программы. Я занимаюсь исследованиями и не могу найти тот, который работает, который я читал о nanosleep и sleep. Я пробовал оба, но когда я помещал их в цикл for, он ждет несколько секунд, а затем выполняет весь цикл for без паузы между итерациями. Может быть, у меня ошибка в коде? Я включил его ниже.Создание задержки в C

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
    int main(void) 
    { 
     FILE *fp; 
     int i; 

     /* open the file */ 
     fp = fopen("/dev/pi-blaster", "w"); 
     if (fp == NULL) { 
     printf("I couldn't open pi-blaster for writing.\n"); 
     exit(0); 
     } 

     /* write to the file */ 
    for(i=99;i>=0;i--){ 
     sleep(1); 
     fprintf(fp, "0=0.%d\n",i); 
    } 
     /* close the file */ 
     fclose(fp); 

     return 0; 
    } 
+1

OS кеширование, скорее всего. Что заставляет вас уверены, что несколько байтов будут видны сразу? –

+0

Попробуйте fflush() после печати. –

+0

Вы используете _this_ pi_blaster? https://github.com/sarfata/pi-blaster/ –

ответ

4

Записывает в ваш файл fp буферизуется. fflush(fp) внутри цикла for, поэтому он записывает данные в файл перед следующей итерацией. В противном случае он будет писать строку в буфер, спящий второй, записать в буфер, спящий второй и т. Д., А затем сбросить буфер в файл либо при заполнении буфера, либо при вызове fclose(fp). man fflush для более подробной информации.

+1

О 'fopen': [' Возвращенный поток полностью буферизирован по умолчанию, если он, как известно, не ссылается на интерактивное устройство'] (http: // www .cplusplus.com/ссылка/cstdio/Еореп /). Не знаю, как «известно, что не ссылаются на интерактивное устройство» определено –

+1

Я думаю, что «интерактивное устройство» является tty или аналогичным. Я бы не подумал, что FIFO будет квалифицироваться как интерактивное устройство. –

+0

В Java есть отдельный «BufferedInputStream' /' BufferedOutputStream », который может быть набит любым другим« InputStream'/'OutputStream' и обычно рекомендуется обернуть каждый« FileInputStream'/'FileOutputStream». Другими словами, приложение полностью запрашивает буферизацию. –

Смежные вопросы