Можете да прочетете един байт или до 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);
Този код всъщност не е толкова общ, тъй като много хардуерни устройства ще внедрят блокиращ канал за данни - тоест, ако се опитате да прочетете повече данни, отколкото са там, страхът ще блокира, докато данните станат налични. В такъв случай просто оразмерете буфера до максималния брой байтове, от който се нуждаете, плюс един.
Плюс едно и съответният -1 в fread са там само за случая, в който данните, които четете, са изобразени като ASCII, т.е. "128" е три ASCII байта "1", "2", "8" и може би дори връщане на каретка, вместо двоичен 0x80. В този случай буферът е завършен с нула, за да го превърне в C низ, върху който atol може да работи, за да извлече десетично число.
Ако това, което е необходимо, е двоична стойност, тогава не е необходимо такова преобразуване и човек може да прочете пълния буфер без корекции, да избягва настройването на последния плюс един байт на нула и просто да върне преобразувана стойност от буфера; или буфер [0], ако е необходим само един байт.
person
LSerni
schedule
06.07.2012