fscanf 如何与它从中解析信息的文件交互?

How does fscanf interact with the file it parses information from?

我对C有点陌生,写过一些基本的程序,但除此之外我不知道有什么特别的。目前我正在编写一个需要从 .txt 文件中获取其变量的程序。 .txt 文件的结构始终如下:

X Y             //1st row
a1 a2 a3 a4 aX  //2nd row

我得到的 a 的数量等于数字 X。(文件中的所有内容都是一个 int)
我的代码中让我感到困惑的一点是:

fscanf(txtfile,"%d %d",&X,&Y);
    int input[X];                                                           
    for(int i=0; i<X; i++){
            fscanf(txtfile,"%d",&input[i]);
    }  

效果很好,但在我看来不应该...
我认为从我的 .txt 文件中获取 X 和 Y 后,循环中的 fscanf 会再次通过它们,我必须找到一种方法来绕过它们,所以它们不会出现在我的输入 [] 中。我打算制作一个虚拟数组来存储前两个整数,然后将其他的转移到正确的数组,但事实证明虚拟数组工作得很好,“正确的”数组以垃圾结尾。那么实际发生了什么? fscanf 是否在文件上有某种指针告诉它上次停止的位置 运行?或者完全不同的东西?我尝试浏览 fscanf 的手册页,但我没有找到任何有用的东西,或者它可能只是在我的头上。
P.S。就我的要求而言,标题可能有点偏离,但我想不出更好的了。
感谢您的宝贵时间!

Does fscanf have some kind of pointer on the file that tells it where it stopped the last time it run?

关闭。 txtfile 指向的 FILE 对象存储当前文件位置,该位置在每次成功读取(或写入,如果是输出流)操作后更新。如果您发现需要返回并重新读取较早的输入项,则需要使用 fseekrewind 库函数重置该文件位置。

C 中的

I/O 隐藏在称为 streams 的抽象之后 - 就您的程序而言,流只是字节的生产者(或消费者) .每次从流中成功读取时,您都会从流中“删除”那些字节1,因此您不会不断地一遍又一遍地重新读取相同的数据。


  1. 从逻辑上讲 - 基础文件的内容没有改变。