c语言库函数fgets,C语言 标准I/O库函数 fgets 使用心得
char *fgets(char *s, int n, FILE *stream);
參數(shù)說(shuō)明:
s --
指定存放所讀取的數(shù)據(jù)的位置
n -- 指定所讀取數(shù)據(jù)的最大長(zhǎng)度(這個(gè)最大長(zhǎng)度包括了字符串結(jié)束符 \0
所占據(jù)的存儲(chǔ)空間,因此,實(shí)際最大讀取的有效字符數(shù)是 n - 1)
stream --
數(shù)據(jù)源,是一個(gè)文件指針
fgets
函數(shù)用于從“輸入”字符串中讀取指定長(zhǎng)度的字符串。這個(gè)“輸入”字符串既可以是通過(guò)fopen等開(kāi)啟的文件流,也可以是直接從鍵盤(pán)鍵入的
stdin。通俗點(diǎn)說(shuō)就是,它既可以從一個(gè)文本文件中一行、一行地(當(dāng)然,還需要循環(huán)控制語(yǔ)句的配合)讀取字符串,又可以直接讀取從終端鍵入的字符串。
結(jié)合函數(shù)原型中的參數(shù)來(lái)解釋一下這個(gè)函數(shù)的用途:
從文件流(文件指針 stream)或標(biāo)準(zhǔn)輸入流(stdin)中最多讀取 n
- 1 個(gè)字符,并將它們存儲(chǔ)到以 s 為起始地址的內(nèi)存空間里。
fgets 函數(shù)將在以下情況下,停止讀取:
1、在讀取過(guò)程中,遇到換行符 \n
2、在讀取過(guò)程中,遇到EOF
3、在讀取過(guò)程中,讀取的字符數(shù)達(dá)到最大限制(已經(jīng)讀取了 n - 1 個(gè))
如果函數(shù)執(zhí)行成功,則返回 s,否則返回 NULL。
fgets 在成功讀取字符后,讀取的字符串內(nèi)容以及當(dāng)前指針?biāo)幍臓顟B(tài)如下:
strA:目標(biāo)字符串(如果數(shù)據(jù)源是文本流,則為 當(dāng)前行)
strB:讀取到的字符串內(nèi)容
LEN:函數(shù)調(diào)用時(shí)指定的最大讀取字符數(shù)
情況一:當(dāng) strA 的長(zhǎng)度?大于?LEN?時(shí)
strB 為:從?strA?開(kāi)始處獲取到的 LEN?- 1 個(gè)字符
指針狀態(tài):指針偏移至當(dāng)前讀取完的這個(gè)字符之后的位置
例如:
strA?長(zhǎng)度為10,LEN 為?5,此時(shí) strB?的內(nèi)容為 strA?的前4個(gè)(取
LEN?- 1 個(gè))字符,指針指向 strA 的第5個(gè)字符處。
當(dāng)下一次調(diào)用 fgets 函數(shù)時(shí),會(huì)從 strA 的第5個(gè)字符開(kāi)始讀取。
情況二:當(dāng) strA + 2(一個(gè)字符長(zhǎng)度用于存儲(chǔ)在終端鍵入回車(chē)后 or strA 自身(行尾,如果是文本流)的換行符
\n,另一個(gè)字符長(zhǎng)度用于存儲(chǔ)字符串本身的結(jié)束標(biāo)識(shí) \0)?的長(zhǎng)度?小于?LEN?時(shí)
strB 為:strA + 行尾或終端鍵入回車(chē)后的換行符 \n,以及自動(dòng)追加的字符串結(jié)束符 \0
指針狀態(tài):指針偏移至下一行
例如:
strA?長(zhǎng)度為10,LEN 為 15,此時(shí)?strB?的內(nèi)容為?strA\n\0。
fgets 函數(shù)的優(yōu)點(diǎn)是:
1、讀取到的換行符被保存到讀取結(jié)果中
2、操作的數(shù)據(jù)源不僅限于標(biāo)準(zhǔn)輸入流 stdin
3、允許指定讀取字符串的最大長(zhǎng)度,有效避免了緩沖區(qū)溢出的問(wèn)題。
BTW:strlen() 的計(jì)算結(jié)果,是不包括結(jié)束符 \0 的~
原文:http://www.cnblogs.com/MyRobotDream/p/3548567.html
總結(jié)
以上是生活随笔為你收集整理的c语言库函数fgets,C语言 标准I/O库函数 fgets 使用心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux-2.6.38 input子系
- 下一篇: 发现了《ACE程序员教程》中一个例程的问