• 
    

      <address id="upfr9"><pre id="upfr9"><strike id="upfr9"></strike></pre></address>
      1. <address id="upfr9"><tr id="upfr9"></tr></address><dl id="upfr9"></dl>

        c語言中打開網(wǎng)頁的函數(shù) C語言打開網(wǎng)頁

        C語言文件打開函數(shù)

        ANSI

        休寧縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

        C規(guī)定文件打開用函數(shù)fopen,關(guān)閉為fclose。

        1、調(diào)用方式通常為:

        代碼如下:

        FILE

        *fp;

        fp=fopen(文件名,

        打開方式);

        2、參數(shù)說明:

        文件名:

        形如"myfile.dat"、"F:\data\myfile.dat"等等;

        打開方式:

        "r"(只讀)

        為輸入打開一個(gè)文本文件

        "w"(只寫)

        為輸出打開一個(gè)文本文件

        "a"(追加)

        向文件文件尾添加數(shù)據(jù)

        "rb"(只讀)

        為輸入打開一個(gè)二進(jìn)制文件

        "wb"(只寫)

        為輸出打開一個(gè)二進(jìn)制文件

        "r+"(讀寫)

        為讀寫打開一個(gè)文本文件

        "w+"(讀寫)

        為讀寫建立一個(gè)新的文本文件

        "a+"(讀寫)

        為讀寫打開一個(gè)文本文件

        "rb+"(讀寫)

        為讀寫打開一個(gè)二進(jìn)制文件

        "wb+"(讀寫)

        為讀寫建立一個(gè)新的二進(jìn)制文件

        "ab+"(讀寫)

        為讀寫打開一個(gè)二進(jìn)制文件

        3、注意:

        (1)用"r"方式打開的文件,不能向其輸入數(shù)據(jù),并且該文件已存在,否則出錯(cuò);

        (2)用"w"方式打開的文件,只能向該文件輸入數(shù)據(jù),如果所打開的文件不存在,則在打開時(shí)新建一個(gè)以指定的名字命名的文件;如果指定文件存在,則在打開時(shí)將該文件刪去,然后新建一個(gè)新的文件;

        (3)如果函數(shù)fopen打開文件出錯(cuò),則fopen返回一個(gè)空指針值NULL;

        (4)在程序開始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開3個(gè)標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入(stdin),標(biāo)準(zhǔn)輸出(stdout),標(biāo)準(zhǔn)出錯(cuò)輸

        出(stderr)。如果要使用輸入輸出終端,則不需要打開,可以直接使用,如fputc(stdout,'a');向屏幕輸出字符a。

        如何用C語言打開網(wǎng)站?

        參考代碼如下:

        #include?windows.h

        int?main(void)

        {

        ShellExecute(NULL,?"open",?"",?NULL,?NULL,?SW_MINIMIZE);

        return?0;

        }

        例子中是最小化打開的,還可以是最大化SW_MAXIMIZE,隱藏SW_HIDE等。

        C語言中open函數(shù)如何使用使用

        C語言中open函數(shù)

        作用:打開和創(chuàng)建文件。

        簡述:

        1

        2

        3

        4

        #includefcntl.h

        intopen(constchar*pathname,intflags);

        intopen(constchar*pathname,intflags,mode_tmode);

        返回值:成功則返回文件描述符,否則返回-1

        對于open函數(shù)來說,第三個(gè)參數(shù)僅當(dāng)創(chuàng)建新文件時(shí)(即

        使用了O_CREAT

        時(shí))才使用,用于指定文件的訪問權(quán)限位(access

        permission

        bits)。pathname

        是待打開/創(chuàng)建文件的POSIX路徑名(如/home/user/a.cpp);flags

        用于指定文件的打開/創(chuàng)建模式,這個(gè)參數(shù)可由以下常量(定義于fcntl.h)通過邏輯位或邏輯構(gòu)成。

        1

        2

        3

        O_RDONLY只讀模式

        O_WRONLY只寫模式

        O_RDWR讀寫模式

        打開/創(chuàng)建文件時(shí),至少得使用上述三個(gè)常量中的一個(gè)。以下常量是選用的:

        1

        2

        3

        4

        5

        6

        O_APPEND每次寫操作都寫入文件的末尾

        O_CREAT如果指定文件不存在,則創(chuàng)建這個(gè)文件

        O_EXCL如果要?jiǎng)?chuàng)建的文件已存在,則返回-1,并且修改errno的值

        O_TRUNC如果文件存在,并且以只寫/讀寫方式打開,則清空文件全部內(nèi)容(即將其長度截短為0)

        O_NOCTTY如果路徑名指向終端設(shè)備,不要把這個(gè)設(shè)備用作控制終端。

        O_NONBLOCK如果路徑名指向FIFO/塊文件/字符文件,則把文件的打開和后繼I/O

        設(shè)置為非阻塞模式

        1

        (nonblockingmode)

        以下三個(gè)常量同樣是選用的,它們用于同步輸入輸出

        1

        2

        3

        4

        O_DSYNC等待物理I/O結(jié)束后再write。在不影響讀取新寫入的數(shù)據(jù)的

        前提下,不等待

        文件屬性

        更新。

        1

        2

        O_RSYNCread等待所有寫入同一區(qū)域的寫操作完成后再進(jìn)行

        O_SYNC等待物理I/O結(jié)束后再write,包括更新文件屬性的I/O

        open返回的文件描述符一定是最小的未被使用的描述符。

        如果

        NAME_MAX(文件名最大長度,不包括'\0')是

        14,而我們想在當(dāng)前目錄下創(chuàng)建文件名長度超過

        14

        字節(jié)的文件,早期的

        System

        V

        系統(tǒng)(如

        SVR2)會截?cái)喑霾糠?,只保留?/p>

        14

        個(gè)字節(jié);而由

        BSD

        衍生的(BSD-derived)系統(tǒng)會返回錯(cuò)誤信息,并且把

        errno

        置為

        ENAMETOOLONG。

        POSIX.1

        引入常量

        _POSIX_NO_TRUNC

        用于決定是否截?cái)嚅L文件名/長路徑名。如果_POSIX_NO_TRUNC

        設(shè)定為禁止截?cái)?,并且路徑名長度超過

        PATH_MAX(包括

        '\0'),或者組成路徑名的任意文件名長度超過

        NAME_MAX,則返回錯(cuò)誤信息,并且把

        errno

        置為

        ENAMETOOLONG。

        怎么通過C語言讀取網(wǎng)頁里面的數(shù)據(jù)

        簡單的請求格式

        GET /index.php HTTP/1.0

        host:

        當(dāng)我們和服務(wù)器連接上之后,發(fā)送上面的數(shù)據(jù)過去,服務(wù)器就會返回 index.php 這個(gè)頁面給我們。

        GET 這個(gè) 是表示 以什么方式請求,HTTP中還有很多其他的請求方式,常用的就 GET POST (更詳細(xì)的 可以點(diǎn)開上面 http協(xié)議 那個(gè)鏈接)

        GET 后面緊跟一個(gè)空格 然后 給出,要獲取的資源的名稱, /index.php 就表示獲取網(wǎng)站服務(wù)器根目錄下 index.php 執(zhí)行后所產(chǎn)生的內(nèi)容,我們也可以改成 GET / HTTP/1.0 這就表示獲取默認(rèn)首頁的內(nèi)容 。 GET /1.html HTTP/1.0 就是獲取 服務(wù)器根目錄下 1.html的內(nèi)容,很容易理解吧。

        接下來隔一個(gè)空格 跟上 HTTP/1.0 表示 http協(xié)議的版本,這個(gè)是固定的 。

        第二行 host: 用來指定 訪問哪個(gè)主機(jī)。 大家都知道,一個(gè)服務(wù)器可以放很多個(gè)網(wǎng)站,每個(gè)網(wǎng)站有不同的域名,所以我們需要用這個(gè)host來指定 我們要訪問的是哪個(gè)網(wǎng)站,這樣 才能正確得訪問到我們想訪問的網(wǎng)站。

        第一步,連接服務(wù)器。

        第二步,按照http協(xié)議,發(fā)送請求數(shù)據(jù),然后就是接受返回的內(nèi)容。

        沒錯(cuò),就這么簡單。

        在編寫程序之前,我們先用一個(gè)小工具來模擬一下這個(gè)過程,好讓我們對http協(xié)議了解更深入一些。

        telnet工具 如果是 win7下的朋友 猛戳這里--win7開啟telnet功能

        到此為止,我假設(shè)大家電腦上已經(jīng)開啟了 telnet功能,正題開始。

        telnet 他是一個(gè)基于tcp/ip 協(xié)議的程序,為我們用戶提供一個(gè) 與其他電腦通信的工具,我們可以使用他來和其他電腦進(jìn)行連接通信。

        開始-運(yùn)行-輸入telnet回車, 出現(xiàn)一個(gè)黑框如下。

        我們這時(shí)就可以輸入命令,來連接遠(yuǎn)程主機(jī),比如我們這次是要連接我們自學(xué)去論壇 的服務(wù)器,

        那么我們就輸入 open 80 然后回車。

        open 是打開的意思 后面跟上 要打開那個(gè)主機(jī) 然后 后面跟上端口, web服務(wù)器默認(rèn)使用的是80端口,所以 要加上80端口(不加端口 telnet默認(rèn)是23端口)。

        然后會出現(xiàn)下圖的情況,這時(shí)候 我們就可以輸入命令了,輸入的命令都將被發(fā)送到自學(xué)去論壇的服務(wù)器上面。大家注意一下 下圖紅色箭頭所指出的部分,那里就是一個(gè)輸入光標(biāo),不用管其他的字。

        這就代表 我們已經(jīng)和遠(yuǎn)程主機(jī)連接上了,就相當(dāng)于我們上節(jié)課中 客戶端執(zhí)行到 connect 函數(shù) 之后 就是要調(diào)用 send函數(shù)發(fā)送數(shù)據(jù)了,在這里 我們只需要按鍵盤輸入到黑色窗口中 就會發(fā)送到服務(wù)端。

        我們依次輸入以下內(nèi)容,(注意,不能按退格,輸入錯(cuò)誤了,就重新打開telnet,重新操作。)

        Linux中怎么用C語言打開網(wǎng)頁

        給你一個(gè)哈,我自己調(diào)試好的,并且加了詳細(xì)注釋~~記得給分啊,我沒分問問題了~

        #include stdlib.h

        #include stdio.h

        #include unistd.h

        #include fcntl.h

        #include sys/types.h

        #include sys/socket.h

        #include netinet/in.h

        #include errno.h

        #include time.h

        #include sys/types.h

        #include sys/ioctl.h

        #include string.h

        #include stdarg.h

        #include netdb.h

        #include setjmp.h

        #include signal.h

        /*gethostbyname 超時(shí)返回

        這里使用的辦法是設(shè)置一個(gè)時(shí)鐘,如果gethostbyname在指定的時(shí)間內(nèi)尚未返回,

        時(shí)鐘會強(qiáng)制其返回,得到的返回值顯然是空指針,等價(jià)于告訴用戶主機(jī)未連如互聯(lián)網(wǎng)或者該域名無法解析。*/

        static sigjmp_buf jmpbuf;

        static void alarm_func() //該函數(shù)執(zhí)行之后會執(zhí)行跳轉(zhuǎn)

        {

        siglongjmp(jmpbuf, 1);

        }

        static struct hostent *gngethostbyname(char *HostName, int timeout)

        {

        struct hostent *lpHostEnt;

        signal(SIGALRM, alarm_func); //接受alarm信號,然后調(diào)用函數(shù)

        if(sigsetjmp(jmpbuf, 1) != 0)//跳轉(zhuǎn)目的地

        {

        alarm(0);//timout

        signal(SIGALRM, SIG_IGN);

        return NULL;

        }

        alarm(timeout);//setting alarm

        printf("\nwill gethost!\n");

        lpHostEnt = gethostbyname(HostName);

        signal(SIGALRM, SIG_IGN);

        return lpHostEnt;

        }

        /*(linux socket編程實(shí)現(xiàn)connect超時(shí)的一種方法

        創(chuàng)建套接字,將其設(shè)置成非阻塞狀態(tài)。

        調(diào)用connect連接對端主機(jī),如果失敗,判斷當(dāng)時(shí)的errno是否為EINPROGRESS,也就是說是不是連接正在進(jìn)行中,如果是,轉(zhuǎn)到步驟3,如果不是,返回錯(cuò)誤。

        用select在指定的超時(shí)時(shí)間內(nèi)監(jiān)聽套接字的寫就緒事件,如果select有監(jiān)聽到,證明連接成功,否則連接失敗。*/

        int main(int argc, char *argv[])

        {

        //最好檢查一下參數(shù),要求傳入3個(gè)參數(shù) URL PORT TIMEOUT(connect send recv 3個(gè)參數(shù)的超時(shí))

        int fd, retval,res,error;

        struct sockaddr_in addr;

        struct timeval timeo = {15, 0}; //time ou struct

        struct hostent *site;

        socklen_t len = sizeof(timeo);

        fd_set set;

        fd = socket(AF_INET, SOCK_STREAM, 0);

        if (argc == 4)

        timeo.tv_sec = atoi(argv[3]);

        site=gngethostbyname(argv[1],3); //解析域名的超時(shí)設(shè)置,測試域名超時(shí),可以寫一個(gè)可以ping的通但是沒有辦法解析域名

        //的IP地址到resolv.conf里面,然后加上一個(gè)默認(rèn)路由,直接PING一個(gè)百度,就能發(fā)現(xiàn)如果不加超時(shí)機(jī)制就會一直卡在那里

        if(NULL == site)

        {

        printf("\ncan not find the site!\n");

        return -2;

        }

        fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); //設(shè)置為非阻塞模式

        addr.sin_family = AF_INET;

        //addr.sin_addr.s_addr = inet_addr(argv[1]);

        memcpy(addr.sin_addr, site-h_addr_list[0], site-h_length);

        addr.sin_port = htons(atoi(argv[2]));

        printf("%d\n", time(NULL));

        /*if (connect(fd, (struct sockaddr*)addr, sizeof(addr)) == 0) {

        printf("connected1\n");

        // return 0;

        }*/

        //res=connect(fd, (struct sockaddr*)addr, sizeof(addr));

        //printf("\nconnect result:[%d]\n",res);

        if (connect(fd, (struct sockaddr*)addr, sizeof(addr)) != 0)

        {

        //調(diào)用一次系統(tǒng)函數(shù)失敗后直接看errno,確定是什么問題,下面的代碼可以實(shí)現(xiàn)在沒有默認(rèn)路由的情況下直接返回失敗.

        if (errno != EINPROGRESS) {

        printf("connect:normal network unreach!!");

        return -1;

        }

        printf("\nwill select\n");

        FD_ZERO(set);/*將set清零使集合中不含任何fd*/

        FD_SET(fd,set); /*將一個(gè)給定的文件描述符加入集合之中*/

        retval = select(fd + 1, NULL, set, NULL, timeo);

        if (retval == -1) {

        printf("select");

        return -1;

        } else if(retval == 0) {

        printf("timeout\n"); //這樣的select等于是變成了再timeout時(shí)間內(nèi)是阻塞模式,超過timeout就直接返回

        printf("%d\n", time(NULL));

        return 0;

        }

        else

        {

        printf("connected---:[%d]\n",retval);

        getsockopt(fd, SOL_SOCKET, SO_ERROR, error, (socklen_t *)len); //判斷在connected成功之后,獲取套接口目前的一些信息來判斷是否真的是連接上了,返回0表示真的連上了

        printf("error---:[%d]\n",error);

        if(0!=error)

        return -1;

        }

        }

        int ul = 0;

        ioctl(fd, FIONBIO, ul); //設(shè)置為阻塞模式

        //return 0;

        setsockopt(fd,SOL_SOCKET,SO_SNDTIMEO,(char *)timeo,sizeof(timeo));

        setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,(char *)timeo,sizeof(timeo));

        printf("\nbefore\n");

        sleep(5); //在sleep 5的時(shí)候,拔掉網(wǎng)線就可以測試出recv超時(shí)的功能,如果不加recv 的超時(shí)功能,拔掉網(wǎng)線后就會一直卡在那里,當(dāng)然你在實(shí)際應(yīng)用的時(shí)候沒必要加這個(gè)

        printf("\nafter\n");

        char *msg="GET / HTTP/1.0\r\n\r\n";

        if( send(fd, msg, strlen(msg), 0)0 )

        {

        printf("error in send msg\n");

        exit(1);

        }

        int i=0;

        char buf[1000];

        while((recv(fd,buf,1000,MSG_WAITALL))0)

        {

        printf("[%d]:[%s]",i,buf);

        i++;

        }

        printf("\n------end---------\n");

        close(fd);

        return;

        }

        當(dāng)前名稱:c語言中打開網(wǎng)頁的函數(shù) C語言打開網(wǎng)頁
        本文來源:http://www.jbt999.com/article38/hjghpp.html

        成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化虛擬主機(jī)、關(guān)鍵詞優(yōu)化、用戶體驗(yàn)、微信公眾號

        廣告

        聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

        成都app開發(fā)公司

      2. 
        

          <address id="upfr9"><pre id="upfr9"><strike id="upfr9"></strike></pre></address>
          1. <address id="upfr9"><tr id="upfr9"></tr></address><dl id="upfr9"></dl>
            成人娱乐中文网 | 成人黄色免费观看 | 中文字幕久久精品无码不卡 | 国产成人超碰人人澡人人澡 | 亚洲精品成人无码AV在线 | 豆花视频精品一区 | 国产色色导航 | 国产理论视频 | 操屄视频免费在线观看 | 超碰天堂 |