【问题标题】:why we use FILE * instead of FILE for I/O为什么我们使用 FILE * 而不是 FILE 进行 I/O
【发布时间】:2013-02-17 12:54:47
【问题描述】:

今天我在学习C的标准I/O。当我打开stdio.h文件时发现:

typedef struct _iobuf FILE;

当检查 struct _iobuf 的定义时发现:

struct _iobuf {
    char *_ptr;
    int   _cnt;
    char *_base;
    int   _flag;
    int   _file;
    int   _charbuf;
    int   _bufsiz;
    char *_tmpfname;
};

为了了解更多,我已经给出了关于每个不正确与否的描述

struct _iobuf {
    char *_ptr;      /* next character position */
    int   _cnt;      /* characters left */
    char *_base;     /* location of buffer */
    int   _flag;     /* File status flags */
    int   _file;
    int   _charbuf;   /*Data transfer buffer */
    int   _bufsiz;    /* Buffer size */
    char *_tmpfname;  /* Temporary file indicator */
};

现在我有两个问题?

Q1:我是否提供了正确的名称以及 I/O 中的结构如何提供帮助,如果我添加或删除任何东西会发生什么?这会相应地工作吗?这里提供的顺序重要吗?

Q2:这里没有使用指针,为什么要使用FILE *来打开文件?

【问题讨论】:

    标签: c visual-c++ gcc cross-platform c99


    【解决方案1】:

    我是否提供了正确的姓名?

    这些都是特定于 Microsoft 实施和 AFAIK 的内部细节,未记录。

    如果我添加或删除任何东西会发生什么?

    那真的很糟糕;您可能会导致未定义的行为

    这里没有使用指针,为什么要使用 FILE * 打开文件?

    因为从您的应用程序代码的角度来看,实现细节并不重要; FILE * 旨在成为 opaque pointer

    【讨论】:

    • 如果我想创建这样的实现我应该怎么做
    • @vineet1982:随意使用PIMPL编写您自己的实现。
    • 如何创建自己的实现并进行隐藏
    • @vineet1982:你为什么用 visual-c++ 和 Oli 上面所说的来标记 Q。
    • @vineet1982 您无法隐藏 FILE 结构成员。如果您的问题是关于如何隐藏您自己定义的结构的成员,那将是一个不同的问题。
    【解决方案2】:

    A1。编辑标准标题会导致未定义的行为。

    A2。结构通常在 C 中作为指针传递以避免复制。此外,它还可以用作句柄或不透明的指针。

    更大的问题是为什么要去做你所问的任何事情。

    【讨论】:

      【解决方案3】:

      回答你所有的问题:

      The Standard C Library by P.J. Plauger

      【讨论】:

        猜你喜欢
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2013-11-25
        • 2011-12-19
        • 2020-12-22
        • 1970-01-01
        相关资源
        最近更新 更多