日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UNIX再学习 -- 标准I/O

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNIX再学习 -- 标准I/O 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這部分之前有所總結(jié):

參看:C語言再學(xué)習(xí) -- 文件

參看:C語言再學(xué)習(xí) -- 輸入/輸出

參看:UNIX再學(xué)習(xí) -- 文件描述符

對(duì)比:UNIX再學(xué)習(xí) -- 文件I/O

一、流

文件I/O中所有的 I/O 函數(shù)都是圍繞文件描述符的。當(dāng)打開一個(gè)文件時(shí),即返回一個(gè)文件描述符,然后該文件描述符就用于后續(xù)的 I/O 操作。 而對(duì)于標(biāo)準(zhǔn) I/O 庫(kù),它們的操作是圍繞流(stream)進(jìn)行的。當(dāng)用標(biāo)準(zhǔn) I/O 庫(kù)打開或創(chuàng)建一個(gè)文件時(shí),我們已使一個(gè)流與一個(gè)文件相關(guān)聯(lián)。 對(duì)于ASCII字符集,一個(gè)字符用一個(gè)字節(jié)表示,對(duì)于國(guó)際字符集,一個(gè)字符可用多個(gè)字節(jié)表示。標(biāo)準(zhǔn) I/O 文件流可用于單字節(jié)或多字節(jié)字符集。流的定向決定了所讀、寫的字符時(shí)單字節(jié)還是多字節(jié)。當(dāng)一個(gè)流最初被創(chuàng)建時(shí),它并沒有定向。如若在未定向的流上使用一個(gè)多字節(jié) I/O 函數(shù),則將該流的定向設(shè)置為寬定向的。若在未定向的流上使用一個(gè)單字節(jié) I/O 函數(shù),則將該流的定向設(shè)為字節(jié)定向的。
只有兩個(gè)函數(shù)可以改變流的定向:freopen 函數(shù)清除一個(gè)流的定向;fwide 函數(shù)可用于設(shè)置流的定向。 下面介紹下 fwide 函數(shù): #include <wchar.h> int fwide(FILE *stream, int mode);

1、參數(shù)解析

第一個(gè)參數(shù):文件流 第二個(gè)參數(shù):mode 模式 根據(jù) mode 參數(shù)的不同值,fwide 函數(shù)執(zhí)行不同的工作。 如若 mode 參數(shù)值為負(fù),fwide 將試圖使指定的流是字節(jié)定向的。 如若 mode 參數(shù)值為正,fwide 將試圖使指定的流是寬定向的。 如若 mode 參數(shù)值為 0,fwide 將不試圖設(shè)置流的定向,但返回標(biāo)識(shí)該流定向的值。

2、函數(shù)功能

fwide 函數(shù)用于設(shè)置流的定向。
注意,fwide 并不改變已定向流的定向。還應(yīng)注意的是,fwide 無出錯(cuò)返回。如若流是無效的,我么唯一可依靠的是,在調(diào)用 fwide 前先清除 errno,從 fwide 返回時(shí)檢查 errno 的值。?

3、返回值

若流是寬定向則返回正值,若是字節(jié)定向則返回負(fù)值,若是未定向的則返回 0。

4、示例說明

#include<stdio.h> #include <wchar.h> int main() {int res = fwide (stdin, 6);printf("%d\n",res);return 0; } 輸出結(jié)果: 1

二、FILE 對(duì)象

當(dāng)打開一個(gè)流時(shí),標(biāo)準(zhǔn) I/O 函數(shù) fopen 返回一個(gè)指向 FILE 對(duì)象的指針該對(duì)象通常是一個(gè)結(jié)構(gòu),它包含了標(biāo)準(zhǔn) I/O 庫(kù)為管理該流需要的所有信息,包括用于實(shí)際 I/O 的文件描述符,指向用于該流緩沖區(qū)的指針、緩沖區(qū)的長(zhǎng)度、當(dāng)前在緩沖區(qū)中的字符數(shù)以及出錯(cuò)標(biāo)志等。 通過?/usr/include/libio.h?查看?C 語言中 _IO_FILE 結(jié)構(gòu)體的定義:?struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ #define _IO_file_flags _flags /* The following pointers correspond to the C++ streambuf protocol. */ /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ char* _IO_read_ptr; /* Current read pointer */ char* _IO_read_end; /* End of get area. */ char* _IO_read_base; /* Start of putback+get area. */ char* _IO_write_base; /* Start of put area. */ char* _IO_write_ptr; /* Current put pointer. */ char* _IO_write_end; /* End of put area. */ char* _IO_buf_base; /* Start of reserve area. */ char* _IO_buf_end; /* End of reserve area. */ /* The following fields are used to support backing up and undo. */ char *_IO_save_base; /* Pointer to start of non-current get area. */ char *_IO_backup_base; /* Pointer to first valid character of backup area */ char *_IO_save_end; /* Pointer to end of non-current get area. */ struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; #if 0 int _blksize; #else int _flags2; #endif _IO_off_t _old_offset; /* This used to be _offset but it's too small. */ #define __HAVE_COLUMN /* temporary */ /* 1+column number of pbase(); 0 is unknown. */ unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; /* char* _save_gptr; char* _save_egptr; */ _IO_lock_t *_lock; #ifdef _IO_USE_OLD_IO_FILE }; ?/usr/include/stdio.h 也可以看到對(duì)標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤的定義/* Standard streams. */ extern struct _IO_FILE *stdin; /* Standard input stream. */ extern struct _IO_FILE *stdout; /* Standard output stream. */ extern struct _IO_FILE *stderr; /* Standard error output stream. *//* C89/C99 say they're macros. Make them happy. */ #define stdin stdin #define stdout stdout #define stderr stderr

三、緩沖

標(biāo)準(zhǔn) I/O 庫(kù)提供緩沖的目的是盡可能減少使用 read 和 write 調(diào)用的次數(shù)。它也對(duì)每個(gè) I/O 流自動(dòng)地進(jìn)行緩沖管理,從而避免了應(yīng)用程序需要考慮這一點(diǎn)所帶來的麻煩。

1、標(biāo)準(zhǔn) I/O 提供了以下 3 種類型的緩沖。

(1)全緩沖

在這種情況下,在填滿標(biāo)準(zhǔn) I/O 緩沖區(qū)后才進(jìn)行實(shí)際 I/O 操作。對(duì)于駐留在磁盤上的文件通常是有標(biāo)準(zhǔn) I/O 庫(kù)實(shí)施全緩沖的。在一個(gè)流上執(zhí)行第一次 I/O 操作時(shí),相關(guān)標(biāo)準(zhǔn)的 I/O 函數(shù)通常調(diào)用 malloc 獲取需使用的緩沖區(qū)。這部分可參看:C語言再學(xué)習(xí) -- 輸入/輸出? ?了解緩沖相關(guān)函數(shù)

(2)行緩沖

在這種情況下,當(dāng)在輸入和輸出中遇到換行符時(shí),標(biāo)準(zhǔn) I/O 庫(kù)執(zhí)行 I/O 操作。這允許我們一次輸出一個(gè)字符,但只有寫了一行之后才進(jìn)行實(shí)際 I/O 操作。當(dāng)流涉及一個(gè)終端時(shí)(如標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出),通常使用行緩沖。
對(duì)于行緩沖有兩個(gè)限制:第一,因?yàn)闃?biāo)準(zhǔn) I/O 庫(kù)用來收集每一行的緩沖區(qū)的長(zhǎng)度是固定的,所以只要填滿了緩沖區(qū),那么即使還沒有寫一個(gè)換行符,也進(jìn)行 I/O 操作第二,任何時(shí)候只要通過標(biāo)準(zhǔn) I/O 庫(kù)要求從(a)一個(gè)不帶緩沖的流,或者(b)一個(gè)行緩沖的流得到輸入數(shù)據(jù),那么就會(huì)沖洗所有行緩沖輸出流

(3)不帶緩沖

標(biāo)準(zhǔn) I/O 庫(kù)不對(duì)字符進(jìn)行緩沖存儲(chǔ)。例如,標(biāo)準(zhǔn) I/O 函數(shù) fputs、標(biāo)準(zhǔn)錯(cuò)誤流 stderr 通常是不帶緩沖的

2、ISO要求下列緩沖特征

(1)當(dāng)且僅當(dāng)標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出并不指向交互設(shè)備時(shí),它們才是全緩沖的。(2)標(biāo)準(zhǔn)錯(cuò)誤絕不會(huì)是全緩沖的(3)標(biāo)準(zhǔn)錯(cuò)誤是不帶緩沖的(4)若是指向終端設(shè)備的流,則是行緩沖;否則是全緩沖的。

3、函數(shù) setbuf 和 setvbuf

參看:C語言再學(xué)習(xí) -- 輸入/輸出? 講的很詳細(xì)了,就不重復(fù)了。

