如何创建自己的fgetc()函数?

时间:2017-10-16 05:34:48

标签: c

我很想知道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()函数背后的逻辑是什么。

1 个答案:

答案 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()结构中保留某种搜索指针或偏移量。