1

我使用这个小程序来了解 ftell 是如何工作的。我创建了一个 txt 文件,然后输入“15”,然后在第二行输入“no”。所以我期望它打印 0,然后在它读取 15 之后,打印 2,然后因为 no 在第二行,这意味着我在第一行留下了一些“可用点”,我可以用更多字符填充我希望它打印的数字肯定大于 7(这是它实际打印的)。为什么?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int x;
    char box[10];

    fp = fopen("test.txt", "r");

    printf("%ld", ftell(fp));

    fscanf(fp,"%d",&x );
    printf("\n%ld", ftell(fp));

    fscanf(fp, "%s", box);
    printf("\n%ld\n", ftell(fp));
}

输出:0 2 7

4

2 回答 2

4

文本文件 (*)中没有可用的插槽。它只是一个字符序列,其中一些被解释为行尾(通常是\r,\n\r\n)。因此,您的文本文件应包含以下字符(假设 DOS/Windows EOL):

1 5 \r \n n o \r \n

这个应该给出输出:0 2 6。

如果你有 7 作为最后一个值,你可能在某处有一个空格,可能在第一行的末尾(在5和之间\r)。


至少在通用操作系统上,文本文件表示为带有行分隔符的流。感谢@JohnBollinger 注意到其他操作系统可能具有固定长度的记录文本文件

于 2020-01-24T12:39:20.340 回答
1

假设您的文件包含:

"15\r\nno\r\n"

然后第一次转换读入1(pos. 1) 和5(pos. 2),然后读取回车符\r(pos. 3),它是它ungetc()的 (pos. 2 再次)。

然后,在(no_例如领先的空间)。\r15no

所以,一般来说,位置总是最后一个*scanf()转换的字符。必须读入下一个(不匹配的)字符,但会被推回流中。

于 2020-01-24T12:48:38.557 回答