1. 程式人生 > >c語言_文件操作_FILE結構體小解釋

c語言_文件操作_FILE結構體小解釋

hold 輸出 def 系統 span fopen 大小 round typedef

參考文檔來自: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裏面的成員在不同的系統是不一樣的。

c語言_文件操作_FILE結構體小解釋