日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件

作者:王姍姍,華清遠(yuǎn)見嵌入式學(xué)院講師。

先來了解下什么是標(biāo)準(zhǔn)IO以及文件IO。

標(biāo)準(zhǔn)IO:標(biāo)準(zhǔn)I/O是ANSI C建立的一個標(biāo)準(zhǔn)I/O模型,是一個標(biāo)準(zhǔn)函數(shù)包和stdio.h頭文件中的定義,具有一定的可移植性。標(biāo)準(zhǔn)IO庫處理很多細(xì)節(jié)。例如緩存分配,以優(yōu)化長度執(zhí)行IO等。標(biāo)準(zhǔn)的IO提供了三種類型的緩存。

(1)全緩存:當(dāng)填滿標(biāo)準(zhǔn)IO緩存后才進(jìn)行實際的IO操作。
(2)行緩存:當(dāng)輸入或輸出中遇到新行符時,標(biāo)準(zhǔn)IO庫執(zhí)行IO操作。
(3)不帶緩存:stderr就是了。

文件IO:文件IO稱之為不帶緩存的IO(unbuffered I/O)。不帶緩存指的是每個read,write都調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。也就是一般所說的低級I/O——操作系統(tǒng)提供的基本IO服務(wù),與os綁定,特定于linix或unix平臺。

2區(qū)別

首先:兩者一個顯著的不同點在于,標(biāo)準(zhǔn)I/O默認(rèn)采用了緩沖機(jī)制,比如調(diào)用fopen函數(shù),不僅打開一個文件,而且建立了一個緩沖區(qū)(讀寫模式下將建立兩個緩沖區(qū)),還創(chuàng)建了一個包含文件和緩沖區(qū)相關(guān)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。低級I/O一般沒有采用緩沖,需要自己創(chuàng)建緩沖區(qū),不過其實在linix或unix系統(tǒng)中,都是有使用稱為內(nèi)核緩沖的技術(shù)用于提高效率,讀寫調(diào)用是在內(nèi)核緩沖區(qū)和進(jìn)程緩沖區(qū)之間進(jìn)行的數(shù)據(jù)復(fù)制。

其次從操作的設(shè)備上來區(qū)分,文件I/O主要針對文件操作,讀寫硬盤等,它操作的是文件描述符,標(biāo)準(zhǔn)I/O針對的是控制臺,打印輸出到屏幕等,它操作的是字符流。對于不同設(shè)備得特性不一樣,必須有不同api訪問才最高效。

最后來看下他們使用的函數(shù)

標(biāo)準(zhǔn)IO

文件IO(低級IO)

打開

fopen,freopen,fdopen

open

關(guān)閉

fclose

close

getc,fgetc,getchar
fgets,gets
fread

read

putc,fputc,putchar
fputs,puts,
fwrite

write

1.fopen與open

標(biāo)準(zhǔn)I/O使用fopen函數(shù)打開一個文件:

FILE* fp=fopen(cONst char* path,const char *mod)

其中path是文件名,mod用于指定文件打開的模式的字符串,比如"r","w","w+","a"等等,可以加上字母b用以指定以二進(jìn)制模式打開(對于 *nix系統(tǒng),只有一種文件類型,因此沒有區(qū)別),如果成功打開,返回一個FILE文件指針,如果失敗返回NULL,這里的文件指針并不是指向?qū)嶋H的文 件,而是一個關(guān)于文件信息的數(shù)據(jù)包,其中包括文件使用的緩沖區(qū)信息。

文件IO使用open函數(shù)用于打開一個文件:

int fd=open(char *name,int how);

與fopen類似,name表示文件名字符串,而how指定打開的模式:O_RDONLY(只讀),O_WRONLY(只寫),O_RDWR (可讀可寫),還有其他模式請man 2 open。成功返回一個正整數(shù)稱為文件描述符,這與標(biāo)準(zhǔn)I/O顯著不同,失敗的話返回-1,與標(biāo)準(zhǔn)I/O返回NULL也是不同的。

2.fclose與close

與打開文件相對的,標(biāo)準(zhǔn)I/O使用fclose關(guān)閉文件,將文件指針傳入即可,如果成功關(guān)閉,返回0,否則返回EOF
比如:

if(fclose(fp)!=0)
printf("Error in closing file");

而文件IO使用close用于關(guān)閉open打開的文件,與fclose類似,只不過當(dāng)錯誤發(fā)生時返回的是-1,而不是EOF,成功關(guān)閉同樣是返回0。C語言用error code來進(jìn)行錯誤處理的傳統(tǒng)做法。

3. 讀文件,getc,fscanf,fgets和read

