我很想知道fgetc()函数是如何工作的。内部文件指针如何自动前进。
#include <stdio.h>
int main() {
char d[10];
int i;
FILE *f=fopen("explore.ttt", "r");
while(!feof(f)) {
d[i]=fgetc(f);
i++;
}
printf("%s", d);
return 0;
}
fgetc()函数背后的逻辑是什么。
答案 0 :(得分:3)
这是一个实现细节,因编译器而异。但是,一个可以免费下载源代码的流行实现是GNU libc,所以让我们来看看。
libc包将preventDefault
定义为libio的一部分,作为内部函数的别名:
$(document).ready(function(e){
$('#main-menu li a').click(function(e) {
e.preventDefault();
$('#main-menu li a').removeClass('active');
$(this).addClass('active');
});
});
(回想一下,标准说fgetc()
之类的函数必须是未定义的宏,以便为您提供函数的名称,可以获取其地址。)weak_alias (_IO_getc, fgetc)
的定义是:
fgetc
所以这是_IO_getc
的包装器,结果证明是int
_IO_getc (FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
if (!_IO_need_lock (fp))
return _IO_getc_unlocked (fp);
_IO_acquire_lock (fp);
result = _IO_getc_unlocked (fp);
_IO_release_lock (fp);
return result;
}
中定义的宏:
_IO_getc_unlocked()
因此,此实现的作用是定义它调用libio.h
#define _IO_getc_unlocked(_fp) \
(_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
结构的字段。 FILE
的基础宏是解除引用此指针的包装器,然后递增它。
其他图书馆可能会做些不同的事情,但基本的想法是一样的。调用一些较低级别的函数来从文件中读取(例如POSIX上的_IO_read_ptr
),或者如果在不同的操作系统之间移植是很重要的,那就是隐藏差异的包装器。在传递fgetc()
,更新,取消引用和增量时,在read()
结构中保留某种搜索指针或偏移量。