四、打開流

#include <stdio.h> FILE *fopen(const char *path, const char *mode); FILE *fdopen(int fd, const char *mode); FILE *freopen(const char *path, const char *mode, FILE *stream);

1、參數(shù)解析

第一個(gè)參數(shù):文件路徑/文件描述符 第二個(gè)參數(shù):mode 方式

mode:C 字符串,包含了文件訪問模式,模式如下:

模式字符串

?

“r”

以只讀方式打開文件,該文件必須存在

“r+”

以只讀寫方式打開文件,該文件必須存在

“w”

打開只寫文件,若文件存在則文件長(zhǎng)度清零,即該文件內(nèi)容會(huì)消失。

若文件不存在則建立該文件

“w+”

打開可讀寫文件,若文件存在則文件長(zhǎng)度清零,即該文件內(nèi)容會(huì)消失。

若文件不存在則建立該文件。

“a”

以附加的方式打開只寫文件。若文件不存在,則會(huì)建立該文件,如果文件存在,

寫入的數(shù)據(jù)會(huì)被加到文件尾,即文件原先的內(nèi)容會(huì)被保留。(EOF符保留)

“a+”

以附加方式打開可讀寫的文件。若文件不存在,則會(huì)建立文件,如果文件存在,

寫入的數(shù)據(jù)會(huì)被加到文件尾后,即文件原先的內(nèi)容會(huì)被保留。(原來的EOF符不保留)

“rb”, “wb”, “ab”, “ab+”, “a+b”,

?“wb+”, “w+b”, “ab+”, “a+b”

與前面的模式相似,只是使用二進(jìn)制模式而非文本模式打開文件


2、函數(shù)功能

打開一個(gè)標(biāo)準(zhǔn) I/O 流。
這 3 個(gè)函數(shù)的區(qū)別如下: (1)fopen 函數(shù)打開路徑為 path 的一個(gè)指定的文件 (2)freopen 函數(shù)在一個(gè)指定的流上打開一個(gè)指定的文件,如若該流已經(jīng)打開,則先關(guān)閉該流若該流已經(jīng)定向,則使用 freopen 清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開為一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤。 (3)fdopen 函數(shù)取一個(gè)已有的文件描述符(我們可能從 open,dup,dup2,fcntl,pipe,socket,socketpair或accept函數(shù)得到此文件描述符)?,并使一個(gè)標(biāo)準(zhǔn)的 I/O 流與該描述符相結(jié)合。此函數(shù)常用于創(chuàng)建管道和網(wǎng)絡(luò)通信通道函數(shù)返回的描述符。因?yàn)檫@些特殊類型的文件不能用標(biāo)準(zhǔn) I/O 函數(shù) fopen 打開,所以我們必須先調(diào)用設(shè)備專用函數(shù)以獲得一個(gè)文件描述符,然后用 fdopen 使一個(gè)標(biāo)準(zhǔn) I/O 流與該描述符相結(jié)合。

3、返回值

成功返回文件指針,失敗返回 NULL

4、示例說明

//示例一 fopen函數(shù) #include<stdio.h> #include <stdlib.h>int main (void) { FILE*fp = NULL; fp = fopen("abc.txt", "r"); if(NULL == fp) perror("fail to fopen"), exit (1); fclose (fp); fp = NULL; return 0; } //示例二 freopen 函數(shù) #include<stdio.h> #include <stdlib.h>int main (void) { FILE*fp = NULL; fp = freopen("abc.txt", "w", stdout); if(NULL == fp) perror("fail to freopen"), exit (1); printf ("hello world!\n");fclose (stdout);fclose (fp); fp = NULL; return 0; } 查看 abc.txt # cat abc.txt hello world!//示例三 fdopen 函數(shù) #include <stdio.h> #include <unistd.h>int main (void) {FILE * fp = fdopen (STDOUT_FILENO, "w+");fprintf (fp, "%s\n", "hello!");fclose(fp);return 0; } 輸出結(jié)果: hello!

5、示例總結(jié)

示例一:fopen 函數(shù)很好理解,沒什么可講的。 示例二:freopen 函數(shù),一般用于將指定的文件打開為一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤。 示例三:fdopen 函數(shù),打開文件描述符。對(duì)于 fdopen 來說,mode 參數(shù)的意義稍有區(qū)別。因?yàn)樵撁枋龇驯淮蜷_,所以 fdopen 為寫而打開并不截?cái)嘣撐募?/strong>。例如,若該描述符原來是由 open 函數(shù)創(chuàng)建的,而且該文件已經(jīng)存在,則其 O_TRUNC 標(biāo)志將決定是否截?cái)嘣撐募?/span> 另外,標(biāo)準(zhǔn) I/O 追加寫方式也不能用于創(chuàng)建該文件(因?yàn)槿绻粋€(gè)描述符引用一個(gè)文件,則該文件一定已經(jīng)存在)。

6、擴(kuò)展部分

除非流引用終端設(shè)備,否則按系統(tǒng)默認(rèn),流被打開時(shí)是全緩沖的。若流引用終端設(shè)備,則該流是行緩沖的。一旦打開了流,那么在對(duì)該流執(zhí)行任何操作之前,如果希望,則可使用 setbuf 和 setvbuf 改變緩沖的類型 在該文件被關(guān)閉之前,沖洗(fflush )緩沖中的輸出數(shù)據(jù),緩沖區(qū)中的任何輸入數(shù)據(jù)被丟棄。如果標(biāo)準(zhǔn) I/O 庫(kù)已經(jīng)為該流自動(dòng)分配了一個(gè)緩沖區(qū),則釋放此緩沖區(qū)。 當(dāng)一個(gè)進(jìn)程正常終止時(shí)(直接調(diào)用 exit 函數(shù),或從main 函數(shù)返回),則所有帶未寫緩沖數(shù)據(jù)的標(biāo)準(zhǔn) I/O 流都被沖洗,所有打開的標(biāo)準(zhǔn) I/O 流都被關(guān)閉 這部分在講 return 和 exit 區(qū)別是有講過,參看:C語言再學(xué)習(xí) -- 關(guān)鍵字return和exit ()函數(shù)

五、讀和寫流 (文件輸入/輸出)

一旦打開了流,則可在 3 種不同類型的非格式化 I/O 中進(jìn)行選擇,對(duì)其進(jìn)行讀、寫操作。 (1)每次一個(gè)字符的 I/O。 一次讀或?qū)懸粋€(gè)字符,如果流是帶緩沖的,則標(biāo)準(zhǔn) I/O 函數(shù)處理所有緩沖。 (2)每次一行的 I/O。 如果想要一次讀或?qū)懸恍?#xff0c;則使用 fgets 和 fputs。每行都以一個(gè)換行符終止。當(dāng)調(diào)用 fgets 時(shí),應(yīng)說明能處理的最大行長(zhǎng)。 (3)直接 I/O。 fread 和 fwrite 函數(shù)支持這種類型的 I/O。每次 I/O 操作讀或?qū)懩撤N數(shù)量的對(duì)象,而每個(gè)對(duì)象具有指定的長(zhǎng)度。這兩個(gè)函數(shù)常用于從二進(jìn)制文件中每次讀或?qū)懸粋€(gè)結(jié)構(gòu)。

1、輸入函數(shù)

以下 3 個(gè)函數(shù)可用于一次讀一個(gè)字符。 #include <stdio.h> int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void);

(1)返回值

?成功返回下一個(gè)字符,若已到達(dá)文件尾端或出錯(cuò),則返回 EOF

(2)函數(shù)比較

函數(shù) getchar 等同于 getc (stdin)。前兩個(gè)函數(shù)的區(qū)別是,getc 可被實(shí)現(xiàn)為宏,而 fgetc 不能實(shí)現(xiàn)為宏。這意味著以下幾點(diǎn)。 1) getc 的參數(shù)不應(yīng)當(dāng)是具有副作用的表達(dá)式,因?yàn)樗赡軙?huì)被計(jì)算多次。 2) 因?yàn)?strong> fgetc 一定是個(gè)函數(shù),所以可以得到其地址。
這就允許將 fgetc 的地址作為一個(gè)參數(shù)傳送給另一個(gè)函數(shù)。 3) 調(diào)用 fgetc 所需時(shí)間很可能比調(diào)用 getc 要長(zhǎng),因此調(diào)用函數(shù)所需的時(shí)間通常長(zhǎng)于調(diào)用宏。 擴(kuò)展:有副作用的表達(dá)式,指的是表達(dá)式執(zhí)行后,會(huì)改變表達(dá)式中某些變量的值?
最簡(jiǎn)單的如++i,這個(gè)表達(dá)式執(zhí)行后,i 的值會(huì)改變,這樣的表達(dá)式是不應(yīng)該在宏調(diào)用里出現(xiàn)的。

