Вы можете прочитать один байт или до eof:
char buffer[32]; // Very long number!
if (NULL == (fp = fopen(FILENAME, "rb")))
{
// TODO: return a suitable error/perror
return -1;
}
bytesread = fread(buffer, sizeof(char), sizeof(buffer)-1, fp);
fclose(fp);
if (!bytesread)
{
// Nothing at all was read
// TODO: return error
return -2;
}
// This is in case you want the byte interpreted from ASCII
// otherwise you'd just return buffer[0], or (*(DATATYPE *)buffer)[0].
buffer[bytesread] = 0x0;
return atol(buffer);
Этот код на самом деле не такой общий, поскольку многие аппаратные устройства будут реализовывать блокирующий канал данных, то есть, если вы попытаетесь прочитать больше данных, чем есть, fread будет блокироваться до тех пор, пока данные не станут доступными. В таком случае просто измените размер буфера на максимальное необходимое вам количество байтов плюс один.
Плюс один и соответствующий -1 в fread существуют только для случая, когда данные, которые вы читаете, отображаются как ASCII, т. е. "128" - это три байта ASCII "1", "2", "8" и, возможно, даже возврат каретки вместо двоичного 0x80. В этом случае буфер завершается нулем, чтобы сделать его строкой C, с которой atol может работать для извлечения десятичного числа.
Если требуется двоичное значение, то такое преобразование не требуется, и можно прочитать весь буфер без корректировок, не устанавливать последний плюс один байт в ноль и просто вернуть приведенное значение из буфера; или buffer[0], если нужен только один байт.
person
LSerni
schedule
06.07.2012