第一个问题,也是主要问题,c 语言的FILE结构是怎么实现的。经过网上查了一下说是通过调用系统API 动态连接库来实现的,这又引发下一个问题,都说 windows 是 c 语言写出来的。那么 windows 系统又是如何实现文件操作的。这又引发另一个问题,那么最初的 c 语言是什么,它是如何完成文件操作的。
现在说一下我个人思路,首先人类研究出了第一套编程高级语言 c,接着人类使用 c语言,开发出了系统,最后再对 c 语言封装,弄出了更多的高级语言。如果这个思路正确的话,windows 是c 语言的超大型工程,问文件 操作也是基于 c 语言来实现的,那么 c 语言又是如何实现 文件操作的,?我们使用的都是标准库文件里的函数,就像圆周率一样,π 这个东西你如果不知道它是基于 直径的三倍规律而得到的,那么永远只能用 2πr 就知道是周长,却不知道这个周长是怎么得到的
Cä¹å ç³»ç»ä¸è¬å°±æ¯Cåçäºã
è³äºæ件æä½ï¼è°ç¨ç³»ç»çæ件系ç»æ¥å£æ§è¡çã
ä»ä»¬ä¹é´çå ³ç³»é综å¤æ
举个ä¾åå§ï¼Cè¯è¨çç¼è¯å¨æ¯Cè¯è¨åçï¼ä½æ¯å®å¯ä»¥ç¼è¯Cè¯è¨ã
Cè¯è¨çåå±åè¿æ¥ä¹ä¼ä¿è¿è¿äºåè½æ¨¡åï¼è¿äºåè½æ¨¡åçæ°éæ±åæ ·ä¼åè¿æ¥ä¿è¿Cçè¿æ¥ã追é®
é£ä¹ c è¯è¨çæ åå½æ°è£¤ä¹æ¯äººååºæ¥çï¼å®æ¯å¦æ¯å¯¹ä»ä¹è¿è¡å°è£ äºåï¼æè æ¯ä¸ä¸ä¸ªå°è£ è¿è¡ä¸ä¸ä¸ªå°è£ ãä¾å¦ï¼æ们å¯ä»¥èªå·±åä¸ä¸ªå½æ°æ¥å®ç°å符串åéæ¥ä»£æ¿æ åçå符串åéå½æ°ï¼ä½å´ä¸ç¥éå¦ä½èªå·±å®ç°æä½æ件ãä¾å¦ææ³æç´¢ä¸ä¸ªæ件ï¼æåªè½é´æ¥çè°ç¨å½æ°å¾å°æ件å表ï¼ç¶åèªå·±åè¿è¡å¹é ã
å¦æä¸æç¨å½æ°ï¼æå°±æ æ³å¾å°æ件çå¥ææ¥æä½æ件
对äºè¿é®ä½ ä¸ä¸ªé®é¢ï¼å¦ä¹ åçæºå¼åï¼æ¯å¦æå©äºäºè§£å° windows çé¨å API çå®ç°åç
追ç第ä¸ä¸ªï¼Cè¯è¨çæ åå½æ°ï¼æäºæ¯å°åºå½æ°å°±å°åºäºï¼æ¯å¦å符串å¤çè¿ç±»çï¼åå
¶ä»ç没ä»ä¹å
³ç³»
æäºæ¯åå¤é¨æå
³çï¼æ¯å¦æä½ç³»ç»ï¼æ件系ç»ççãåä½ è¯´çæ件æä½ï¼è¿æ常ç¨çæå°å½æ°ä»ä¹çï¼è¿äºé½æ¯ä¸ä¸å°è£
çã对äºè¿é¨åï¼å
¶å®æ¯å¯ä»¥ç»è¿åºå½æ°çï¼ç´æ¥è°ç¨æä½ç³»ç»æ¥å£ãä¸è¿ä¸æ¨èï¼å 为é£æ ·å¯¹äºç§»æ¤ä¼å¸¦æ¥éº»ç¦ï¼ä¸åç³»ç»ï¼æ¥å£æ¯ä¸ä¸æ ·çã
æ¯å¦è¯´ï¼å¦ææ¯åçæºï¼é£ä¹å¯è½ä½ ç¨printfå¯ä»¥æå°ï¼ç¨uart_writeä¹å¯ä»¥å®ç°åæ ·çåè½ã
è³äºåçæºï¼å¯ä»¥äºè§£ä¸äºå§ï¼ä¸è¿ä¸ä¼å¤ªå¤ãæ¯ç«åçæºå¤ªå°äºï¼åwindowså·®è·å¤ªå¤§ãèä¸ä¸åæä½ç³»ç»çæä½æ¹å¼ä¹æåºå«ï¼åªæ¯ç念è¿ä¼¼èå·²ï¼å·®å«è¿æ¯ä¸å°çã
æ以ï¼å¯¹è¿æ¹é¢è¿æ¯ä¸è¦æ±å¤ªå¤§å¸æç好ã
èä¸å¹é é¦å å°±æ¯è¦å¾å°ä¸ä¸ªæ件夹éæå¤å°ä¸ªæ件ï¼ç¶åæ件çååæ¯ä»ä¹ï¼æè½è¿è¡å¹é ï¼å¹é ä¸å°ï¼åæ¢ç®å½ï¼ç´å°æç´¢å® e :\\bat éçææç®å½ä¸ªæ件ã
æ以æåä¸ç¥éæ件夹æå¤å°ä¸ªï¼ä¸ä¸ªæ件夹éæ件æå¤å°ä¸ªï¼æ以æ使ç¨äºå表æ¡æ¥å¾å°è¿äºååï¼åéè¿è¯»åå表æ¡ï¼ä½æ¯ä¸ä¸ªç®å½ä¸ä¹è®¸è¿æå¦ä¸ä¸ªç®å½ã
è¿æ¯æççé¢ï¼å³ä¸è§å°±æ¯æç´¢åè½ã
é¾éå¿ é¡»è¦èªå·±åä¸ä¸ªæ件系ç»ç®¡çåï¼æç¨æ·å建æ件夹个æ°åæ件个æ°è¿è¡è¿è¡ç®¡çåï¼ç¶åæ¯æ¬¡é½æ ¹æ®ç®¡ççè·¯å¾æ¥æç´¢ï¼
éè¿è·åè·¯å¾æ¥è¿è¡æç´¢æ¡ä»¶ä¸å¤ãæ以æææ³å°æä¸é¢é£äºå¤æé®é¢çã
å¢å æ¹æ¥åè½é½å®ç°äºï¼å°±å·®ä¸ªæç´¢æ件ï¼å ¶å®æ主è¦çä¹æ¯è¿ä¸ªåè½ã便äºä»¥åæç´¢ä¸äºèªå·±åçä¸äºç¬è®°ã
å·¦ä¸è§å°±æ¯å建æ件夹ã
å¨å表æ¡éåå»ç®å½å°±ä¼è·³è½¬å°åç®å½ï¼åå»æ件就è½å¨ç¼è¾æ¡æ¾ç¤ºãåå»ä¸ä¸çº§å°±æ¯åéï¼ä¸ä¸çº§å°±æ¯åè¿ãå¯ç¬å·®ä¸ªæç´¢ã
追çæç´¢æ件ï¼å¨windowsä¸é¢æ²¡åè¿ï¼ä¹åå¨linuxä¸é¢åè¿ç±»ä¼¼çã
å
æ¯ä¸ä¸ªæå¼dirçå½æ°ï¼è·åä¸ä¸ªdirå¥æï¼ç¶å循ç¯è·å该æ件夹ä¸é¢çææèç¹ï¼å¦ææ¯æ件ï¼è¿è¡å¯¹æ¯ï¼å¦ææ¯ç®å½ï¼éå½è°ç¨æ¥æ¾å½æ°ã
å½æ¶åçæ¯æ¾å°çæ¶åæå°åºæ¥ï¼å å°å表éä¹å·®ä¸å¤å§ã
æç´¢çæ¶åéè¦æ³¨æï¼æ两个ç¹æ®èç¹ï¼ç¹åç¹ç¹ï¼å°±æ¯"."å".."è¿ä¸¤ä¸ªæé¤æï¼ä¸ç¶å°±æ»å¾ªç¯äºã
è¿ä¸ªä¸æ¯å¤ªé¾ã
windowsä¸åºè¯¥æ类似çå½æ°çã
åå å¼ï¼éº»ç¦ä½ ç»ææ¯ä¸ªæï¼ææ¨å¤©æ¾äºå¥½ä¹ ï¼é½æ¯ä¸äºæå¼æ件çå½æ°ï¼æä½æ件夹çæ åå½æ°ä¹å°±æ¯å»ºç«ï¼å é¤ï¼å®ä½ï¼è·åï¼ä¸ç¥éè¦å¦ä½è¿è¡æç´¢å¹é
没ææ¾å°è·ä½ 说ç类似çå½æ°
è¿æ¯æå¶å®çä¸ä¸ªæ¹æ¡
ä¸é¢ä½¿ç¨éå½æ¥æ¯æ¬¡æç´¢ä¸ä¸ªç®å½
é®é¢å°±å¨ä¸é¢é£ä¸ªæ´æ¢ç®å½çå½æ°
é¦å æç´¢æ ¹ç®å½ä¸æ¯å¦ææ件ï¼æ²¡æï¼å°±è¦è¿å ¥ç¬¬ä¸ä¸ªåç®å½ï¼å¦æ第ä¸ä¸ªåç®å½æ²¡ææ¾å°ï¼å°±è¦å¤æ该ç®å½æ¯å¦è¿æåç®å½ï¼å¦ææå°±è¿è¦è¿å ¥ï¼æ²¡æå°±è¦è¿åä¸ä¸ªç®å½ãè¿ä¹æèµ·æ¥æ¯æºå¤æç
æåè¿è¦éæ°åå°æ ¹ç®å½ä¸ç第äºä¸ªæ件夹è¿è¡æç´¢ï¼æç´¢ä¸å°è¿å¤æ该ç®å½æ¯å¦æåç®å½ï¼æå°±åè¦è¿å ¥ã
追çä¸è¦ç¨Cåºå½æ°ï¼ä½ æ¾ä¸windowsç¸å
³çæ¥å£ã
Cåºå½æ°æ²¡æwindowsçå½æ°å¥½ç¨ã
å¦å¤ï¼å°½éä¸è¦æ´æ¢å·¥ä½ç®å½ï¼èæ¯éè¿éå½çæ¹å¼ï¼æ¯æ¬¡å¢å ç¸å¯¹ç®å½ã
æ¯å¦ ä½ è¦æ¾çæ¯test ä¸é¢æ个folæ件夹
é£æ£æ¥folçæ¶åï¼å°±æå¼test\\fol
è°¢è°¢ä½ äºï¼ææ¨æç½ä¸æ¾å°äºFindFirstFileå½æ°
typedef struct {
char *fpos; /* 文件指针当前位置的绝对地址 */
void *base; /* 指针,指向文件的 基 */
unsigned short handle; /* 文件句柄 */
short flags; /* 标志 */
short unget; /* 1字节缓冲器,用于ungetc (第15位为1表示非空) */
unsigned long alloc; /* 现给文件分配的字节数 */
unsigned short buffincrement; /* 每次增加分配的字节数增量 */
} FILE;
它被定义在头文件 stdio.h 里。
这同我们自己写程序时定义一个结构的语法一样,例如:
typedef struct { float x; float y; float z;} point_3d; //3维空间点。
没有你说的 那样复杂。
C 语言是较新开发的计算机语言。比它老的高级语言不少。例如 五十年代到六十年代初就有 ALGOL 58,ALGOL 60,GOGOL, VALGOL, FORTRAN 语言。就算 BASIC等语言,也比 c 开发得早。c的作者在学习那些语言基础上,再搞出来的。
计算机是靠指令和数据工作的。人给指令,给数据叫计算工作。为了提高效率,人们 发明了 高级语言,通过相应语言编译器,把用高级语言写的东西变指令而已。
高级语言的高,不是现代人说的高大上的高,而是近人的这端叫高,近计算机端的叫低。例如汇编语言属低。追问
那我再问你问题吧,假设现在要打开一个文件,我们使用 fopen ,现在我们知道 FILE 是一个结构体,如何写一个结构体来实现文件操作?都说最终是调用系统的 API,又都说 windows 是用 c 语言写的,那么写一个 API 首先就是调用 fopen吗? 那么 fopen 又是怎么实现的?
追答"又都说 windows 是用 c 语言写的" -- 大错。
c 语言是开发 unix 系统的产物,与视窗风马牛毫不相干。
windows 是DOS系统基础上的产物,用8080指令及后来的8086,windows NT 时有个跃变,然后稳定下来,直到win-7用64位指令。
某些东西用 VB 写的。
API 是 applications, 是应用程序,不是操作系统,是 MS VC++ c/c++ 程序。
你对文件读写有性趣,自己反汇编一下,去读一下指令即可。MS VC++ 里带了 反汇编,一句命令就有结果了。这里不能给你开课,因为内行看门道,一看就知道深浅。
b语言?
追答对啊,B语言不断完善才有了C语言