(3)示例說明

//示例一 fgetc 函數(shù) #include <stdio.h>int main (void) {FILE *fp;int c;fp = fopen ("abc.txt", "r");while ((c = fgetc (fp)) != EOF){if (c == 'b')fputc (c,stdout);}printf ("\n");fclose (fp);return 0; } 輸出結(jié)果: b//示例二 getc 函數(shù) #include<stdio.h> int main() { char c; printf("請(qǐng)輸入字符:"); c = getc(stdin); //等同函數(shù) getcharprintf("輸入的字符:"); putc(c, stdout); return(0); } 輸出結(jié)果: 請(qǐng)輸入字符:f 輸入的字符:f//示例三 getchar 函數(shù) #include <stdio.h> int main (void) { int c; while((c=getchar())!=EOF) putchar(c); return 0; }

(4)示例總結(jié)

這 3 個(gè)函數(shù)在返回下一個(gè)字符時(shí),將其 unsigned char 類型轉(zhuǎn)換為 int 類型。說明為無符號(hào)的理由是,如果最高位為 1 也不會(huì)使返回值為負(fù)。要求整型返回值的理由是,這樣就可以返回所有可能的字符值再加上一個(gè)已出錯(cuò)或已到達(dá)文件尾端的指示值。在 <stdio.h> 中常量 EOF 被要求是一個(gè)負(fù)值,其值經(jīng)常是 -1。這就意味著不能將這 3 個(gè)函數(shù)的返回值存放在一個(gè)字符變量中,以后還要將這些函數(shù)的返回值與常量 EOF 比較。 注意,不管是出錯(cuò)還是到達(dá)文件尾端,這 3 個(gè)函數(shù)都返回同樣的值。為了區(qū)分這兩種不同的情況,必須調(diào)用 ferror 或 feof。 參看:C語言再學(xué)習(xí) -- EOF、feof函數(shù)、ferror函數(shù) 擴(kuò)展:ungetc ( ) 函數(shù) 從流中讀取數(shù)據(jù)以后,可以調(diào)用 ungetc 將字符再壓送回流中。

2、輸出函數(shù)

對(duì)應(yīng)于上面所述的每個(gè)輸入函數(shù)都有一個(gè)輸出函數(shù)。 #include <stdio.h> int fputc(int c, FILE *stream); int putc(int c, FILE *stream); int putchar(int c);

(1)函數(shù)比較

putchar函數(shù),輸出到顯示器

putc函數(shù),將字符輸入到文件

把stdout作為putc()函數(shù)的第二個(gè)參數(shù)。stdout是在stdout中定義的與標(biāo)準(zhǔn)輸出相關(guān)的文件指針,

所以putc (ch, stdout) 和 putchar ( )的作用是一樣的。

putc 可被實(shí)現(xiàn)為宏,而 fputc 不能實(shí)現(xiàn)為宏。

(2)示例說明 同上

六、每次一行 I/O (字符串輸入/輸出)

1、下面兩個(gè)函數(shù)提供了每次輸入一行的功能。

#include <stdio.h> char *fgets(char *s, int size, FILE *stream); char *gets(char *s);

(1)函數(shù)比較

這兩個(gè)函數(shù)都指定了緩沖區(qū)的地址,讀入的行將送入其中。gets 從標(biāo)準(zhǔn)輸入讀,而 fgets 則從指定的流讀對(duì)于 fgets 必須指定緩沖的長(zhǎng)度 n。此函數(shù)一直讀到下一個(gè)換行符為止,但是不超過 n-1 個(gè)字符,讀入的字符被送入緩沖區(qū)。該緩沖區(qū)以 null 字節(jié)結(jié)尾。如若該行包括最后一個(gè)換行符的字符數(shù)超過 n-1,則 fgets 只返回一個(gè)不完整的行,但是,緩沖區(qū)總是以 null 字節(jié)結(jié)尾。對(duì) fgets 的下一次調(diào)用會(huì)繼續(xù)讀該行。gets 是一個(gè)不推薦使用的函數(shù)。其問題是調(diào)用者在使用 gets 時(shí)不能指定緩沖區(qū)的長(zhǎng)度。這樣就可能造成緩沖區(qū)溢出,寫到緩沖區(qū)之后的存儲(chǔ)空間中,從而產(chǎn)生不可預(yù)料的后果。

(2)示例說明

//示例一 fgets函數(shù) #include <stdio.h> int main (void) { char name [20]; char *ptr; ptr = fgets (name, 20, stdin); printf ("%s?, hi %s!\n", name, ptr); return 0; } 輸出結(jié)果: JOY JOY ?, hi JOY ! //示例二 gets 函數(shù) #include <stdio.h> int main (void) { char name[50]; char *ptr; while ((ptr = gets (name)) != NULL) { printf ("name is %s\n", name); printf ("ptr is %s\n", ptr); break; } return 0; } 輸出結(jié)果: HELLO name is HELLO ptr is HELLO

2、fputs 和 puts 提供每次輸出一行的功能

#include <stdio.h> int fputs(const char *s, FILE *stream); int puts(const char *s);

(1)函數(shù)比較

函數(shù) fputs 將一個(gè)以 null 字節(jié)終止的字符串寫到指定的流,尾端的終止符 null 不寫出。注意,這并不一定是每次輸出一行,因?yàn)樽址恍枰獡Q行符作為最后一個(gè)非 null 字節(jié)。通常,在 null 字節(jié)之前是一個(gè)換行符,但并不要求總是如此。puts 將一個(gè) null 字節(jié)終止的字符串寫到標(biāo)準(zhǔn)輸出,終止符不寫出。但是,puts 隨后又將一個(gè)換行符寫到標(biāo)準(zhǔn)輸出。puts 并不像它所對(duì)應(yīng)的 gets 那樣不安全。但是我們還是應(yīng)避免使用它,以免需要記住它在最后是否添加了一個(gè)換行符。如果總是使用 fgets 和 fputs ,那么就會(huì)熟知在每行終止處我們必須自己處理?yè)Q行符。

(2)示例說明

//示例一 fputs函數(shù) #include <stdio.h> int main (void) { char name [20]; fgets (name, 20, stdin); fputs (name, stdout);return 0; } 輸出結(jié)果: hello hello//示例二 puts函數(shù) #include <stdio.h> int main (void) { char name[50]; char *ptr; while ((ptr = gets (name)) != NULL) { puts (name);} return 0; }

七、二進(jìn)制 I/O

#include <stdio.h> size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream); size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);

1、函數(shù)用法

這些函數(shù)有以下兩種常見的用法。

(1)讀或?qū)懸粋€(gè)二進(jìn)制數(shù)組。

例如:為了將一個(gè)字符數(shù)組的第 2~5 個(gè)元素寫到一文件上,可編寫如下程序://fwrite 函數(shù) #include <stdio.h> #include <stdlib.h>int main (void) {FILE *fp = fopen ("abc.dat", "wb"); char data[10] = "123456789";if (fwrite (&data[2], sizeof (char), 4, fp) != 4)perror ("fail to fwrite"), exit (1);return 0; } 查看 abc.data # cat abc.dat 3456//fread 函數(shù) #include <stdio.h> int main() {int arr[5]={},size=0,num=0; //不要老是打錯(cuò)了好嗎,仔細(xì)仔細(xì)再仔細(xì)。FILE *p_file=fopen("a.bin","r");if(p_file){size=fread(arr,sizeof(int),5,p_file); //就是個(gè)數(shù)printf("size是%d\n",size);for(num=0;num<=4;num++){printf("%d ",arr[num]);}printf("\n");fclose(p_file);p_file=NULL;}return 0; }

(2)讀或?qū)懸粋€(gè)結(jié)構(gòu)。例如,可以編寫如下程序:

//fwrite 函數(shù) #include <stdio.h> #include <string.h> #include <stdlib.h>typedef struct { int n; float m; char name[20]; }Ptr; int main (void) { Ptr p;strcpy (p.name, "hello"); //注意字符串不能直接賦值 p.n = 11; p.m = 12.9; FILE *fp = fopen ("abc.dat", "wb");if (fwrite (&p, sizeof (Ptr), 1, fp) != 1)perror ("fail to fwrite"), exit (1);return 0; } //fread 函數(shù) #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct {int id;float salary;char name[20]; }person; int main() {person p={};FILE *p_file=fopen("person.bin","rb");if(p_file){while(1){if(!fread(&p,sizeof(person),1,p_file)){break;}fread(&p,sizeof(person),1,p_file);//二進(jìn)制寫操作printf("id是%d,工資是%g,姓名是%s\n",p.id,p.salary,p.name);}fclose(p_file);p_file=NULL;}return 0; }

2、使用二進(jìn)制 I/O 的基本問題

