如何从一个以 \n 分隔的文件中读取字符串

6

我试图读取一个以回车分隔的文件,里面充满了短语。

我想将每个短语放入一个字符串中。

问题在于,当我尝试使用以下代码读取文件时:

fscanf(file,"%50s\n",string);

字符串只包含一个单词。当它遇到空格时,它停止读取该字符串。
5个回答

6
fscanf(file,"%50[^\n]\n",string);
  1. [^\n]将匹配除\n以外的所有字符。

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

  3. ..\n",string这将确保\n也被匹配,以便下一次调用不会返回空字符串。


3

fscanf 使用 %s 时遇到空格会停止读取。

由于您正在读取未格式化的文本,因此可以直接使用 fgets,它将一直读取直到填满您提供的缓冲区、找到换行符 (\n) 或到达文件结尾为止,以先到者为准。


这个程序的工作方式很奇怪。它不能读取每一行,而且每个字符串在结尾处不是以\0结束,而是以\n结束。 - maty_nz
1
每个字符串仍然以 '\0' 结尾,但是在此之前的最后一个字符通常是 '\n',因为它会按照文件中出现的样子读取整行。如果没有 '\n',那么要么是你的缓冲区不够大以容纳整行,要么就是你刚刚读取了文件中的最后几个字符,而它们并没有以换行符结束。 - caf

3

2
fscanf可以修改以读取空格之后的内容。细节有点复杂。以下是man页面关于%[...]的说明:
匹配指定接受字符集中的非空字符序列;下一个指针必须是char指针,并且必须有足够的空间容纳字符串中的所有字符,再加上一个终止NUL字符。通常省略前导空格的跳过被禁止。该字符串由特定集合中的字符组成或不包括在其中;该集合由开放括号[字符和关闭括号]字符之间的字符定义。如果开放括号后的第一个字符是插入符^,则该集合将排除那些字符。要将关闭括号包含在集合中,请将其置于开放括号或插入符之后的第一个字符位置;任何其他位置都将结束集合。连字符-字符也是特殊的;当放置在其他两个字符之间时,它会将所有中间字符添加到集合中。要包含连字符,请将其置于最终关闭括号之前的最后一个字符位置。例如,“[^]0-9-]”表示集合“除了关闭括号、零到九和连字符之外的所有内容”。字符串以不在(或带插入符的)集合中的字符出现或字段宽度用完为止而结束。
因此,%[^\n]应读取直到回车符的所有内容。

2
它读取换行符之前的所有内容,但不包括换行符本身。如果您在fscanf(file, "%[^\n]")上循环,您将一遍又一遍地得到空字符串。您需要使用格式字符串中的空格或类似%*c的东西来消耗换行符。 - Adam Rosenfield
@Adam 很好的观点。上面的被接受的答案对于缓冲区溢出错误也更安全。 - Nathan S.

-1

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

使用

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

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


这里的 Payload_ID 是您可以指定的分隔符。 - ashoka vanjare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接