在C语言中从文件中读取内容时使用fscanf()函数

3

你好,如果我有一个包含以下文本的文件(text.txt):

This is a file.

在我的主函数中,我会像这样调用fscanf:
fscanf(fp, "%s", buffer)

然后执行

printf("%s", buffer);

其中fp是文件指针,buffer是一个大小为100的字符数组,我将从文件中读取的内容存储在其中,

我得到的输出结果是:

This

我明白的原因是 - 这是因为%s扫描文件直到第一个空格。

然后,如果我调用

fscanf(fp, " is a %s.", buffer)

并执行

printf("%s", buffer) 

并且我会得到输出。
file.

我在想为什么会是这样的,因为我认为%s只会获取fp指向文件中的下一个字符串,所以它不应该是file.而不是is.


1
嗨,请编辑问题并发布一个[mcve],并适当格式化。谢谢。 - OldProgrammer
1个回答

3
fscanf从文件中读入一个格式化的数据,第一次调用时:
fscanf(fp, "%s", buffer)

你需要告诉程序读取第一个单词直到第一个空格,以你的例子为例是This

现在指针位于This| is a file.,所以当你调用:

fscanf(fp, " is a %s.", buffer)

你正在告诉程序将位于%s位置的字符串存储到buffer中,这意味着你读取了file.,因为你正在“丢弃”" is a "
要读取is,你只需执行以下操作:
fscanf(fp, "%s", buffer)

在您第一次使用 fscanf() 函数读取 This 后。

请注意,当您编写内联代码时,您不需要3个反引号-一个就足够了。因此,\foo`,而不是```foo````。 - einpoklum
@einpoklum-reinstateMonica 噢,是的,你说得对。我只是出于习惯而不假思索地打了三个。 - John Doe
请注意在%s之前的空格。由于%s已经跳过了前导的空白字符,所以这个空格是多余的。 - Spikatrix
@Spikatrix 说得对,我已经很久没有用过 C 了,记得 %c 需要它,但我忘记了 %s 是否也需要。 - John Doe

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