#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);
это должно быть сразу после вызова tofopen()
, а не несколькими операторами позже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, поскольку это хороший ответ, пожалуйста, поддержите ответ