Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缓冲区上FGET的等效值?_C++_C_Io_Fgets - Fatal编程技术网

C++ 缓冲区上FGET的等效值?

C++ 缓冲区上FGET的等效值?,c++,c,io,fgets,C++,C,Io,Fgets,我最初是使用fgets()逐行解析文件的 现在我改变了一些事情,这样我就可以把整个文件都放在缓冲区中了。我仍然喜欢逐行读取缓冲区以进行解析。是否有专门为此设计的东西,或者我是否需要在此时制作一个循环来检查0x0Achars?存在sscanf,它可能对您有效,也可能对您无效。您可以使用sscanf功能来完成此操作。如果你真的需要一整行,像这样的东西应该可以做到: sscanf(your_buffer, "%50[^\n]", line); (这将读取最多50个字符长的行。一如既往,请小心长度和0

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


现在我改变了一些事情,这样我就可以把整个文件都放在缓冲区中了。我仍然喜欢逐行读取缓冲区以进行解析。是否有专门为此设计的东西,或者我是否需要在此时制作一个循环来检查
0x0A
char
s?

存在sscanf,它可能对您有效,也可能对您无效。

您可以使用
sscanf
功能来完成此操作。如果你真的需要一整行,像这样的东西应该可以做到:

sscanf(your_buffer, "%50[^\n]", line);
(这将读取最多50个字符长的行。一如既往,请小心长度和
0
终止符。如果出现错误,请检查
sscanf
的返回值。)


您可以使用指针算术来移动缓冲区(只需添加“返回的”行长度+1)。

如果您正在寻找C函数,
strtok()
strep()
都将拆分指定字符上的字符串。

memchr
(使用一点您自己的包装代码,以
memcpy
结尾)是完全等效的-就像
fgets
一样,它需要处理的最大长度(应该是剩余输入缓冲区大小和输出缓冲区大小的最小值)和扫描,直到到达所需的字符(即
'\n'
)或耗尽输入/输出空间


请注意,对于内存中缓冲区中已经存在的数据,您可能希望跳过复制到单独输出缓冲区的步骤,除非您需要null终止输出而不修改输入。许多初学C的程序员经常错误地认为他们需要空终止,而仅仅改进一些接口以获得(指针、长度)对就足够了,这样您就可以在不复制子字符串的情况下传递/处理子字符串。例如,您可以使用以下命令将它们传递到
printf
printf(“%.*s”,int)length,start)

对于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;
}

如果你使用C++,那么你可以从内存中读取字符串。你已经标记了这个代码> C <代码>和<代码> C++ >代码>…是哪一个?你的缓冲区是如何定义的?决定你是想写C代码还是C++代码。然后回来问问怎么做。我不会浪费时间写C++解决方案,当你可能把它排除在“C不够”的时候。我使用C++,但是我更喜欢使用C函数,比如“代码> fOpen<代码”。当你使用LoxER时,为什么不写在代码> Flex 中,它每次都很快就得到了。它会给你C和C++输出,并且一旦你收到了一个令牌,你就可以写回调。这似乎不是sScFF给了我一个指向匹配字符串结尾的指针。我仍然需要进行搜索。它返回处理的整数字节数。我相当确定它返回匹配的数目。我确定
strtok
将修改底层字符串,这可能并不真正适合任务,那么
strstep
又如何呢?是的,这两个函数都会修改字符串。如果你不想要的话,你需要用
strchr
/
memcpy
做点什么。谢谢你指出
memchr
。我从未使用过它,但我以前使用过
strrchr
,这非常方便。谢谢