| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1063 人关注过本帖
标题:关于文件操作的FILE结构体问题
只看楼主 加入收藏
a451410
Rank: 2
等 级:论坛游民
帖 子:134
专家分:98
注 册:2018-3-4
结帖率:84%
收藏
已结贴  问题点数:5 回复次数:4 
关于文件操作的FILE结构体问题
在我的编译器中 vs2022 中,我用FILE定义了一个文件指针,可是怎么也读不对内容,所以我按F12查看了一下结构体,
记过令我把百思不得其解,在我的vs2022里,FILE是这样的:
程序代码:
#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

令我百思不得其解,它只是一个void指针.但是我在网上以及msdn里查看的都是以下这样:
程序代码:
struct _iobuf

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

不知道怎么回事,而且,F12之后也不在stdio头文件中
搜索更多相关主题的帖子: FILE 结构体 文件 int struct 
2024-11-24 20:53
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1709
专家分:4385
注 册:2007-12-27
收藏
得分:5 
我从未关心过FILE结构体的内容和定义位置,因为我不需要。
正常用就行了。
读不对内容应该另有原因,权限啊,属性啊,编码啊,等等。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2024-11-24 21:25
a451410
Rank: 2
等 级:论坛游民
帖 子:134
专家分:98
注 册:2018-3-4
收藏
得分:0 
回复 2楼 forever74
确实不需要这个结构体,用任何一个指针都可以访问到数据.
只是很奇怪为什么这个vs2022会这样,不知道是软件问题,还是sdk问题.
2024-11-25 15:12
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:294
专家分:23
注 册:2008-2-24
收藏
得分:0 
第一种写法的意思就是对你隐藏这个结构体的实际定义,意思是你不要去关心它里面的数据结构是什么东西。你把它原封不动的穿递给比如 fread ,fwrite 这种接收 FILE* 的函数即可。
它里面主要是,比如 windows 上面,需要记录打开文件的 HANDLE 映射成一个 file no,里面有读写缓存(因为传统的读写磁盘,涉及到磁头移动,相对于内存读写操作来说,是耗时很长的操作,所以它一次读写都是一整块数据,然后提前放在缓存里,也就是说,可能第一次是读了一大块数据,你后续的 read 操作,它发现缓存有效,就直接从缓存中返回给你数据,这也防止磁盘 io 操作的木桶短板,拖慢你的程序。

my tech blog: /hoodlum1980
2025-04-15 01:03
wtyj112
Rank: 1
等 级:新手上路
帖 子:227
专家分:0
注 册:2007-5-9
收藏
得分:0 
在你的 Visual Studio 2022 环境中,`FILE` 的定义看起来和传统的 `FILE` 结构体不同。这是因为现代编译器和标准库实现可能对 `FILE` 的定义进行了封装或抽象,以隐藏其内部实现细节。这种设计是为了提高跨平台兼容性和安全性,同时减少直接操作 `FILE` 结构体的风险。

---

### **为什么 `FILE` 是一个 `void*` 指针?**

1. **抽象封装**:
   - 在现代 C 标准库实现中,`FILE` 的内部结构通常被隐藏,使用 `void*` 或其他抽象类型来表示。
   - 这样可以防止用户直接访问或修改 `FILE` 的内部字段,从而提高安全性和可维护性。

2. **跨平台兼容性**:
   - 不同平台上的 `FILE` 结构体可能有不同的实现细节。通过使用抽象的 `void*`,标准库可以在不同平台上保持一致的接口,而不暴露具体的实现。

3. **优化和简化**:
   - 现代编译器可能会对 `FILE` 的实现进行优化,使用内部的私有结构体来存储文件流信息,而对用户只暴露一个指针。

---

### **为什么 `F12` 查看不到完整定义?**

1. **头文件封装**:
   - 在 Visual Studio 的实现中,`FILE` 的完整定义可能被封装在私有头文件中,而不是直接暴露在 `stdio.h` 中。
   - 你看到的 `typedef struct _iobuf { void* _Placeholder; } FILE;` 是一个占位符定义,用于提供编译时的类型检查。

2. **编译器优化**:
   - Visual Studio 的标准库实现可能将 `FILE` 的完整定义放在编译器内部或动态链接库中,而不是直接暴露给用户。

3. **安全性**:
   - 隐藏 `FILE` 的内部实现可以防止用户直接访问或修改其字段,从而避免潜在的错误。

---

### **如何正确使用 `FILE`?**

尽管 `FILE` 的内部结构被隐藏,你仍然可以通过标准库函数(如 `fopen`、`fread`、`fwrite` 等)来操作文件。这些函数提供了对文件流的完整操作接口,而不需要直接访问 `FILE` 的内部字段。

#### 示例代码:
```c
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    char buffer[100];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    fclose(file);
    return 0;
}
```

---

### **如何查看 `FILE` 的完整定义?**

如果你想查看 `FILE` 的完整定义,可以尝试以下方法:

1. **查看标准库源代码**:
   - Visual Studio 的标准库源代码通常位于安装目录中,例如:
     ```
     C:\Program Files (x86)\Microsoft Visual Studio\<version>\VC\Tools\MSVC\<version>\include
     ```
   - 在这些目录中查找 `stdio.h` 或相关文件,可能会找到 `FILE` 的完整定义。

2. **使用调试工具**:
   - 在调试模式下,使用 Visual Studio 的内存查看器或调试器,可以查看 `FILE` 的内部结构。

3. **参考 MSDN 文档**:
   - MSDN 上提供了关于 `FILE` 的详细说明,但具体实现可能因编译器版本而异。

---

### **总结**

- 在现代编译器中,`FILE` 的定义可能被抽象为 `void*`,以隐藏其内部实现。
- 你不需要直接访问 `FILE` 的内部字段,标准库函数已经提供了完整的文件操作接口。
- 如果需要了解 `FILE` 的具体实现,可以查看编译器的标准库源代码或参考 MSDN 文档。   - 在这些目录中查找 `stdio.h` 或相关文件,可能会找到 `FILE` 的完整定义。

2. **使用调试工具**:
   - 在调试模式下,使用 Visual Studio 的内存查看器或调试器,可以查看 `FILE` 的内部结构。

3. **参考 MSDN 文档**:
   - MSDN 上提供了关于 `FILE` 的详细说明,但具体实现可能因编译器版本而异。

---

### **总结**

- 在现代编译器中,`FILE` 的定义可能被抽象为 `void*`,以隐藏其内部实现。
- 你不需要直接访问 `FILE` 的内部字段,标准库函数已经提供了完整的文件操作接口。
- 如果需要了解 `FILE` 的具体实现,可以查看编译器的标准库源代码或参考 MSDN 文档。

计算机之路是痛苦并快乐着的!!
前天 09:58
快速回复:关于文件操作的FILE结构体问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013963 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved