【发布时间】:2010-04-27 03:52:47
【问题描述】:
我正在尝试读取一个返回分隔的文件。充满了短语。
我正在尝试将每个短语放入一个字符串中。
问题是当我尝试用
读取文件时fscanf(file,"%50s\n",string);
字符串只包含一个单词。当它碰到一个空格时,它会停止读取字符串
【问题讨论】:
我正在尝试读取一个返回分隔的文件。充满了短语。
我正在尝试将每个短语放入一个字符串中。
问题是当我尝试用
读取文件时fscanf(file,"%50s\n",string);
字符串只包含一个单词。当它碰到一个空格时,它会停止读取字符串
【问题讨论】:
fscanf(file,"%50[^\n]\n",string);
除\n 之外的每个字符都将被[^\n] 消耗
将消耗最多 0f 50 个字符(确保字符串至少有 51 个空间)
..\n",string 这确保\n 也被使用,以便下一次调用不只是返回空字符串。
【讨论】:
fscanf 和 %s 在找到空格时停止读取。
由于您正在阅读未格式化的文本,您可以简单地使用fgets,它会一直读取直到填满您给它的缓冲区、找到换行符 (\n) 或到达文件末尾,无论哪个先到先得。
【讨论】:
'\0' 结尾,但之前的最后一个字符通常是'\n',因为它在行中读取的内容与文件中出现的完全相同。如果'\n' 不存在,则意味着您的缓冲区不足以容纳整行,或者您只是读取了文件中的最后一个字符并且它没有以换行符结束。
Avoid using scanf. 如前所述,您应该改用fgets。
如果您不想使用固定大小的缓冲区并允许任意长度的行,您可以尝试使用Chuck Falconer's public domain ggets function。 (该链接现在似乎已关闭,但archive.org has a copy。)
【讨论】:
fscanf 可以修改为读取过去的空格。细节有点复杂。这是手册页中关于 %[...]
的内容匹配一个非空序列 指定集合中的字符 接受的字符;下一个指针 必须是指向 char 的指针,并且有 必须有足够的空间容纳所有 字符串中的字符,加上一个 终止 NUL 字符。通常 前导空白的跳过是 压制。弦是要制作的 a 中(或不在)a 中的字符组成 特定的集合;集合定义为 打开之间的字符 括号 [ 字符和关闭 括号]字符。该集合不包括 如果第一个字符 左括号后的字符是 抑扬顿挫^。包括一个关闭 括号中的集合,使其成为第一个 左括号后的字符或 抑扬顿挫;任何其他职位 将结束集合。连字符 性格——也很特别;什么时候 放置在另外两个角色之间, 它将所有中间字符添加到 集。要包含连字符,请使其 决赛前的最后一个字符 右括号。例如, `[^]0-9-]' 表示集合``一切 除了右括号,零到 九,连字符''。字符串结束 与一个字符的外观不 在(或,带抑扬符,在)集合中 或者当字段宽度用完时。
所以,%[^\n] 应该读取所有内容,直到回车。
【讨论】:
fscanf(file, "%[^\n]") 上循环,您将一遍又一遍地获取空字符串。您需要使用格式字符串中的空格或 %*c 之类的内容来使用换行符。
最初使用 Payload_ID 00 01 02 03 ....10 发送数据
使用
char *pChar="" ; //用于字符串捕获。
fprintf(fp1, "%s", strtok(pChar,"Payload_ID"));
【讨论】: