我最初使用fgets()
逐行解析文件。
现在我改变了策略,已经将整个文件存储在缓冲区中。但是我仍然希望按行读取该缓冲区以进行解析。是否有专门为此设计的东西,或者我需要编写一个循环来检查这一点处的0x0A
char
?
memchr
(加上一点自己的包装代码,以memcpy
结束)是完全等效的——就像fgets
一样,它需要一个最大长度来处理(应该是剩余输入缓冲区大小和输出缓冲区大小的最小值),并扫描直到找到所需的字符(将是'\n'
)或用尽了输入/输出空间。printf
:printf("%.*s", (int)length, start);
memchr
。我以前从未使用过它,但我之前使用过strrchr
,这非常方便。谢谢。 - Steven Lusscanf
函数来实现这一点。如果您确实需要整行内容,则可以尝试以下代码:sscanf(your_buffer, "%50[^\n]", line);
(这将读取最多50个字符长的行。像往常一样,要注意长度和0
终止符。并检查sscanf
的返回值,以防出现问题。)
您可以使用指针算术来移动您的缓冲区(只需添加“返回”行长度+1)。
对于 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;
}
有一个叫做sscanf的函数,可能适用于你的情况,也可能不适用。
strtok()
和strsep()
都可以在指定字符上分割字符串。strtok
会修改底层字符串,这可能不太适合该任务,那么 strstep
怎么样? - Matthieu M.strchr
/ memcpy
来解决。 - user149341
c
和c++
... 那么它是哪个?你的缓冲区是如何定义的? - Brian Roachfopen
的C函数。 - Steven Luflex
来编写呢?它非常快速和准确。它可以输出 C 和 C++ 代码,并且一旦接收到一个记号,你可以随心所欲地编写回调函数。 - Ahmed Masud