相当于缓冲区上的fgets?

时间:2011-09-17 15:44:27

标签: c++ c io fgets

我最初使用fgets()逐行解析文件。

现在我改变了一些东西,以便我已将整个文件放在缓冲区中。我仍然想逐行读取缓冲区以进行解析。是否有针对此设计的内容,或者我是否需要制作一个在此时检查0x0A char的循环?

5 个答案:

答案 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;
}
相关问题