它只能用于讀在同一系統(tǒng)上已寫的數(shù)據(jù)。常常有這種情況,在一個(gè)系統(tǒng)上寫的數(shù)據(jù),要在另一個(gè)系統(tǒng)上進(jìn)行處理。在這種情況下,這兩個(gè)函數(shù)可能就不能正常工作,其原因是: (1)在一個(gè)結(jié)構(gòu)中,同一成員的偏移量可能因編譯器和系統(tǒng)而異。 (2)用來存儲(chǔ)多字節(jié)整數(shù)和浮點(diǎn)值的二進(jìn)制格式在不同的機(jī)器體系結(jié)構(gòu)間也可能不同。

八、定位流

有三種方法定位標(biāo)準(zhǔn) I/O。

1、ftell 和 fseek 函數(shù)。

#include <stdio.h> int fseek(FILE *stream, long offset, int whence); long ftell(FILE *stream); void rewind(FILE *stream); 它們都假定文件的位置可以存放在一個(gè)長(zhǎng)整型中。參看:C語言再學(xué)習(xí) -- 文件? 在此不做重復(fù)。

2、ftello 和 fseeko 函數(shù)。

#include <stdio.h> int fseeko(FILE *stream, off_t offset, int whence); off_t ftello(FILE *stream); 可使文件偏移量不必一定使用長(zhǎng)整型。它們使用 off_t 數(shù)據(jù)類型代替了長(zhǎng)整型。 除了類型區(qū)別外,ftello 函數(shù) 與 ftell 相同,fseeko 函數(shù)和 fseek 函數(shù)相同。 off_t 類型我們前面有講到,linux中的 off_t 類型默認(rèn)是 32 位的 long int。

3、fgetpos 和 fsetpos 函數(shù)

#include <stdio.h>int fgetpos(FILE *stream, fpos_t *pos); int fsetpos(FILE *stream, fpos_t *pos); 返回值:成功返回0,失敗返回非0 它們使用一個(gè)抽象數(shù)據(jù)類型 fpos_t 記錄文件的位置。這兩個(gè)函數(shù)是由ISO C引入的。這種數(shù)據(jù)類型可以定義為記錄一個(gè)文件位置所需的長(zhǎng)度。 fgetpos 將文件位置指示器的當(dāng)前值存入由 pos 指向的對(duì)象中在以后調(diào)用 fsetpos 時(shí),可以使用此值將流重新定位至該位置。

(1)示例說明

#include <stdio.h> #include <string.h>int main (void) {FILE *fp;fpos_t filepos;fp = fopen ("abc.txt", "w+");fgetpos (fp, &filepos);fputs ("hello world!", fp);fsetpos (fp, &filepos);fputs ("這將覆蓋之前的內(nèi)容", fp);fclose (fp);return 0; } 查看 abc.ttx # cat abc.txt 這將覆蓋之前的內(nèi)容

(2)示例總結(jié)

首先我們使用 fgetpos() 函數(shù)獲取文件的初始位置,接著我們向文件寫入 Hello, World!,然后我們使用 fsetpos() 函數(shù)來重置寫指針到文件的開頭,重寫文件。

九、格式化 I/O

1、格式化輸出

格式化輸出是由 5 個(gè)printf 函數(shù)來處理的。 #include <stdio.h>int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int dprintf(int fd, const char *format, ...); int sprintf(char *str, const char *format, ...); int snprintf(char *str, size_t size, const char *format, ...);

(1)函數(shù)比較

printf 將格式化數(shù)據(jù)寫到標(biāo)準(zhǔn)輸出; fprintf 寫至指定的流; dprintf 寫至指定的文件描述符; sprintf 將格式化的字符送入數(shù)組 buf 中。sprintf 在該數(shù)組的尾端自動(dòng)加一個(gè) null 字節(jié),但該字符不包括在返回值中 這部分之前也講過: 參看:C語言再學(xué)習(xí) -- 字符串和字符串函數(shù) 參看:C語言再學(xué)習(xí) -- 輸入/輸出 參看:C語言再學(xué)習(xí) -- printf、scanf占位符

(2)示例說明

//示例一 fprintf 函數(shù) #include <stdio.h> int main() { FILE *p_file = fopen("b.txt","w"); if(p_file) { //fprintf函數(shù)可以把數(shù)據(jù)按照格式記錄到文本文件中 fprintf(p_file,"%c,%g,%d\n",'c',3.14,46);fclose(p_file); p_file=NULL; } return 0; } 查看 b.txt # cat b.txt c,3.14,46//示例二 dprintf 函數(shù) #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h>int main (void) { int fd = open ("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (-1 == fd)perror ("fail to fopen"), exit (1);dprintf (fd, "%c, %g, %d\n", 'A', 5.12, 68);close (fd);return 0; } 輸出結(jié)果: # cat a.txt A, 5.12, 68//示例三 sprintf 函數(shù) #include <stdio.h> #define SIZE 30 int main (void) { char str[SIZE]; sprintf (str, "%s %s %d\n", "I","love",512 ); puts (str); return 0; } 輸出結(jié)果: I love 512

(3)示例總結(jié)

printf 函數(shù) 太簡(jiǎn)單,這里就不寫例子了。

示例一:fprintf () 的工作方式和 printf() 相似,區(qū)別在于前者需要第一個(gè)參數(shù)來指定合適的文件流 示例二:dprintf 一樣和 printf 相似,區(qū)別在于前者需要第一個(gè)參數(shù)來指定合適的文件描述符 雖然 dprintf 不處理文件指針,但我們?nèi)匀话阉ㄔ谔幚砀袷交敵龅暮瘮?shù)中。注意,使用 dprintf 不需要調(diào)用 fdopen 將文件描述符轉(zhuǎn)換為文件指針(fprintf 需要)。
以上 3 個(gè)函數(shù),它們的返回值,成功返回輸出的字符個(gè)數(shù),失敗返回負(fù)值。

例:rv = printf ("hello"); ?結(jié)果為rv = 5;

再有,需要掌握的 printf( ) 格式轉(zhuǎn)換說明符,這里就不講了。


示例三:注意,sprintf 函數(shù)可能會(huì)造成由 buf 指向的緩沖區(qū)的溢出。調(diào)用者有責(zé)任確保該緩沖區(qū)足夠大。

溢出錯(cuò)誤如下:

# ./a.out str = 12345678901234567890 len = 20 *** stack smashing detected ***: ./a.out terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7677dd5] /lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb7677d8a] ./a.out[0x80484d5] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75914d3] ./a.out[0x80483a1] ======= Memory map: ======== 08048000-08049000 r-xp 00000000 08:01 2102158 /home/tarena/project/c_test/a.out 08049000-0804a000 r--p 00000000 08:01 2102158 /home/tarena/project/c_test/a.out 0804a000-0804b000 rw-p 00001000 08:01 2102158 /home/tarena/project/c_test/a.out 094f1000-09512000 rw-p 00000000 00:00 0 [heap] b7547000-b7563000 r-xp 00000000 08:01 1704884 /lib/i386-linux-gnu/libgcc_s.so.1 b7563000-b7564000 r--p 0001b000 08:01 1704884 /lib/i386-linux-gnu/libgcc_s.so.1 b7564000-b7565000 rw-p 0001c000 08:01 1704884 /lib/i386-linux-gnu/libgcc_s.so.1 b7577000-b7578000 rw-p 00000000 00:00 0 b7578000-b7717000 r-xp 00000000 08:01 1704863 /lib/i386-linux-gnu/libc-2.15.so b7717000-b7719000 r--p 0019f000 08:01 1704863 /lib/i386-linux-gnu/libc-2.15.so b7719000-b771a000 rw-p 001a1000 08:01 1704863 /lib/i386-linux-gnu/libc-2.15.so b771a000-b771d000 rw-p 00000000 00:00 0 b772d000-b7731000 rw-p 00000000 00:00 0 b7731000-b7732000 r-xp 00000000 00:00 0 [vdso] b7732000-b7752000 r-xp 00000000 08:01 1704843 /lib/i386-linux-gnu/ld-2.15.so b7752000-b7753000 r--p 0001f000 08:01 1704843 /lib/i386-linux-gnu/ld-2.15.so b7753000-b7754000 rw-p 00020000 08:01 1704843 /lib/i386-linux-gnu/ld-2.15.so bf960000-bf981000 rw-p 00000000 00:00 0 [stack] 已放棄 (核心已轉(zhuǎn)儲(chǔ))

因?yàn)榫彌_區(qū)溢出會(huì)造成程序不穩(wěn)定甚至安全隱患,為了解決這種緩沖區(qū)溢出問題,引入了 snprintf 函數(shù)例如:

