我最初使用fgets()
逐行解析文件。
现在我改变了一些东西,以便我已将整个文件放在缓冲区中。我仍然想逐行读取缓冲区以进行解析。是否有针对此设计的内容,或者我是否需要制作一个在此时检查0x0A
char
的循环?
答案 0 :(得分:6)
memchr
(带有一些你自己的包装代码,以memcpy
结尾)是完全等价的 - 就像fgets
它需要处理的最大长度(应该是剩余输入缓冲区大小的min和输出缓冲区的大小)并扫描,直到它达到所需的字符(将是'\n'
)或用完输入/输出空间。
请注意,对于已存在于内存缓冲区中的数据,您可能希望跳过复制到单独输出缓冲区的步骤,除非您需要在不修改输入的情况下对输出进行空终止。许多初学者C程序员经常犯思考他们需要空终止的错误,只需改进一些接口以获取(指针,长度)对就足够了,允许您传递/处理子字符串而不复制它们。例如,您可以使用:printf
printf("%.*s", (int)length, start);
答案 1 :(得分:2)
您可以使用sscanf
功能。如果你真的需要整行,那么这样的事情应该可以解决问题:
sscanf(your_buffer, "%50[^\n]", line);
(这将读取最多50个字符的行。一如既往,请注意长度和0
终结符。并检查sscanf
的返回值,以防出现问题。)
您可以使用指针算术来移动缓冲区(只需添加“返回”行长+ 1)。
答案 2 :(得分:0)
sscanf可能适用于您,也可能不适合您。
答案 3 :(得分:0)
如果您正在寻找C函数,strtok()
和strsep()
将在指定字符上拆分字符串。
答案 4 :(得分:0)
对于 C,这应该可行,我认为:
// str (in/out): the unconsumed portion of the input string
static char *sgets(char *buf, int n, const char **str)
{
const char *s = *str;
const char *lf = strchr(s, '\n');
int len = (lf == NULL) ? strlen(s) : (lf - s) + 1;
if (len == 0)
return NULL;
if (len > n - 1)
len = n - 1;
memcpy(buf, s, len);
buf[len] = 0;
*str += len;
return buf;
}