【问题标题】:File Structure member changed in C文件结构成员在 C 中更改
【发布时间】:2021-03-09 09:48:57
【问题描述】:
#include <stdio.h>

void main( )
{
    FILE* fp = stdin;
    printf("Input string: ");
    
    printf("getchar( ) - %c\n", getchar());
    printf("[%d] %s", fp->_cnt, fp->_base);
    printf("READ: %d\n", fp-> _ptr - fp->_base);


    printf("\\n\ngetchar( ) - %c\n", getchar());
    printf("[%d] %s", fp->_cnt, fp->_base);
    printf("READ: %d\n", fp->_ptr - fp->_base);


    fflush(fp);
    printf("\n\nAfter flushing\n[%d] %s", fp->_cnt, fp->_base);
    printf("READ: %d\n", fp->_ptr - fp->_base);
}
  1. 我的 C 书籍中有这段代码,但 FILE 结构中没有 _cnt 成员。
  2. 我怎样才能得到正确的结果?

【问题讨论】:

  • 正确的结果是什么?
  • 那将是 bad C 代码(隐含地,是一本 bad 书)。 FILE* 类型指向 opaque structure,它的成员永远不应该被显式使用。
  • 这本书是什么,为什么它使用FILE结构的内部部分?
  • @AdrianMole:如果FILE 结构的成员永远不应该被显式使用,那么任何人如何实现标准的I/O 功能?或者教其他人如何实现它们?
  • @Eric 好的,它们不应该被实现本身之外的代码使用。相反,应该使用标准例程来检索有关打开的 FILE 的信息。您无疑会知道,不同的实现可以以不同的方式实现FILE 结构,并为成员使用不同的名称。

标签: c file


【解决方案1】:

您正在使用的书与 C 的特定实现配对,可能是相当古老的。这些成员名称用于第一版 Kernighan 和 Ritchie 的C 编程语言。在第二版中,下划线被删除了。要使此代码按原样运行,您必须使用匹配的 C 实现,这在现代平台上可能会出现问题。

或者,如果您使用的 C 实现具有类似的成员,您可以通过修改成员名称来使代码正常工作。然而,现代 C 库头文件中的代码可能很难让学生理解,因为它已经发展到适应不同平台的许多特性和变体,这使得它变得相当复杂。你最好找一本现代教科书。

请注意,本书在哪里展示了FILE 结构的成员,很可能是在教授关于标准库如何实现或如何运作的理论。它没有向您展示您应该在使用 C 库的常规程序中使用的代码。

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多