#include <stdio.h> #include <stdlib.h>int main (void) { char str[10] = {0};int len = snprintf (str, sizeof (str), "12345678901234567890");printf ("str = %s\n", str);printf ("len = %d\n", len);return 0; } 輸出結(jié)果: str = 123456789 len = 20 在該函數(shù)中,緩沖區(qū)長(zhǎng)度是一個(gè)顯示參數(shù),超過緩沖區(qū)尾端的所有字符都被丟棄。如果緩沖區(qū)足夠大,snprintf 函數(shù)就會(huì)返回寫入緩沖區(qū)的字符數(shù)。與 sprintf 相同該返回值不包括結(jié)尾的 null 字節(jié)。

以上這 2 個(gè)函數(shù)的返回值,成功返回將要存入數(shù)組的字符數(shù),若編碼出錯(cuò),返回負(fù)值。

2、格式化輸入

執(zhí)行格式化輸入處理的是 3 個(gè) scanf 函數(shù)。#include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); 3個(gè)函數(shù)返回值:賦值的輸入項(xiàng)數(shù);若輸入出錯(cuò)或在任一轉(zhuǎn)換前已到達(dá)文件尾端,返回 EOF

(1)函數(shù)比較

scanf 族用于分析輸入字符串,并將字符序列轉(zhuǎn)換成指定類型的變量。在格式之后的各參數(shù)包含了變量的地址,用轉(zhuǎn)換結(jié)果對(duì)這些變量賦值。

(2)示例說明

//示例一 fscanf 函數(shù) #include <stdio.h> int main() { char ch=0; float fnum=0.0; int num=0; FILE *p_file=fopen("b.txt","r"); if(p_file) { //fscanf函數(shù)可以從文件中按照格式把數(shù)據(jù)拷貝到內(nèi)存的存儲(chǔ)區(qū)里 fscanf(p_file,"%c %g %d",&ch,&fnum,&num);//拷貝到存儲(chǔ)區(qū)我們就可以打印出來 printf("%c %g %d\n",ch, fnum, num); fclose(p_file); p_file=NULL; } return 0; } 輸出結(jié)果: c 3.14 46//示例二 sscanf 函數(shù) #include <stdio.h> #define SIZE 30 int main (void) { char str[SIZE]; sscanf ("12345", "%s", str);puts (str); return 0; } 輸出結(jié)果: 12345

(3)示例總結(jié)

示例一:fscanf 函數(shù)工作方式和 scanf 相似,區(qū)別在于前者需要第一個(gè)參數(shù)來指定合適的文件流
示例二:參看:C語言函數(shù)sscanf()的用法
sscanf 與 scanf 類似,都是用于輸入的,只是后者以屏幕 (stdin) 為輸入源,前者以固定字符串為輸入源
需要掌握的 scanf() 格式轉(zhuǎn)換修飾符,這里就不再重復(fù)了。
最后,需要注意下這 3 個(gè)函數(shù)的返回值,成功輸入的項(xiàng)目個(gè)數(shù)巧用scanf()返回值:status = scanf ("%ld", &num); while (status == 1) {status = scanf ("%ld", &num); } /*當(dāng)輸入整數(shù)則執(zhí)行while循環(huán),例如輸入Q,則scanf返回值為0,循環(huán)終止*/ 也可用下列形式代替: while(scanf ("%ld", &num) == 1) {}

十、函數(shù) fileno

#include <stdio.h> int fileno(FILE *stream); 返回值:與該流相關(guān)聯(lián)的文件描述符

1、函數(shù)功能

每個(gè)標(biāo)準(zhǔn) I/O 流都有一個(gè)與其相關(guān)聯(lián)的文件描述符。可以對(duì)一個(gè)流調(diào)用 fileno 函數(shù)以獲得其描述符。在講文件描述符時(shí)講過了,參看:UNIX再學(xué)習(xí) -- 文件描述符

2、示例說明

//示例一 #include <stdio.h> int main(void) { FILE *fp; int fd; fp = fopen("/etc/passwd", "r"); fd = fileno(fp); printf("fd = %d\n", fd); fclose(fp); return 0; } 輸出結(jié)果: fd = 3 //示例二 #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main (void) { int fd = fileno (stdout);int newfd = dup (fd); if (-1 == newfd) perror ("Fail to dup"), exit (-1); printf ("newfd = %d\n", newfd); write (newfd, "hello world\n", 12); return 0; } 輸出結(jié)果: newfd = 3 hello world

3、示例總結(jié)

示例一:?fileno 可以用來取得參數(shù) stream 指定的文件流所使用的文件描述符。示例二:如果要調(diào)用 dup 或 fcntl 等函數(shù),則需要此函數(shù)。

十一、未講部分

標(biāo)準(zhǔn) I/O 的效率格式化 I/O printf/scanf 族的變體臨時(shí)文件內(nèi)存流標(biāo)準(zhǔn) I/O 的替代軟件

總結(jié)

