【问题标题】:how to read a string from a \n delimited file如何从 \n 分隔文件中读取字符串
【发布时间】:2010-04-27 03:52:47
【问题描述】:

我正在尝试读取一个返回分隔的文件。充满了短语。

我正在尝试将每个短语放入一个字符串中。

问题是当我尝试用

读取文件时
fscanf(file,"%50s\n",string);

字符串只包含一个单词。当它碰到一个空格时,它会停止读取字符串

【问题讨论】:

    标签: c stdio fgets scanf


    【解决方案1】:
    fscanf(file,"%50[^\n]\n",string);
    
    1. \n 之外的每个字符都将被[^\n] 消耗

    2. 将消耗最多 0f 50 个字符(确保字符串至少有 51 个空间)

    3. ..\n",string 这确保\n 也被使用,以便下一次调用不只是返回空字符串。

    【讨论】:

      【解决方案2】:

      fscanf%s 在找到空格时停止读取。

      由于您正在阅读未格式化的文本,您可以简单地使用fgets,它会一直读取直到填满您给它的缓冲区、找到换行符 (\n) 或到达文件末尾,无论哪个先到先得。

      【讨论】:

      • 这很奇怪。它不会读取每一行。并且每个字符串不是以 \0 结尾,而是以 \n 结尾
      • 每个字符串仍然以'\0' 结尾,但之前的最后一个字符通常是'\n',因为它在行中读取的内容与文件中出现的完全相同。如果'\n' 不存在,则意味着您的缓冲区不足以容纳整行,或者您只是读取了文件中的最后一个字符并且它没有以换行符结束。
      【解决方案3】:

      Avoid using scanf. 如前所述,您应该改用fgets

      如果您不想使用固定大小的缓冲区并允许任意长度的行,您可以尝试使用Chuck Falconer's public domain ggets function。 (该链接现在似乎已关闭,但archive.org has a copy。)

      【讨论】:

        【解决方案4】:

        fscanf 可以修改为读取过去的空格。细节有点复杂。这是手册页中关于 %[...]

        的内容

        匹配一个非空序列 指定集合中的字符 接受的字符;下一个指针 必须是指向 char 的指针,并且有 必须有足够的空间容纳所有 字符串中的字符,加上一个 终止 NUL 字符。通常 前导空白的跳过是 压制。弦是要制作的 a 中(或不在)a 中的字符组成 特定的集合;集合定义为 打开之间的字符 括号 [ 字符和关闭 括号]字符。该集合不包括 如果第一个字符 左括号后的字符是 抑扬顿挫^。包括一个关闭 括号中的集合,使其成为第一个 左括号后的字符或 抑扬顿挫;任何其他职位 将结束集合。连字符 性格——也很特别;什么时候 放置在另外两个角色之间, 它将所有中间字符添加到 集。要包含连字符,请使其 决赛前的最后一个字符 右括号。例如, `[^]0-9-]' 表示集合``一切 除了右括号,零到 九,连字符''。字符串结束 与一个字符的外观不 在(或,带抑扬符,在)集合中 或者当字段宽度用完时。

        所以,%[^\n] 应该读取所​​有内容,直到回车。

        【讨论】:

        • 它将所有内容读取到换行符,但换行符本身。如果您在fscanf(file, "%[^\n]") 上循环,您将一遍又一遍地获取空字符串。您需要使用格式字符串中的空格或 %*c 之类的内容来使用换行符。
        • @Adam 好点。上面接受的答案对于缓冲区溢出错误也更安全。
        【解决方案5】:

        最初使用 Payload_ID 00 01 02 03 ....10 发送数据

        使用

        char *pChar="" ; //用于字符串捕获。

        fprintf(fp1, "%s", strtok(pChar,"Payload_ID"));

        【讨论】:

        • 这里Payload_ID是你可以指定的分隔符
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多