• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            asm, c, c++ are my all
            -- Core In Computer
            posts - 139,  comments - 123,  trackbacks - 0
            ?[轉(zhuǎn)] C++的iostream標(biāo)準庫介紹

            0 為什么需要iostream

              我們從一開始就一直在利用C++的輸入輸出在做著各種練習(xí),輸入輸出是由iostream庫提供的,所以討論此標(biāo)準庫是有必要的,它與C語言的 stdio庫不同,它從一開始就是用多重繼承與虛擬繼承實現(xiàn)的面向?qū)ο蟮膶哟谓Y(jié)構(gòu),作為一個c++的標(biāo)準庫組件提供給程序員使用。

              iostream為內(nèi)置類型對象提供了輸入輸出支持,同時也支持文件的輸入輸出,類的設(shè)計者可以通過對iostream庫的擴展,來支持自定義類型的輸入輸出操作。

              為什么說要擴展才能提供支持呢?我們來一個示例。

            						#include <stdio.h> 
            #include <iostream> 
            usingnamespace std;     
            
            class Test 
            { 
                    public: 
                    Test(int a=0,int b=0) 
                    { 
                            Test::a=a; 
                            Test::b=b; 
                    } 
                    int a; 
                    int b; 
            }; 
            int main() 
            { 
                    Test t(100,50); 
                    printf("%???",t);//不明確的輸出格式 
                    scanf("%???",t);//不明確的輸入格式 
                    cout<<t<<endl;//同樣不夠明確 
                    cin>>t;//同樣不夠明確 
                    system("pause"); 
            }
            ?  由于自定義類的特殊性,在上面的代碼中,無論你使用c風(fēng)格的輸入輸出,或者

            是c++的輸入輸出都不是不明確的一個表示,由于c語言沒有運算符重載機制,導(dǎo)致

            stdio庫的不可擴充性,讓我們無法讓printf()和scanf()支持對自定義類對象的

            擴充識別,而c++是可以通過運算符重載機制擴充 iostream庫的,使系統(tǒng)能能夠識

            別自定義類型,從而讓輸入輸出明確的知道他們該干什么,格式是什么。

              在上例中我們之所以用printf與cout進行對比目的是為了告訴大家,C與C++處理輸入輸出的根本不同,我們從c遠的輸入輸出可以很明顯看出是函數(shù)調(diào)用方式,而c++的則是對象模式,cout和cin是ostream類和istream類的對象。

            1 iostream: istream 和 ostream

              C++中的iostream庫主要包含下圖所示的幾個頭文件:

            IOSstream 庫
            fstream iomainip
            ios iosfwd
            iostream istream
            ostream sstream
            streambuf strstream

              我們所熟悉的輸入輸出操作分別是由istream(輸入流)和ostream(輸出流)這兩個類提供的,為了允許雙向的輸入/輸出,由istream和ostream派生出了iostream類。

              類的繼承關(guān)系見下圖:

            iostream庫定義了以下三個標(biāo)準流對象:

            1. cin,表示標(biāo)準輸入(standard input)的istream類對象。cin使我們可以從設(shè)備讀入數(shù)據(jù)。
            2. cout,表示標(biāo)準輸出(standard output)的ostream類對象。cout使我們可以向設(shè)備輸出或者寫數(shù)據(jù)。
            3. cerr,表示標(biāo)準錯誤(standard error)的osttream類對象。cerr是導(dǎo)出程序錯誤消息的地方,它只能允許向屏幕設(shè)備寫數(shù)據(jù)。

              輸出主要由重載的左移操作符(<<)來完成,輸入主要由重載的右移操作符(>>)完成:

            1. >>a表示將數(shù)據(jù)放入a對象中。
            2. <<a表示將a對象中存儲的數(shù)據(jù)拿出。

              這些標(biāo)準的流對象都有默認的所對應(yīng)的設(shè)備,見下表:
            ?

            C++對象名 設(shè)備名稱 C中標(biāo)準設(shè)備名 默認含義
            cin 鍵盤 stdin 標(biāo)準輸入
            cout 顯示器屏幕 stdout 標(biāo)準輸出
            cerr 顯示器屏幕 stderr 標(biāo)準錯誤輸出

              上表中的意思表明cin對象的默認輸入設(shè)備是鍵盤,cout對象的默認輸出設(shè)備是顯示器屏幕。

              那么原理上C++有是如何利用cin/cout對象與左移和右移運算符重載來實現(xiàn)輸入輸出的呢?

              下面我們以輸出為例,說明其實現(xiàn)原理:

            1. cout是ostream類的對象,因為它所指向的是標(biāo)準設(shè)備(顯示器屏幕),所以它在iostream頭文件中作為全局對象進行定義。
            2. ostream cout(stdout);//其默認指向的C中的標(biāo)準設(shè)備名,作為其構(gòu)造函數(shù)的參數(shù)使用。
            3. 在iostream.h頭文件中,ostream類對應(yīng)每個基本數(shù)據(jù)類型都有其友元函數(shù)對左移操作符進行了友元函數(shù)的重載。
              • ostream& operator<<(ostream &temp,int source);
              • ostream& operator<<(ostream &temp,char *ps);
              • ... 等等

              一句輸出語句:cout<<"http://www.shnenglu.com/andxie99";,事實上調(diào)用的就是ostream& operator<<(ostream &temp,char *ps);這個運算符重載函數(shù),由于返回的是流對象的引用,引用可以作為左值使用,所以當(dāng)程序中有類似cout<<"http://www.shnenglu.com/andxie99"<<"白紙人生";這樣的語句出現(xiàn)的時候,就能夠構(gòu)成連續(xù)輸出。

              由于iostream庫不光支持對象的輸入輸出,同時也支持文件流的輸入輸出,所以在詳細講解左移與右移運算符重載只前,我們有必要先對文件的輸入輸出以及輸入輸出的控制符有所了解。

            2 fstream: ifstream 和 ofstream

              和文件有關(guān)系的輸入輸出類主要在fstream.h這個頭文件中被定義,在這個頭文件中主要被定義了三個類,由這三個類控制對文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來,他們之間的繼承關(guān)系見下圖所示。

            由于文件設(shè)備并不像顯示器屏幕與鍵盤那樣是標(biāo)準默認設(shè)備,所以它在fstream.h頭文件中是沒有像cout那樣預(yù)先定義的全局對象,所以我們必須自己定義一個該類的對象,我們要以文件作為設(shè)備向文件輸出信息(也就是向文件寫數(shù)據(jù)),那么就應(yīng)該使用ofstream類。

              ofstream類的默認構(gòu)造函數(shù)原形為:

              ofstream::ofstream(constchar *filename,int mode = ios::out,int openprot = filebuf::openprot);
            • filename:  要打開的文件名
            • mode:    要打開文件的方式
            • prot:    打開文件的屬性

              其中mode和openprot這兩個參數(shù)的可選項表見下表:

            mode屬性表
            ios::app 以追加的方式打開文件
            ios::ate 文件打開后定位到文件尾,ios:app就包含有此屬性
            ios::binary 以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區(qū)別見前文
            ios::in 文件以輸入方式打開
            ios::out 文件以輸出方式打開
            ios::trunc 如果文件存在,把文件長度設(shè)為0

              可以用“或”把以上屬性連接起來,如ios::out|ios::binary。

            openprot屬性表
            屬性 含義
            0 普通文件,打開訪問
            1 只讀文件
            2 隱含文件
            4 系統(tǒng)文件

              可以用“或”或者“+”把以上屬性連接起來 ,如3或1|2就是以只讀和隱含屬性打開文件。

            實例代碼如下:

            						#include <fstream> 
            usingnamespace std; 
            
            int main()  
            { 
                    ofstream myfile("c:\\1.txt",ios::out|ios::trunc,0); 
                    myfile<<"白紙人生"<<endl<<"網(wǎng)址:"<<"www.shnenglu.com/andxie99"; 
                    myfile.close() 
                    system("pause"); 
            }

              文件使用完后可以使用close成員函數(shù)關(guān)閉文件。

              ios::app為追加模式,在使用追加模式的時候同時進行文件狀態(tài)的判斷是一個比較好的習(xí)慣。

              示例如下:

            						#include <iostream> 
            #include <fstream> 
            usingnamespace std; 
            int main()  
            { 
                    ofstream myfile("c:\\1.txt",ios::app,0); 
                    if(!myfile)//或者寫成myfile.fail() 
                    { 
                            cout<<"文件打開失敗,目標(biāo)文件狀態(tài)可能為只讀!"; 
                            system("pause"); 
                            exit(1); 
                    } 
                    myfile<<"白紙人生"<<endl<<"網(wǎng)址:"<<"www.shnenglu.com/andxie99"<<endl; 
                    myfile.close(); 
            }











              在定義ifstream和ofstream類對象的時候,我們也可以不指定文件。以后可以

            通過成員函數(shù)open()顯式的把一個文件連接到一個類對象上。

              例如:

            						#include <iostream> 
            #include <fstream> 
            usingnamespace std; 
            int main()  
            { 
                    ofstream myfile; 
                    myfile.open("c:\\1.txt",ios::out|ios::app,0); 
                    if(!myfile)//或者寫成myfile.fail() 
                    { 
                            cout<<"文件創(chuàng)建失敗,磁盤不可寫或者文件為只讀!"; 
                            system("pause"); 
                            exit(1); 
                    } 
                    myfile<<"白紙人生"<<endl<<"網(wǎng)址:"<<"www.shnenglu.com/andxie99"<<endl; 
                    myfile.close(); 
            }

              下面我們來看一下是如何利用ifstream類對象,將文件中的數(shù)據(jù)讀取出來,然后再輸出到標(biāo)準設(shè)備中的例子。

              代碼如下:

            						#include <iostream> 
            #include <fstream> 
            #include <string> 
            usingnamespace std; 
            int main()  
            { 
                    ifstream myfile; 
                    myfile.open("c:\\1.txt",ios::in,0); 
                    if(!myfile) 
                    { 
                            cout<<"文件讀錯誤"; 
                            system("pause"); 
                            exit(1); 
                    } 
                    char ch; 
                    string content; 
                    while(myfile.get(ch)) 
                    { 
                            content+=ch; 
                            cout.put(ch);//cout<<ch;這么寫也是可以的 
                    } 
                    myfile.close(); 
                    cout<<content; 
                    system("pause"); 
            }

              上例中,我們利用成員函數(shù)get(),逐一的讀取文件中的有效字符,再利用put()成員函數(shù),將文件中的數(shù)據(jù)通過循環(huán)逐一輸出到標(biāo)準設(shè)備(屏幕)上, get()成員函數(shù)會在文件讀到默尾的時候返回假值,所以我們可以利用它的這個特性作為while循環(huán)的終止條件,我們同時也在上例中引入了C++風(fēng)格的字符串類型string,在循環(huán)讀取的時候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。

            我們在簡單介紹過ofstream類和ifstream類后,我們再來看一下fstream類,fstream類是由iostream派生而來,fstream類對象可以同對文件進行讀寫操作。

              示例代碼如下:

            						#include <iostream> 
            #include <fstream> 
            usingnamespace std; 
            int main()  
            { 
                    fstream myfile; 
                    myfile.open("c:\\1.txt",ios::out|ios::app,0); 
                    if(!myfile) 
                    { 
                            cout<<"文件寫錯誤,文件屬性可能為只讀!"<<endl; 
                            system("pause"); 
                            exit(1); 
                    } 
                    myfile<<"白紙人生"<<endl<<"網(wǎng)址:"<<"www.shnenglu.com/andxie99"<<endl;   
                    myfile.close(); 
                    
                    myfile.open("c:\\1.txt",ios::in,0); 
                    if(!myfile) 
                    { 
                            cout<<"文件讀錯誤,文件可能丟失!"<<endl; 
                            system("pause"); 
                            exit(1); 
                    } 
                    char ch; 
                    while(myfile.get(ch)) 
                    { 
                            cout.put(ch); 
                    } 
                    myfile.close(); 
                    system("pause"); 
            }

              由于fstream類可以對文件同時進行讀寫操作,所以對它的對象進行初始話的時候一定要顯式的指定mode和openprot參數(shù)。

              接下來我們來學(xué)習(xí)一下串流類的基礎(chǔ)知識,什么叫串流類?

            3 strstream: ostrstream 和 istrstream

              簡單的理解就是能夠控制字符串類型對象進行輸入輸出的類,C++不光可以支持C++風(fēng)格的字符串流控制,還可以支持C風(fēng)格的字符串流控制。

              我們先看看看C++是如何對C風(fēng)格的字符串流進行控制的,C中的字符串其實也就是字符數(shù)組,字符數(shù)組內(nèi)的數(shù)據(jù)在內(nèi)存中的位置的排列是連續(xù)的,我們通常用 char str[size]或者char *str的方式聲明創(chuàng)建C風(fēng)格字符數(shù)組,為了能讓字符數(shù)組作為設(shè)備并提供輸入輸出操作,C++引入了ostrstream、istrstream、 strstream這三個類,要使用他們創(chuàng)建對象就必須包含strstream.h頭文件。

            • istrstream類用于執(zhí)行C風(fēng)格的串流的輸入操作,也就是以字符串?dāng)?shù)組作為輸入設(shè)備。
            • ostrstream類用于執(zhí)行C風(fēng)格的串流的輸出操作,也就是一字符串?dāng)?shù)組作為輸出設(shè)備。
            • strstream類同時可以支持C風(fēng)格的串流的輸入輸出操作。

              istrstream類是從istream(輸入流類)和strstreambase(字符串流基類)派生而來,ostrstream是從 ostream(輸出流類)和strstreambase(字符串流基類)派生而來,strstream則是從iostream(輸入輸出流類)和和 strstreambase(字符串流基類)派生而來。

              他們的繼承關(guān)系如下圖所示:

              串流同樣不是標(biāo)準設(shè)備,不會有預(yù)先定義好的全局對象,所以不能直接操作,需要通過構(gòu)造函數(shù)創(chuàng)建對象。

            類istrstream的構(gòu)造函數(shù)原形如下:

              istrstream::istrstream(constchar *str,int size);
            ?

              參數(shù)1表示字符串?dāng)?shù)組,而參數(shù)2表示數(shù)組大小,當(dāng)size為0時,表示istrstream類對象直接連接到由str所指向的內(nèi)存空間并以\0結(jié)尾的字符串。

              下面的示例代碼就是利用istrstream類創(chuàng)建類對象,制定流輸入設(shè)備為字符串?dāng)?shù)組,通過它向一個字符型對象輸入數(shù)據(jù)。代碼如下:

            						#include <iostream> 
            #include <strstream> 
            usingnamespace std; 
            int main()  
            { 
                    char *name = "www.shnenglu.com/andxie99"; 
                    int arraysize = strlen(name)+1; 
                    istrstream is(name,arraysize); 
                    char temp; 
                    is>>temp; 
                    cout<<temp; 
                    system("pause"); 
            }

              類ostrstream用于執(zhí)行串流的輸出,它的構(gòu)造函數(shù)如下所示:

              ostrstream::ostrstream(char *_Ptr,int streamsize,int Mode = ios::out);

              第一個參數(shù)是字符數(shù)組,第二個是說明數(shù)組的大小,第三個參數(shù)是指打開方式。

              我們來一個示例代碼:

            						#include <iostream> 
            #include <strstream> 
            usingnamespace std; 
            int main()  
            { 
                    int arraysize=1; 
                    char *pbuffer=newchar[arraysize]; 
                    ostrstream ostr(pbuffer,arraysize,ios::out); 
                    ostr<<arraysize<<ends;//使用ostrstream輸出到流對象的時候,要用ends結(jié)束字符串 
                    cout<<pbuffer; 
                    delete[] pbuffer; 
                    system("pause"); 
            }

              上面的代碼中,我們創(chuàng)建一個c風(fēng)格的串流輸出對象ostr,我們將arraysize內(nèi)的數(shù)據(jù)成功的以字符串的形式輸出到了ostr對象所指向的pbuffer指針的堆空間中,pbuffer也正是我們要輸出的字符串?dāng)?shù)組,在結(jié)尾要使用ends結(jié)束字符串,如果不這么做就有溢出的危險。

            4 stringstream

            對于stringstream了來說,不用我多說,大家也已經(jīng)知道它是用于C++風(fēng)格的字符串的輸入輸出的。  stringstream的構(gòu)造函數(shù)原形如下:

              stringstream::stringstream(string str);

              示例代碼如下:

            						#include <iostream> 
            #include <sstream> 
            #include <string> 
            usingnamespace std; 
            
            int main()  
            { 
                    stringstream ostr("ccc"); 
                    ostr.put('d'); 
                    ostr.put('e'); 
                    ostr<<"fg"; 
                    string gstr = ostr.str(); 
                    cout<<gstr<<endl; 
                    
                    char a; 
                    ostr>>a; 
                    cout<<a 
                    
                    system("pause"); 
            }

              除此而外,stringstream類的對象我們還常用它進行string與各種內(nèi)置類型數(shù)據(jù)之間的轉(zhuǎn)換。示例代碼如下:

            						#include <iostream> 
            #include <sstream> 
            #include <string> 
            usingnamespace std; 
            
            int main()  
            { 
                    stringstream sstr; 
                    //--------int轉(zhuǎn)string----------- int a=100; 
                    string str; 
                    sstr<<a; 
                    sstr>>str; 
                    cout<<str<<endl; 
                    //--------string轉(zhuǎn)char[]-------- 
                    sstr.clear();//如果你想通過使用同一stringstream對象實現(xiàn)多種類型的轉(zhuǎn)換,請注意在每一次轉(zhuǎn)換之后都必須調(diào)用clear()成員函數(shù)。 
                    string name = "colinguan"; 
                    char cname[200]; 
                    sstr<<name; 
                    sstr>>cname; 
                    cout<<cname; 
                    system("pause"); 
            }

              接下來我們來學(xué)習(xí)一下輸入/輸出的狀態(tài)標(biāo)志的相關(guān)知識.

            5 io_state 輸入/輸出的狀態(tài)標(biāo)志

            C++中負責(zé)的輸入/輸出的系統(tǒng)包括了關(guān)于每一個輸入/輸出操作的結(jié)果的記錄信息。這些當(dāng)前的狀態(tài)信息被包含在io_state類型的對象中。io_state是一個枚舉類型(就像open_mode一樣),以下便是它包含的值。

            • goodbit 無錯誤
            • Eofbit 已到達文件尾
            • failbit 非致命的輸入/輸出錯誤,可挽回
            • badbit 致命的輸入/輸出錯誤,無法挽回

            有兩種方法可以獲得輸入/輸出的狀態(tài)信息。一種方法是通過調(diào)用rdstate()函數(shù),它將返回當(dāng)前狀態(tài)的錯誤標(biāo)記。例如,假如沒有任何錯誤,則rdstate()會返回goodbit.下例示例,表示出了rdstate()的用法:

            						#include <iostream> 
            usingnamespace std; 
            
            int main()  
            { 
                    int a; 
                    cin>>a; 
                    cout<<cin.rdstate()<<endl; 
                    if(cin.rdstate() == ios::goodbit) 
                    { 
                            cout<<"輸入數(shù)據(jù)的類型正確,無錯誤!"<<endl; 
                    } 
                    if(cin.rdstate() == ios_base::failbit) 
                    { 
                            cout<<"輸入數(shù)據(jù)類型錯誤,非致命錯誤,可清除輸入緩沖區(qū)挽回!"<<endl; 
                    } 
                    system("pause"); 
            }

              另一種方法則是使用下面任何一個函數(shù)來檢測相應(yīng)的輸入/輸出狀態(tài):

            						bool bad();
            bool eof();
            bool fail();
            bool good();

              下例示例,表示出了上面各成員函數(shù)的用法:

            						#include <iostream> 
            usingnamespace std; 
            
            int main()  
            { 
                    int a; 
                    cin>>a; 
                    cout<<cin.rdstate()<<endl; 
                    if(cin.good()) 
                    { 
                            cout<<"輸入數(shù)據(jù)的類型正確,無錯誤!"<<endl; 
                    } 
                    if(cin.fail()) 
                    { 
                            cout<<"輸入數(shù)據(jù)類型錯誤,非致命錯誤,可清除輸入緩沖區(qū)挽回!"<<endl; 
                    } 
                    system("pause"); 
            }

              如果錯誤發(fā)生,那么流狀態(tài)既被標(biāo)記為錯誤,你必須清除這些錯誤狀態(tài),以使你的程序能正確適當(dāng)?shù)乩^續(xù)運行。要清除錯誤狀態(tài),需使用clear()函數(shù)。此函數(shù)帶一個參數(shù),它是你將要設(shè)為當(dāng)前狀態(tài)的標(biāo)志值。,只要將ios::goodbit作為實參。

              示例代碼如下:

            						#include <iostream> 
            usingnamespace std; 
            
            int main()  
            { 
                    int a; 
                    cin>>a; 
                    cout<<cin.rdstate()<<endl; 
                    cin.clear(ios::goodbit); 
                    cout<<cin.rdstate()<<endl; 
                    system("pause"); 
            }

            通常當(dāng)我們發(fā)現(xiàn)輸入有錯又需要改正的時候,使用clear()更改標(biāo)記為正確后,同時也需要使用get()成員函數(shù)清除輸入緩沖區(qū),以達到重復(fù)輸入的目的。

              示例代碼如下:

            						#include <iostream> 
            usingnamespace std; 
            
            int main()  
            { 
                    int a; 
                    while(1) 
                    { 
                            cin>>a; 
                            if(!cin)//條件可改寫為cin.fail() 
                            { 
                                    cout<<"輸入有錯!請重新輸入"<<endl; 
                                    cin.clear(); 
                                    cin.get(); 
                            } 
                            else 
                            { 
                                    cout<<a; 
                                    break; 
                            } 
                    } 
                    system("pause"); 
            }

              最后再給出一個對文件流錯誤標(biāo)記處理的例子,鞏固學(xué)習(xí),代碼如下:

            						#include <iostream> 
            #include <fstream> 
            usingnamespace std; 
            
            int main()  
            { 
                    ifstream myfile("c:\\1.txt",ios_base::in,0); 
                    if(myfile.fail()) 
                    { 
                            cout<<"文件讀取失敗或指定文件不存在!"<<endl; 
                    } 
                    else 
                    { 
                            char ch; 
                            while(myfile.get(ch)) 
                            { 
                                    cout<<ch; 
                            } 
                            if(myfile.eof()) 
                            { 
                                    cout<<"文件內(nèi)容已經(jīng)全部讀完"<<endl; 
                            } 
                            while(myfile.get(ch)) 
                            { 
                                    cout<<ch; 
                            } 
                    } 
                    system("pause"); 
            }
            posted on 2006-06-29 20:30 Jerry Cat 閱讀(364) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



            <2006年4月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            午夜精品久久久久| 久久青青草原精品国产软件| 久久综合五月丁香久久激情| 99久久免费只有精品国产| 亚洲午夜久久久影院伊人| 久久精品国产亚洲AV香蕉| 久久久久99这里有精品10| 一级做a爰片久久毛片看看| 色综合久久中文字幕综合网| 久久综合色区| 久久天天躁狠狠躁夜夜2020一 | 亚洲色欲久久久综合网东京热| 一本色道久久综合狠狠躁篇 | 国产精品久久久久久福利漫画| 久久九九精品99国产精品| 国产精品禁18久久久夂久| 久久香蕉国产线看观看99| 久久久久99精品成人片三人毛片| 久久e热在这里只有国产中文精品99| 欧美性大战久久久久久| 狠狠综合久久AV一区二区三区 | 久久er国产精品免费观看8| 天堂无码久久综合东京热| 日韩精品无码久久久久久| 国产精品99久久久久久人| 国产日韩久久免费影院| 思思久久99热只有频精品66| 国内精品久久人妻互换| 久久这里只有精品视频99| 色诱久久久久综合网ywww| 日本精品久久久中文字幕| 久久国产AVJUST麻豆| 亚洲国产精品久久66| 久久精品中文字幕一区| 香蕉久久夜色精品国产小说| 欧美亚洲国产精品久久高清| 久久精品成人国产午夜| 99久久精品免费看国产一区二区三区| 精品久久久久久久| 亚洲国产精品久久久天堂| 久久99国产一区二区三区|