【发布时间】:2015-01-28 16:31:38
【问题描述】:
我需要从不同的流(不仅仅是标准输入)中读取数据。我发现了 fgets 函数,可以读取一些有限数量的字符,但是我需要像 get 一样获取整个字符串,但我必须指定输入流。请帮忙解决这个问题。
【问题讨论】:
-
如果你确定你的行有一个最大尺寸,那么使用
fgets和那个尺寸的字符数组(或者可能是两倍大小的好测量)。如果您根本不想要任何限制,那么您仍然需要为与fgets一起使用的数组选择一个最大大小,然后使用malloc/realloc动态分配和增长您复制缓冲区满的结果数组从fgets调用中获取。如果fgets返回的字符串不包含换行符,则要么 仅读取部分行或 读取文件中的最后一行但它没有包含换行符。 -
或者,如果你被允许使用非标准函数,你可以使用getline。
-
@ooga:
getline()是 POSIX (2008) 标准函数(但不是 C11 标准函数)。如果您确实必须担心行数超过 4 KiB,那么这是一个不错的选择。至少,这是我使用的阈值。对于一般用途的工作,我使用char buffer[4096];和fgets(buffer, sizeof(buffer), fp)并且我什至不总是确保前 4095 个字符中有换行符——这并不重要(就像我期待 32 个字符,但需要“处理”古怪的输入)。