參考文檔來自:https://www.cnblogs.com/haore147/p/3648395.html
我們通過fopen返回一個文件指針(指向FILE結構體的指針)來進行文件操作。
在vs2013下的代碼如下:
#include <stdio.h> #pragma warning(disable:4996) int main() { FILE *p = fopen("C:\\test\\win\\a.txt", "r"); char buf[100]; fgets(buf, sizeof(buf), p); printf("%d\n", p->_bufsiz); //4096 緩沖區大小為4K。 printf("%d\n", p->_charbuf); //0 char * p1 = p->_base; //指針的基礎位置。 printf("%s\n", p1); //輸出的是亂碼。 fclose(p); return 0; }
代碼中-->選中FILE后-->右鍵選擇-->轉到定義(G),顯示的代碼如下:
在vs2013下的代碼如下:
#ifndef _FILE_DEFINED struct _iobuf { char *_ptr; //文件輸入的下一個位置。
int _cnt; //當前緩沖區的相對位置。 char *_base; //指針的基礎位置(即是文件的起始位置)。 int _flag; //文件標志。 int _file; //文件的有效性驗證。 int _charbuf; //檢查緩沖區狀況,如果無緩沖區則不讀取。 int _bufsiz; //緩沖區的大小。 char *_tmpfname; //臨時文件名。 }; typedef struct _iobuf FILE; #define _FILE_DEFINED #endif
同理:在vs2017下顯示的代碼如下:
在vs2017下的代碼如下:
#ifndef _FILE_DEFINED #define _FILE_DEFINED typedef struct _iobuf { void* _Placeholder; } FILE; #endif
不要直接操作fopen返回的文件指針,這個指針只是給c語言庫函數的參數使用的。(因為該指針里面很復雜。)
如果程序員不聽話,直接操作這個指針,可能會帶來很多問題。(除非你特別特別熟悉這個指針。)
原因之一:因為FILE里面的成員在不同的系統是不一樣的。