標(biāo) 準(zhǔn)I/O中進(jìn)行文件讀取可以使用getc,一個字符一個字符的讀取,也可以使用gets(讀取標(biāo)準(zhǔn)io讀入的)、fgets以字符串單位進(jìn)行讀取(讀到遇 到的第一個換行字符的后面),gets(接受一個參數(shù),文件指針)不判斷目標(biāo)數(shù)組是否能夠容納讀入的字符,可能導(dǎo)致存儲溢出(不建議使用),而fgets使用三個參數(shù):
char * fgets(char *s, int size, FILE *stream);

第一個參數(shù)和gets一樣,用于存儲輸入的地址,第二個參數(shù)為整數(shù),表示輸入字符串的最大長度,最后一個參數(shù)就是文件指針,指向要讀取的文件。最 后是fscanf,與scanf類似,只不過增加了一個參數(shù)用于指定操作的文件,比如fscanf(fp,"%s",words)
文件IO中使用read函數(shù)用于讀取open函數(shù)打開的文件,函數(shù)原型如下:

ssize_t numread=read(int fd,void *buf,size_t qty);

其中fd就是open返回的文件描述符,buf用于存儲數(shù)據(jù)的目的緩沖區(qū),而qty指定要讀取的字節(jié)數(shù)。如果成功讀取,就返回讀取的字節(jié)數(shù)目(小于等于qty)

4. 判斷文件結(jié)尾

如果嘗試讀取達(dá)到文件結(jié)尾,標(biāo)準(zhǔn)IO的getc會返回特殊值EOF,而fgets碰到EOF會返回NULL,而對于*nix的read函數(shù),情況有所不 同。read讀取qty指定的字節(jié)數(shù),最終讀取的數(shù)據(jù)可能沒有你所要求的那么多(qty),而當(dāng)讀到結(jié)尾再要讀的話,read函數(shù)將返回0.

5. 寫文件:putc,fputs,fprintf和write

與讀文件相對應(yīng)的,標(biāo)準(zhǔn)C語言I/O使用putc寫入字符,比如:

putc(ch,fp);

第一個參數(shù)是字符,第二個是文件指針。而fputs與此類似:

fputs(buf,fp);

僅僅是第一個參數(shù)換成了字符串地址。而fprintf與printf類似,增加了一個參數(shù)用于指定寫入的文件,比如:

fprintf(stdout,"Hello %s.\n","dennis");

切記fscanf和fprintf將FILE指針作為第一個參數(shù),而putc,fputs則是作為第二個參數(shù)。

在文件IO中提供write函數(shù)用于寫入文件,原型與read類似:

ssize_t result=write(int fd,void *buf ,size_t amt);

fd是文件描述符,buf是將要寫入的內(nèi)存數(shù)據(jù),amt是要寫的字節(jié)數(shù)。如果寫入成功返回寫入的字節(jié)數(shù),通過result與amt的比較可以判斷是否寫入正常,如果寫入失敗返回-1

6. 隨機(jī)存取:fseek()、ftell()和lseek()

標(biāo)準(zhǔn)I/O使用fseek和ftell用于文件的隨機(jī)存取,先看看fseek函數(shù)原型

int fseek(FILE *stream, long offset, int whence);

第一個參數(shù)是文件指針,第二個參數(shù)是一個long類型的偏移量(offset),表示從起始點開始移動的距離。第三個參數(shù)就是用于指定起始點的模式,stdio.h指定了下列模式常量:

SEEK_SET 文件開始處
SEEK_CUR 當(dāng)前位置
SEEK_END 文件結(jié)尾處

看幾個調(diào)用例子:
fseek(fp,0L,SEEK_SET); //找到文件的開始處
fseek(fp,0L,SEEK_END); //定位到文件結(jié)尾處
fseek(fp,2L,SEEK_CUR); //文件當(dāng)前位置向前移動2個字節(jié)數(shù)

而ftell函數(shù)用于返回文件的當(dāng)前位置,返回類型是一個long類型,比如下面的調(diào)用:

fseek(fp,0L,SEEK_END);//定位到結(jié)尾
long last=ftell(fp); //返回當(dāng)前位置

那么此時的last就是文件指針fp指向的文件的字節(jié)數(shù)。

與標(biāo)準(zhǔn)I/O類似,*nix系統(tǒng)提供了lseek來完成fseek的功能,原型如下:

off_t lseek(int fildes, off_t offset, int whence);

fildes是文件描述符,而offset也是偏移量,whence同樣是指定起始點模式,唯一的不同是lseek有返回值,如果成功就 返回指針變化前的位置,否則返回-1。whence的取值與fseek相同:SEEK_SET,SEEK_CUR,SEEK_END,但也可以用整數(shù) 0,1,2相應(yīng)代替。

“本文由華清遠(yuǎn)見http://www.embedu.org/index.htm提供”



華清遠(yuǎn)見

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

為了提升設(shè)計效率和運(yùn)行安全性 ,對DL/T 834—2023《火力發(fā)電廠汽輪機(jī)防進(jìn)水和冷蒸汽導(dǎo)則》與DL/T 834—2003 《火力發(fā)電廠汽輪機(jī)防進(jìn)水和冷蒸汽導(dǎo)則》的設(shè)計、運(yùn)行和檢驗及維護(hù)要求進(jìn)行了對比分析 , 總...

關(guān)鍵字: 標(biāo)準(zhǔn) 疏水 冷蒸汽 發(fā)電廠

為增進(jìn)大家對嵌入式的認(rèn)識,本文將對嵌入式開發(fā)以及學(xué)習(xí)嵌入式需要注意的事項予以介紹。

關(guān)鍵字: 嵌入式 指數(shù) 嵌入式開發(fā)

中國上海,2025年4月7日 — 全球領(lǐng)先的嵌入式系統(tǒng)開發(fā)軟件解決方案供應(yīng)商IAR正式發(fā)布全新云就緒平臺,為嵌入式開發(fā)團(tuán)隊提供企業(yè)級的可擴(kuò)展性、安全性和自動化能力。該平臺于在德國紐倫堡舉辦的embedded world...

關(guān)鍵字: 自動化 嵌入式開發(fā) RISC-V

在嵌入式系統(tǒng)開發(fā)領(lǐng)域,VS Code(Visual Studio Code)作為一款輕量級但功能強(qiáng)大的代碼編輯器,正逐漸成為開發(fā)者的首選工具。本文將詳細(xì)介紹如何在VS Code上搭建嵌入式開發(fā)環(huán)境,并分享一些調(diào)試技巧。

關(guān)鍵字: VS Code 嵌入式開發(fā)

隨著汽車電子化、智能化程度的不斷提高,車載以太網(wǎng)(Automotive Ethernet)作為新一代車載網(wǎng)絡(luò)通信技術(shù),正逐漸成為汽車內(nèi)部通信的主干網(wǎng)絡(luò)。它以其高帶寬、低延遲和強(qiáng)抗干擾能力,為汽車提供了更加高效、可靠的數(shù)據(jù)...

關(guān)鍵字: 車載以太網(wǎng) 嵌入式開發(fā)

隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,嵌入式系統(tǒng)對實時性、低功耗和可擴(kuò)展性的要求越來越高。Zephyr RTOS(實時操作系統(tǒng))作為一款專為資源受限設(shè)備設(shè)計的開源RTOS,憑借其輕量級、模塊化和高可擴(kuò)展性,在嵌入式開發(fā)領(lǐng)域得到了廣泛...

關(guān)鍵字: 嵌入式開發(fā) Zephyr RTOS 物聯(lián)網(wǎng)

在Linux操作系統(tǒng)中,文件操作是進(jìn)程與存儲系統(tǒng)交互的重要方式。對于同一個文件,一個進(jìn)程是否可以在其生命周期內(nèi)多次調(diào)用open函數(shù)打開它,并進(jìn)行讀寫操作呢?答案是肯定的。本文將深入探討這一機(jī)制,并通過代碼示例展示如何在進(jìn)...

關(guān)鍵字: 文件 Linux 操作系統(tǒng)

嵌入式開發(fā),作為電子工程和計算機(jī)科學(xué)交叉領(lǐng)域的重要分支,對于構(gòu)建穩(wěn)定、高效的軟件系統(tǒng)提出了獨(dú)特挑戰(zhàn)。本文將深入探討嵌入式開發(fā)的可靠方法論,結(jié)合實例與代碼,為開發(fā)者提供一套系統(tǒng)化的指導(dǎo)原則。

關(guān)鍵字: 嵌入式開發(fā) 計算機(jī)科學(xué)

嵌入式開發(fā),作為電子工程和計算機(jī)科學(xué)的交匯點,對軟件系統(tǒng)的穩(wěn)定性和效率提出了極高的要求。本文將結(jié)合具體案例,深入探討嵌入式開發(fā)中的可靠方法論,為開發(fā)者提供一套系統(tǒng)化的指導(dǎo)原則。

關(guān)鍵字: 嵌入式開發(fā) 智能家居

在科技日新月異的今天,嵌入式開發(fā)作為連接硬件與軟件的橋梁,在物聯(lián)網(wǎng)、智能設(shè)備、工業(yè)自動化等領(lǐng)域扮演著至關(guān)重要的角色。對于許多技術(shù)愛好者而言,自學(xué)嵌入式開發(fā)既是一個充滿魅力的挑戰(zhàn),也是一條通往創(chuàng)新實踐的必由之路。然而,這條...

關(guān)鍵字: 嵌入式開發(fā) 物聯(lián)網(wǎng)
關(guān)閉