以上是生活随笔為你收集整理的UNIX再学习 -- 标准I/O的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲精品欧美成人 | 99精品视频在线免费观看 | 日日干激情五月 | 国产手机免费视频 | 久久国产影视 | 韩日精品在线 | 这里只有精品视频在线 | 天天操天天射天天爱 | 最近日本字幕mv免费观看在线 | 精品视频9999 | 麻豆精品视频在线 | 亚洲成人黄色在线观看 | 亚洲无吗视频在线 | 久久精品123| 天堂av免费观看 | 国产精品伦一区二区三区视频 | 蜜臀av性久久久久蜜臀av | 亚洲国产无 | 日韩午夜视频在线观看 | 最近久乱中文字幕 | 西西大胆免费视频 | 亚洲精品三级 | 国产精品一区二区三区在线看 | 日韩视频一区二区在线观看 | 久久精品一 | 人人爽人人香蕉 | 婷婷丁香花 | 正在播放国产91 | 中文字幕在线视频网站 | 久久久久久久久精 | 久久草在线精品 | 在线视频1卡二卡三卡 | 国产日本三级 | 91av视频免费观看 | 国产又粗又猛又黄 | 亚洲天堂毛片 | 国产精品精品国产 | 一区二区三区精品久久久 | 日韩高清精品免费观看 | 免费视频久久久 | 久久精品精品电影网 | 激情五月伊人 | 国产很黄很色的视频 | 一区二区三区视频在线 | 欧美另类xxx| 在线只有精品 | 狠狠色伊人亚洲综合成人 | 免费看国产视频 | 69av在线播放 | 蜜桃视频日韩 | 婷久久| 999精品视频| 欧美日韩国产精品一区二区亚洲 | 免费黄色激情视频 | 国产欧美精品在线观看 | 婷婷伊人综合亚洲综合网 | 网址你懂的在线观看 | 狂野欧美激情性xxxx欧美 | 成人在线观看你懂的 | 天天爽天天爽天天爽 | 日日日日| 国产在线观 | 天天玩夜夜操 | 91在线视频在线观看 | 国产资源在线免费观看 | 91麻豆精品国产91久久久无限制版 | 久久久久久精 | a久久免费视频 | 免费视频你懂得 | 中文字幕乱码电影 | 一区二区在线不卡 | 在线观看韩国av | 国产精品一区二区久久 | 中文字幕人成人 | 日日躁天天躁 | 日本美女xx | 亚洲国产三级在线观看 | 天天艹天天爽 | 天天搞天天干天天色 | 国产精品 日韩精品 | 日韩免费在线观看网站 | 国产一区高清在线观看 | 久久一区二区三区日韩 | 婷婷丁香国产 | 国产精品一区二区久久精品爱微奶 | 日韩欧美在线视频一区二区三区 | 亚洲精品高清一区二区三区四区 | 中文字幕丝袜制服 | 成人免费视频网 | 中国一级片在线观看 | 91在线观看视频 | 男女全黄一级一级高潮免费看 | 久草在 | 日精品| 国产午夜精品免费一区二区三区视频 | 成人免费在线观看入口 | 黄色软件在线看 | 国产不卡在线观看视频 | 婷婷丁香色 | 一区二区视频免费在线观看 | 欧美一二三区在线观看 | 中文字幕在线免费观看视频 | 亚洲理论片在线观看 | 三级黄色在线 | 亚洲精品tv久久久久久久久久 | 久久成人麻豆午夜电影 | 97人人添人澡人人爽超碰动图 | 丁香九月婷婷 | 在线高清一区 | 成人一级电影在线观看 | 国产精品嫩草影院9 | 夜夜躁日日躁狠狠躁 | 精品一区二区在线播放 | 日日夜夜精品免费视频 | 涩涩资源网 | 久久爽久久爽久久av东京爽 | 久久99久久久久 | 亚洲精品一区二区三区新线路 | 欧美激情视频一二区 | 欧美视频日韩 | 69精品在线| x99av成人免费 | 久久成人一区二区 | 久久久久久亚洲精品 | 中文字幕在线视频一区二区 | av在线中文 | 欧美日韩免费观看一区二区三区 | 精品视频不卡 | 亚洲精品网址在线观看 | 黄色av影视 | 色综合久久天天 | 最近在线中文字幕 | 人人爽人人舔 | 国产亚洲精品中文字幕 | 国产精品扒开做爽爽的视频 | www.夜夜爱 | 操操色| 97小视频 | 中文字幕色网站 | 少妇bbb搡bbbb搡bbbb′ | 中文字幕观看视频 | 超碰97人人在线 | 欧美日韩在线精品 | 国产精品色 | 夜色.com | 中文字幕av网站 | 欧美日韩免费一区 | 国产精品9999久久久久仙踪林 | 最新极品jizzhd欧美 | 久久国产美女视频 | 久久99精品热在线观看 | 最新国产精品亚洲 | 亚洲精品动漫久久久久 | 国产91精品久久久久久 | 在线日韩中文字幕 | 国产精品成久久久久 | 免费高清在线一区 | 国产成人精品福利 | 91传媒激情理伦片 | 国产精品99久久久久久久久久久久 | 日韩精品第1页 | 免费男女羞羞的视频网站中文字幕 | 成人亚洲精品久久久久 | 婷婷综合成人 | 999成人国产 | 69av在线视频| 久久综合色播五月 | 久久免费播放视频 | 欧美天天干 | 久久69精品| 波多野结衣一区三区 | 亚洲精品字幕 | 日韩一区二区三区在线观看 | 狠狠五月婷婷 | 最新国产视频 | 亚洲精品视频在线观看网站 | 夜夜狠狠 | 日韩视频免费看 | 久草在线视频免费资源观看 | www免费 | 精品免费一区二区三区 | 国产在线国偷精品产拍免费yy | 亚在线播放中文视频 | 日韩理论片 | 91视频免费看片 | 精品高清美女精品国产区 | 亚洲一区二区精品在线 | 2023国产精品自产拍在线观看 | 亚洲综合视频在线播放 | 国产一区二区在线免费 | 国产欧美综合在线观看 | 一区二区三区日韩在线观看 | www.国产在线视频 | 色综合久久久久久久久五月 | 国产成人精品福利 | 亚洲一区二区三区在线看 | 日韩免费久久 | 亚洲最新视频在线播放 | 五月婷婷视频 | 91麻豆.com| 伊人五月综合 | 色综合咪咪久久网 | 中文字幕乱码亚洲精品一区 | 天天色天天射天天干 | 四虎永久国产精品 | 日韩高清在线不卡 | 麻豆视频www | 精品伊人久久久 | 久久久久久久久黄色 | 中文字幕2021 | 在线观看91精品视频 | 91麻豆免费看 | 激情网第四色 | 九九免费在线视频 | 国产剧情一区二区 | 中文字幕日韩伦理 | 国产精品久久久久久久久婷婷 | av高清网站在线观看 | av日韩av| 成人在线观看影院 | 国产一区91| 99精品偷拍视频一区二区三区 | 欧美日韩精品在线一区二区 | 天天草综合| 亚洲综合成人婷婷小说 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产探花在线看 | 成人av在线直播 | 欧美日韩激情视频8区 | 国产特级毛片aaaaaaa高清 | 五月婷婷综合在线视频 | 五月婷婷一区二区三区 | 青青草视频精品 | 欧美婷婷色 | 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美日韩国产综合一区二区 | 中文字幕在线免费播放 | 91成人网在线| 久久综合九色综合网站 | 国产一区二区在线播放视频 | 91中文字幕在线观看 | 亚洲欧美在线视频免费 | 欧美激情亚洲综合 | 98久9在线 | 免费 | 欧美日韩国产在线精品 | 久久手机看片 | 天天碰天天操视频 | 啪啪免费视频网站 | 91香蕉久久| 久久久久久久久久久久久9999 | 夜夜躁狠狠躁日日躁视频黑人 | 久久国产精品系列 | 色a网| 欧美日韩高清 | 美女视频a美女大全免费下载蜜臀 | 午夜精品福利一区二区三区蜜桃 | 国产明星视频三级a三级点| 精品视频在线看 | 999成人网 | 午夜在线日韩 | 国产视频精品在线 | 久操视频在线观看 | 成人免费色 | 亚洲精品www久久久久久 | 亚洲精品18p | 国产美女黄网站免费 | 99精品福利 | 在线看中文字幕 | av在线电影网站 | 在线欧美最极品的av | 免费看黄色大全 | 久久精品首页 | 婷婷丁香五 | 综合国产在线 | 久久综合九色综合欧美狠狠 | 成全在线视频免费观看 | av亚洲产国偷v产偷v自拍小说 | 99热在线网站 | 91av成人 | 狠狠操狠狠干天天操 | 97小视频 | 9在线观看免费高清完整版在线观看明 | 国产一区二区在线免费 | 免费黄色在线 | 亚洲区色 | 久久久精品在线观看 | 日韩av播放在线 | 99久久精品无免国产免费 | 免费看黄色小说的网站 | 黄色免费在线视频 | 久久五月婷婷综合 | 波多野结衣在线观看视频 | 日韩欧美成 | 免费av的网站 | 久久久久久蜜桃一区二区 | 五月天中文在线 | 色婷婷久久久综合中文字幕 | 丰满少妇一级 | www色av| 色丁香久久 | 成人av资源在线 | 91精品久久久久久综合五月天 | 在线 国产 日韩 | 一区二区国产精品 | 久久国产欧美日韩 | 久久伊人热 | 黄色成人影院 | 久久精品网站视频 | 最近中文字幕mv | 精品久久久久国产 | 婷婷丁香色| 色噜噜噜 | 激情开心站 | 欧美 激情 国产 91 在线 | 日本激情视频中文字幕 | 亚洲草视频 | 一级成人网| 午夜精品视频一区 | 国产在线精品视频 | 成人h动漫在线看 | 国产性天天综合网 | 久久天| 精品中文字幕在线播放 | 最新精品视频在线 | 婷婷5月色 | 欧美日本在线视频 | 日韩欧美黄色网址 | 日韩亚洲国产中文字幕 | 久久久久伦理电影 | 婷婷六月综合网 | 国产色在线观看 | 国产精品高潮呻吟久久av无 | 亚洲精品国产精品国自 | 中文字幕最新精品 | 中文字幕91视频 | 91激情在线视频 | av电影免费在线看 | 特级免费毛片 | 精品欧美日韩 | 国产区精品| 久久精品福利 | 97在线观看视频国产 | 天天摸日日摸人人看 | 香蕉视频在线视频 | 欧美a级片免费看 | 夜夜干天天操 | 国产视频亚洲视频 | 亚洲欧美视屏 | 综合久久网 | 日韩精品观看 | av中文字幕免费在线观看 | 四虎最新入口 | 九九免费在线视频 | 波多野结衣视频一区二区三区 | 韩国av一区二区 | 免费日韩 精品中文字幕视频在线 | 五月天久久激情 | 日本中出在线观看 | 夜夜躁天天躁很躁波 | 成人作爱视频 | 一区二区三区四区五区在线 | 久久精品久久久久电影 | 色姑娘综合天天 | 精品国产一区二 | 亚洲精品久久久久中文字幕二区 | 日韩中文字幕在线看 | 99精品黄色片免费大全 | 免费看片亚洲 | 人人爽人人搞 | 国产精品电影一区二区 | 韩国av免费在线 | 国产一区网址 | 日韩国产精品一区 | 日韩欧美视频一区二区 | 久久免费的精品国产v∧ | 久久久五月天 | 久久永久免费视频 | 91九色视频观看 | 五月激情丁香婷婷 | 午夜精品久久久久久久99 | 99精品视频在线观看免费 | 久久 精品一区 | 国内免费的中文字幕 | 天天射天天操天天色 | 一区二区三区久久 | 欧美日韩一区二区视频在线观看 | 999久久久久久久久 69av视频在线观看 | 黄色成人av | 亚洲视频 在线观看 | 欧美成年黄网站色视频 | 欧美久久久久久久久久久久久 | 4438全国亚洲精品在线观看视频 | 在线观看91视频 | 亚洲精品综合在线观看 | 国产四虎影院 | 精品一区中文字幕 | 成年人在线免费看视频 | 在线中文字幕观看 | 四虎国产永久在线精品 | 99久久毛片 | 中文字幕一区二区三区久久蜜桃 | 久久国语露脸国产精品电影 | 狠狠五月婷婷 | 亚洲欧美经典 | 视频一区在线免费观看 | 久在线 | 天天综合色 | 国产伦精品一区二区三区高清 | 欧美一级高清片 | 黄色大片日本 | 天天干夜夜操视频 | 一区二区三区免费在线播放 | 成人三级网站在线观看 | 日韩精品中文字幕在线播放 | 九九日九九操 | 午夜免费视频网站 | 国产精品久久综合 | 一区 在线观看 | 蜜桃传媒一区二区 | 日韩中文字幕视频在线观看 | 狠狠操影视 | 亚洲成人av片在线观看 | 精品女同一区二区三区在线观看 | 欧美一级专区免费大片 | 国产在线97| 亚洲国产成人久久综合 | 亚欧洲精品视频在线观看 | 日韩精品一区二区免费视频 | 久久久久成人精品免费播放动漫 | 亚洲精品777| 欧美三人交 | 久久亚洲成人网 | 久久在线精品 | 国产色区 | 欧美有色 | 久久婷婷色 | 欧美va电影 | 色国产精品一区在线观看 | 中文字幕一区二区三 | 91中文字幕网 | 韩日电影在线 | 草久视频在线 | 一区二区 不卡 | 亚洲国产精品成人va在线观看 | 97精品国产手机 | 五月婷香蕉久色在线看 | 涩涩色亚洲一区 | 国产伦精品一区二区三区高清 | 天天色天天 | 亚洲一区美女视频在线观看免费 | 伊人婷婷 | av网址最新 | 日韩激情片在线观看 | 精品国产一区二区三区在线 | 在线观看国产一区二区 | 二区在线播放 | 久久好看免费视频 | 日韩在线观看第一页 | 日韩免费专区 | av片子在线观看 | av丝袜在线 | 99精品国产福利在线观看免费 | 日日日日 | 国产 日韩 欧美 中文 在线播放 | 国产午夜精品一区二区三区 | 色天堂在线视频 | 丁香五婷 | 国产精品久久久久久久久搜平片 | 天天射射天天 | 毛片视频网址 | 免费在线电影网址大全 | 精品自拍网 | 亚洲成人精品 | 亚洲精品国产精品国自产 | 日韩小视频 | 高清不卡免费视频 | 成人黄色片免费 | 天天爱天天色 | 日韩在线免费看 | 国产乱码精品一区二区蜜臀 | 日本黄区免费视频观看 | 精品视频免费看 | 91免费网| 久久久国产精品人人片99精片欧美一 | 欧美成人精品欧美一级乱黄 | 亚洲精品在线视频网站 | 亚洲黄色免费 | 黄色免费视频在线观看 | 国产又黄又爽无遮挡 | 国产人成精品一区二区三 | 久久久久久久久久影视 | av免费福利 | 日韩电影在线一区二区 | 最近中文字幕在线 | 日韩在线观看视频一区二区三区 | 99 色 | 国产精品v欧美精品 | 国产精品麻豆免费版 | 国产福利中文字幕 | 99精品欧美一区二区三区 | 日韩免费av网址 | 成 人 黄 色 视频免费播放 | 欧美成年人在线视频 | 日韩av午夜 | 国产不卡精品 | 国产精品久久久久久久久久直播 | 国产视频二| 亚洲欧美视频网站 | 91av在线视频播放 | 国产淫片| 五月天亚洲综合小说网 | 综合色站导航 | 99精品国产99久久久久久97 | 精品久久久免费视频 | 国产免费黄视频在线观看 | 国产伦理久久精品久久久久_ | 五月婷婷网站 | 99精品在线视频播放 | 香蕉视频在线观看免费 | 欧美日韩久久一区 | 中文字幕在线视频一区二区 | 国产在线成人 | 91精品国产麻豆 | 国产不卡在线 | 日韩电影在线观看一区二区三区 | 精品在线免费视频 | 不卡av电影在线 | 国产精品成人在线观看 | 日本大尺码专区mv | 久久综合久久综合这里只有精品 | 国产一区二区手机在线观看 | avav99| 99久久久久免费精品国产 | 99视频在线播放 | 一区二区三区电影 | 狠狠躁天天躁综合网 | 中文字幕一区二区三区四区久久 | 天天操比| 黄色毛片视频 | 超碰人人做 | 国产精品第10页 | 激情丁香 | 一级欧美一级日韩 | 欧美一级性生活片 | 日日天天干 | 国产精品免费一区二区 | 天天操天天摸天天爽 | 91视频久久久久久 | 亚洲精品网页 | 成人免费视频免费观看 | 99在线高清视频在线播放 | 伊人久久一区 | 欧美一级日韩三级 | 久久国产精品视频观看 | 99国产精品视频免费观看一公开 | 精品久久久免费视频 | 六月色播 | 久久精品综合 | www好男人| 国产免费视频一区二区裸体 | 超碰大片| 日韩在线免费不卡 | 激情综合网天天干 | 992tv在线观看网站 | 97超碰人人澡人人爱学生 | 激情综合网天天干 | 欧美日韩成人一区 | 韩国一区二区av | 久久首页| 国产视频精选 | 中文在线字幕免费观看 | 欧美日韩激情视频8区 | 免费av试看| 免费在线观看一区二区三区 | 欧美日韩性视频 | 99午夜| 又黄又爽又湿又无遮挡的在线视频 | 国产午夜精品在线 | 日本黄色免费在线观看 | 精品国产一区二区三区在线观看 | 欧美性精品 | 国产精品一区二区三区在线看 | 一级片黄色片网站 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 又黄又爽又无遮挡的视频 | 国产精品原创av片国产免费 | 日韩精品中文字幕在线不卡尤物 | 久久99国产一区二区三区 | 91精品一区二区三区蜜臀 | 天天狠狠| 亚洲dvd | av网站在线观看免费 | 欧美精品久久久久久久久老牛影院 | 久久精品站 | 91精品成人久久 | 不卡视频在线 | 久久草网| 国产中文在线播放 | 狠狠的日 | 国产 视频 久久 | 九九免费精品 | 久久久久国产视频 | 中文字幕有码在线播放 | 国产一区二区三区免费在线观看 | av高清一区二区三区 | 久久精品亚洲 | 91丨九色丨高潮 | 一级黄色片在线免费观看 | 国产一级黄大片 | 激情丁香综合 | 5月丁香婷婷综合 | 有码中文字幕在线观看 | 欧美黄网站 | av福利网址导航 | 少妇按摩av | 日韩av在线高清 | 亚洲欧洲国产视频 | 婷婷在线观看视频 | 久章操| av福利在线 | 国产高清免费视频 | 黄色三级免费观看 | 欧美日本不卡高清 | 四虎在线免费观看 | 在线 国产一区 | 色94色欧美| 精品亚洲免a | 在线精品亚洲一区二区 | 久久久国产精品网站 | 91电影福利| 超碰资源在线 | 五月在线 | wwwav视频| 日韩av在线免费播放 | 激情视频免费在线 | 亚洲尺码电影av久久 | 天天操天天摸天天干 | 在线视频 精品 | 婷婷亚洲激情 | av福利第一导航 | 亚洲免费av电影 | 色偷偷网站视频 | av免费在线观 | 探花视频在线观看 | 亚洲精品久久久久久久不卡四虎 | 正在播放五月婷婷狠狠干 | 91精品久久香蕉国产线看观看 | 97精品国自产拍在线观看 | a视频在线 | 808电影免费观看三年 | 欧美一区二区在线免费看 | 亚洲精品中文在线 | 久久中文字幕导航 | www国产亚洲精品久久网站 | 色欧美成人精品a∨在线观看 | 综合久久精品 | 国产精品久久久久久久久婷婷 | 99精品国产在热久久 | 2024国产精品视频 | 日韩精品一区二区三区在线播放 | 午夜精品久久久久久久久久久久久久 | 中文字幕91| 美女视频黄免费 | 亚洲码国产日韩欧美高潮在线播放 | 中文字幕中文中文字幕 | 99热网站| av中文字幕在线观看网站 | 91在线观看视频 | 久久色亚洲 | 国产盗摄精品一区二区 | 亚洲在线免费视频 | 黄色三级免费观看 | 色婷婷综合激情 | 日韩在线观看网址 | 在线a亚洲视频播放在线观看 | 黄色成人在线 | 亚洲国产97在线精品一区 | 国产精品精品久久久久久 | 国产精品毛片久久久久久久久久99999999 | 国产精品18久久久久久久久久久久 | 久久的色 | 久久免费高清视频 | 日本久久精品 | 欧美午夜久久久 | 人人舔人人插 | 亚洲精品美女 | 久久亚洲私人国产精品va | 日韩有码专区 | 91免费视频网站在线观看 | 久久美女高清视频 | 天天爽天天爽 | 成 人 a v天堂 | 97成人资源| 国产99久久久国产精品免费看 | 日韩经典一区二区三区 | 少妇自拍av | 国产精品va最新国产精品视频 | wwxxxx日本 | 久久a国产 | 日韩成人欧美 | 狠狠撸电影 | 日韩高清成人在线 | 国产超碰97 | 在线一二区 | 国产视频久 | 亚洲伦理一区二区 | 久久福利国产 | 丁香影院在线 | 国内精品一区二区 | 精品一区二区三区久久 | 四虎成人精品永久免费av | 男女日麻批| 人人爽人人爽人人片 | 欧美亚洲成人xxx | 国产精品一区二区av麻豆 | 992tv又爽又黄的免费视频 | 最近免费在线观看 | 五月香视频在线观看 | 亚洲国产中文在线 | 特级免费毛片 | 成人在线观看你懂的 | 日精品在线观看 | 免费中文字幕在线观看 | 不卡精品 | www亚洲国产| 不卡av电影在线观看 | 中文字幕在线免费观看 | 91视频麻豆| 在线免费国产视频 | 91精品免费在线 | 日韩免费不卡av | 91精品久久久久久久久久入口 | 国产99一区视频免费 | 日韩羞羞 | 欧美一区日韩一区 | 久久久视频在线 | 久久午夜视频 | 亚洲在线观看av | 国产理伦在线 | 99热这里有| 日本最新高清不卡中文字幕 | 国产一区自拍视频 | 国产黄色片免费在线观看 | 操处女逼| 久草资源在线观看 | 精品成人国产 | 国产精品字幕 | 亚洲乱码在线观看 | a成人v在线| 中文字幕在线观看第一页 | 国产 欧美 日产久久 | 制服丝袜一区二区 | 91视频高清免费 | 精品久久久久久久久久久久 | av视屏在线播放 | 日韩视频 一区 | 久久午夜剧场 | 日韩在线国产精品 | 干干夜夜 | 激情久久久久久久久久久久久久久久 | 久黄色| 国产精品白浆 | 精品视频999 | 狠狠操操操| 免费在线观看不卡av | 成年人三级网站 | 欧美国产日韩一区二区三区 | 日日夜夜人人天天 | 国产精品麻豆欧美日韩ww | 色五月成人| 久久精品男人的天堂 | 在线观看av黄色 | 日韩素人在线观看 | 九九九热精品免费视频观看网站 | 国内小视频在线观看 | 久久免费精彩视频 | 国产精品久久久久久久久毛片 | www黄色com| 人人干人人做 | www.在线看片.com | 蜜臀久久99静品久久久久久 | 免费观看的黄色片 | 91丨九色丨高潮丰满 | 亚洲欧洲国产日韩精品 | 久久精品视频一 | 国产精品嫩草影视久久久 | 欧美少妇影院 | 国产在线一区二区三区播放 | 性色av免费观看 | 婷婷精品在线视频 | 人人干人人草 | 美女久久久久久久 | 亚洲精品综合一区二区 | 97在线观看免费观看高清 | 亚洲性xxxx | 国产网站色 | 亚洲欧洲精品久久 | 天天看天天干 | 一本大道久久精品懂色aⅴ 五月婷社区 | 久久国产精品99久久久久久进口 | 99免费在线观看视频 | 中文字幕亚洲欧美 | 久久精品久久久久久久 | 一级黄色片在线 | 十八岁免进欧美 | 丁香电影小说免费视频观看 | 五月花激情 | 在线观看国产麻豆 | 亚洲一区美女视频在线观看免费 | 中文国产字幕 | 国产91精品看黄网站在线观看动漫 | 日韩视频图片 | 亚洲欧美精品在线 | 亚洲国产经典视频 | 黄色毛片电影 | 日韩欧美在线免费观看 | 日本黄色免费播放 | 中文字幕视频在线播放 | 国产资源av | 久久免费大片 | 九九热精品视频在线观看 | 天堂av高清| 亚洲电影成人 | 日韩专区一区二区 | 国产亚洲精品日韩在线tv黄 | 99热超碰在线 | 亚洲欧美日韩不卡 | 国产一级在线 | 亚洲成人国产精品 | 99精品一区二区三区 | 国产精品理论片在线播放 | 久久99热这里只有精品 | 国产精品免费久久久久久久久久中文 | 日韩网站视频 | 久久综合射 | 99操视频| 天天操 夜夜操 | 丁香在线观看完整电影视频 | 欧美一二区在线 | 亚洲电影一区二区 | 日韩精品 在线视频 | 国产91九色视频 | 婷婷 中文字幕 | 在线午夜| 国外调教视频网站 | 麻豆传媒视频观看 | 人人澡人人澡人人 | 天天操夜夜拍 | 97人人超碰在线 | 久草免费在线视频观看 | a色视频| 四虎www. | 久久亚洲精品电影 | 国产在线色 | 久久你懂得 | 国产不卡免费av | 久久国产精品99久久久久久老狼 | 国产精品久久久久久久久大全 | 国产精品免费人成网站 | 在线免费观看的av | 在线黄色观看 | 日韩激情av在线 | 波多野结衣在线视频免费观看 | 欧美激情在线看 | 国产亚洲婷婷免费 | 九九九电影免费看 | 免费福利小视频 | 永久av免费在线观看 | 日日天天干 | 91最新视频在线观看 | 婷婷丁香自拍 | 中文区中文字幕免费看 | 亚洲美女在线一区 | 国产日韩在线一区 | 超碰97公开 | 国产精品99精品久久免费 | 中文在线中文a | 91精选在线观看 | 丁香影院在线 | 丁香五月网久久综合 | jizz欧美性9 国产一区高清在线观看 | 国产精品国产三级国产专区53 | 久久婷综合| 操少妇视频 | 久久精品99国产 | 日本免费一二三区 | 日韩一区二区免费在线观看 | 国内精品久久天天躁人人爽 | 日韩字幕 | 草久在线视频 | 手机成人av | 91免费观看视频网站 | 97人人视频 | 99热九九这里只有精品10 | 欧美色综合 | 999电影免费在线观看2020 | 奇米影视8888 | 香蕉精品视频在线观看 | 9幺看片| 久久区二区 | 激情综合五月婷婷 | 欧美极度另类性三渗透 | 免费看黄色毛片 | 99久久婷婷国产一区二区三区 | 97视频一区 | 人人超碰97| 日韩精品一区二区三区中文字幕 | 久久97久久97精品免视看 | av夜夜操 | 国产精品久久久久久久久久白浆 | 99麻豆久久久国产精品免费 | 丝袜网站在线观看 | 精品麻豆入口免费 | 麻豆国产精品视频 | 久艹在线观看视频 | 午夜精品剧场 | 国产成年人av | 日日麻批40分钟视频免费观看 | 久久中文网 | 亚洲一区视频免费观看 | 欧美一区二区三区在线视频观看 | 色婷婷狠狠干 | 成人午夜电影免费在线观看 | 在线探花 | 亚洲女同ⅹxx女同tv | 日韩欧美大片免费观看 | 激情欧美一区二区三区免费看 | www.五月婷婷.com | 午夜精品久久久久久久久久久 | 在线观看亚洲成人 | 在线91网 | 毛片区| 麻豆视频在线免费观看 | 天天干,天天操,天天射 | 国产日韩欧美在线播放 | 婷婷六月网 | 免费看十八岁美女 | 国产麻豆视频在线观看 | 天天操天天艹 | 久久久天天操 | 玖玖精品视频 | 日韩av电影一区 | 欧美在线视频二区 | 久久少妇 | 国产黄色在线观看 | 欧美日韩中文字幕综合视频 | 免费观看mv大片高清 | 综合久久久久 | 中文字幕免费观看视频 | 日韩精品在线观看av | 日韩二区精品 | 久久久精品网 | 精品欧美一区二区精品久久 | 蜜臀久久99精品久久久无需会员 | bbw av| 黄色一级片视频 | 日韩精品免费一线在线观看 | 亚洲第一香蕉视频 | 亚洲精品久久久久中文字幕二区 | 天天操天天透 | 国产色婷婷在线 | 久久最新视频 | 日日干夜夜爱 | 久久久国际精品 | 国产精品二区在线 | 草莓视频在线观看免费观看 | 在线国产欧美 | 国产小视频你懂的在线 | 干天天 | 久久婷婷开心 | 中文字幕欲求不满 | 日韩一级黄色大片 | 日韩欧美一区二区在线 | 亚洲在线视频网站 | 九九精品毛片 | 久久网站免费 | 久久精选视频 | 成人毛片100免费观看 | 国产不卡av在线播放 | 欧美日韩国产网站 | 久久97精品 | 91在线超碰 | 日韩久久久久久久久久久久 | 日韩在线电影一区 | 亚洲 中文 欧美 日韩vr 在线 | 亚洲国产中文在线 | 99 色 | 精品国产亚洲日本 | 精品亚洲视频在线观看 | 激情五月av | 久久刺激视频 | 岛国av在线不卡 | 在线观看成人网 | 精品黄色在线观看 | 免费日韩精品 | 久久精品2 | 久草免费福利在线观看 | 日本精品一区二区三区在线播放视频 |