как записать / сохранить содержимое буфера в файл на C с помощью fprintf

#c

#c

Вопрос:

У меня есть код hidraw.c ниже, в котором я использую «fprintf» для записи содержимого буфера в файл, но он не записывает стандартный вывод в указанный файл. Файл создан, но файл пуст. Кто-нибудь знает, как подойти к этой проблеме? Полный исходный код можно найти здесь:

https://code.woboq.org/linux/linux/samples/hidraw/hid-example.c.html

Ниже приведен фрагмент кода, по которому мне нужна помощь. Я новичок в C prog.

 FILE *fp;
int loop = 10;
fp=fopen("test.txt", "a");
while (loop !=0)
{
    res = read(fd, buf, 16);
    if (res < 0) {
        perror("read");
    } else {
        printf("read() read %d bytes:nt", res);
        
        if(fp == NULL)
                exit(-1);

        for (i = 0; i < res; i  )
            /* This printf will print buffer in the real time */
            /*printf("%hhx ", buf[i]);*/
            /* This is to write buffer to a file  but this does not capture the data*/  
            fprintf(fp, "%hhx ", buf[i]);
    }
}
fclose(fp);
close(fd); 
  

Комментарии:

1. Почему вы смешиваете небуферизованные функции, подобные read и буферизованные записи, подобные fprintf ? Обычно по соображениям производительности вы должны придерживаться использования всех FILE* операций, если у вас нет каких-то особых потребностей, например, вы используете сокет.

2. Что res устанавливается при чтении? Что buf определяется как?

3. опубликованный код не компилируется! Основными причинами, по которым он не компилируется, являются: 1) отсутствуют необходимые #include инструкции. 2) нет определения функции.

4. относительно: if(fp == NULL) exit(-1); это должно быть сразу после вызова to fopen() , а не несколькими операторами позже

5. относительно: while (loop !=0) { res = read(fd, buf, 16); if (res < 0) { perror("read"); ГОРАЗДО лучше использовать вызов для read() управления while() циклом

Ответ №1:

относительно;

 fprintf(fp, "%hhx ", buf[i]);
  

Предполагая, что вызов fopen() был успешным

Это помещение байтов из buf[] в выходной поток для выходного файла. Но НЕ пересылать эти байты в фактический файл.

Предложите, после завершения цикла:

 fflush( fp );
  

Комментарии:

1. @aqh999, поскольку это хороший ответ, пожалуйста, поддержите ответ