fread:如何知道缓冲区的大小?
fread: How to know the size of the buffer?
在 C 语言中,当我使用 fread
一次性读取文件或其他一些输入时,我怎么知道用什么大小来声明缓冲区?
char buffer[1024];
fp = popen("ls /", "r");
fread(buffer, 1, sizeof(buffer), fp);
输入数据可能有1000行或1行,甚至100000行或更多。
有什么通用规则吗?
不,没有通用规则,因为这完全取决于您打算如何处理数据。你只需要在它来的时候解析它吗?那将是理想的。如果您知道您的输入有 X 字节块中的有用数据 "samples",那么只需一次读取 X 字节并边处理边处理它们。
如果您确实需要将整个输入复制到缓冲区中,那么您将不得不进行初步猜测,如果您的猜测不足,则分配更多内存。
- 在 C++ 中,您可以只使用
std::vector
(或 std::deque
,如果数据不需要在内存中连续)根据需要自动扩展缓冲区。
在 C 中,你必须先 malloc
,然后 realloc
在你的读取循环中,当你 运行 出 space 时你已经分配了。
我建议模仿 std::vector
的行为,使您的缓冲区呈指数扩展(每次乘以 1.5 或 2 之类的系数),以帮助减少您需要执行此操作的次数。因此,假设您首先分配了 1,024 个字节。当 运行 出来时,分配 2,048。当 运行 出来时,分配 4,096。等等。
只有您可以根据您的用例和预期的标称输入来决定什么是好的起始大小。
在 C 语言中,当我使用 fread
一次性读取文件或其他一些输入时,我怎么知道用什么大小来声明缓冲区?
char buffer[1024];
fp = popen("ls /", "r");
fread(buffer, 1, sizeof(buffer), fp);
输入数据可能有1000行或1行,甚至100000行或更多。
有什么通用规则吗?
不,没有通用规则,因为这完全取决于您打算如何处理数据。你只需要在它来的时候解析它吗?那将是理想的。如果您知道您的输入有 X 字节块中的有用数据 "samples",那么只需一次读取 X 字节并边处理边处理它们。
如果您确实需要将整个输入复制到缓冲区中,那么您将不得不进行初步猜测,如果您的猜测不足,则分配更多内存。
- 在 C++ 中,您可以只使用
std::vector
(或std::deque
,如果数据不需要在内存中连续)根据需要自动扩展缓冲区。 在 C 中,你必须先
malloc
,然后realloc
在你的读取循环中,当你 运行 出 space 时你已经分配了。我建议模仿
std::vector
的行为,使您的缓冲区呈指数扩展(每次乘以 1.5 或 2 之类的系数),以帮助减少您需要执行此操作的次数。因此,假设您首先分配了 1,024 个字节。当 运行 出来时,分配 2,048。当 运行 出来时,分配 4,096。等等。只有您可以根据您的用例和预期的标称输入来决定什么是好的起始大小。