中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

伊通縣建設局網(wǎng)站常德政府網(wǎng)站

伊通縣建設局網(wǎng)站,常德政府網(wǎng)站,做維修電器網(wǎng)站,網(wǎng)頁設計與制作畢業(yè)設計怎么寫目錄 0.前言 1.C / C ->文件操作 1.1 C語言文件操作 1.1.1 C語言文件打開/關閉/寫入 1.1.2 C語言文件的追加操作 1.1.3 C語言文件的讀取 1.2 C語言文件操作 1.2.1 C文件打開 / 關閉 / 寫入 1.2.2 C文件讀取 1.2.3 文件追加 2.三個默認輸入輸出流 2.1 C語言中的三…

目錄

0.前言

1.C / C++ ->文件操作

1.1 C語言文件操作

1.1.1 C語言文件打開/關閉/寫入

1.1.2 C語言文件的追加操作

1.1.3 C語言文件的讀取

1.2 C++語言文件操作

1.2.1 C++文件打開 / 關閉 / 寫入

1.2.2 C++文件讀取

1.2.3 文件追加

2.三個默認輸入輸出流

2.1 C語言中的三個

2.2從三個流的操作引入一切皆文件

2.2.1主體操作

2.2.2標準輸出和標準錯誤的小區(qū)別

2.2.3從文件操作體會一切皆文件

2.3從流文件操作看OS對底層的封裝

3.系統(tǒng)調(diào)用接口(文件操作)

3.1 open接口

3.1.1 open參數(shù)與返回值

3.1.2 open的實踐使用

3.2 write接口

3.3 read接口

3.4 write追加


0.前言

本文所有代碼都以上傳至gitee:
practice14 · onlookerzy123456qwq/Linuxtwo - 碼云 - 開源中國 (gitee.com)

1.C / C++ ->文件操作

我們首先來復習一下,C語言,C++的對于文件操作提供的接口。

1.1 C語言文件操作

1.1.1 C語言文件打開/關閉/寫入

//FILE *fopen(const char *path, const char *mode);      FILE* f_test = fopen("./diary.txt","w");      //打開文件需要檢查是否打開成功      if(f_test == NULL)       {                        printf("file open error\n");      return 1;             }                        //對文件進行寫入操作(寫入5個hello world\n)     int k = 5;               while(k--){      //int fputs(const char *s, FILE *stream);        fputs("hello world\n",f_test);    }                        //打開文件需要關閉文件  //int fclose(FILE *fp);                                                                                        fclose(f_test);                                                                                                 return 0;   
首先我們?nèi)绾卧贑語言當中打開文件,使用的是fopen接口,返回的是一個FILE*指針,我們拿到這個FILE* 指針,就可以通過FILE指針對打開的相應文件操作
fopen的第一個參數(shù)是path,指明這個文件所在的路徑+文件名,我們例子中的"./diary.txt",指明的就是當前文件夾下的diary.txt文件進行打開。
fopen的第二個參數(shù)是mode,我們要填入的是打開這個文件的模式,例如你是以只讀方式,或?qū)懛绞?#xff0c;或追加方式等,對文件進行打開。
PS:我們打開文件之后,需要記住兩件事,第一件事是檢查文件打開是否成功,如果fopen失敗返回的是NULL。第二件事是fclose關閉文件,不然會對后續(xù)文件的操作產(chǎn)生影響:此處如果沒有fclose,數(shù)據(jù)留在緩沖區(qū)中,雖然可以成功寫入,但是無法成功讀取。
然后我們講C語言的寫入文件接口fputs,它的第一個參數(shù)s是要寫入文件的字符串,寫入到的目標文件是第二個參數(shù)FILE* stream,也就是fopen的返回值,指代要寫入的文件是誰。

1.1.2 C語言文件的追加操作

這里我們要注意需要以追加append的方式打開這個文件,即fopen的第二個參數(shù)我們傳入"a",然后我們調(diào)用C語言寫入接口,就會默認在文件尾進行寫入,完成對原來內(nèi)容的追加。
 //FILE *fopen(const char *path, const char *mode);          FILE* f_test = fopen("./diary.txt","a");          //打開文件需要檢查是否打開成功          if(f_test == NULL)           {                            printf("file open error\n");          return 1;       }                                      //對文件append操作                   int k = 5;                                                  while(k--){                                 fputs("hello world\n",f_test);          }                                      //打開文件需要關閉文件                                                                                              fclose(f_test);

1.1.3 C語言文件的讀取

這里讀取我們使用的是fgets接口:
fgets接口是一次讀取文件的一行內(nèi)容到buffer接收緩沖區(qū)里面,第一個參數(shù)填buffer接口緩沖區(qū),即把從文件中讀取到的一行內(nèi)容放在哪里。
第三個參數(shù)是FILE* stream,表征的是從哪個文件里面進行一行的讀取。
第二個參數(shù)int size,它的意義是期待最多讀取size-1個字符最多讀取size-1個字符,也可以讀取不到這么多,所以只需要你填入buffer的size大小即可。fgets接口會在讀取到的字符串的最后,自動添加\0。
//FILE *fopen(const char *path, const char *mode);              FILE* f_test = fopen("./diary.txt","r");    //打開文件需要檢查是否打開成功              if(f_test == NULL)    {                                printf("file open error\n");              return 1;           }                                          //對文件read操作 //create buffer to receive the data of the file we readchar buffer[256];memset(buffer,0,sizeof(buffer));printf("We read file:\n");//char *fgets(char *s, int size, FILE *stream);//fgets從流上讀取最多(size-1)個字符并將其存儲到s指向的buffer中,當遇到新的一行或文件結(jié)束標志時結(jié)束while(fgets(buffer,sizeof(buffer),f_test) != NULL){//每次都讀取一行到buffer里面,所以說每次讀取一行,我們就要對這個打印這一行,否則就會一行一行覆蓋前面讀取的內(nèi)容printf("%s\n",buffer);}//讀取完畢文件之后需要檢查是否讀取完成成功if(!feof(f_test)){printf("file read not to end,file quit illegally!\n");}//打開文件需要關閉文件                                                                                                  fclose(f_test);     
每次讀取的是一行的內(nèi)容到緩沖區(qū)當中,所以說每次讀取一行,我們就要對這個打印這一行,否則就會被下一次fgets讀取的下一行的內(nèi)容覆蓋buffer中前面讀取的內(nèi)容
然后還要記得對讀取之后進行檢查,因為存在讀取失敗的問題,feof接口,檢查此時文件是否已經(jīng)到文件尾,即我們是否已經(jīng)讀取完畢。

1.2 C++語言文件操作

1.2.1 C++文件打開 / 關閉 / 寫入

  //explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);std::ofstream ofs("./diary2.txt",std::ios::out | std::ios::binary);//打開文件就要檢查是否打開成功if(!ofs.is_open()){cout<<"file open error"<<endl;return 1;}//對文件進行寫入string name = "張三";int age = 18;ofs << "姓名:"<<name<<" "<<"年齡:"<<age<<endl;//還可以調(diào)用ofs的write接口進行寫入string message_temp = "Happy Everyday!~\n";for(int i = 0;i<3;++i){ofs.write(message_temp.c_str(),message_temp.size());}//即使我們不主動close,也會在析構的過程中自動關閉,但是我們提倡主動釋放,減少資源占據(jù)ofs.close();return 0;
C++使用的ofstream類的對象,進行對目標文件的打開,ofstream構造函數(shù)第一個參數(shù)要打開的文件路徑+文件名,第二個參數(shù)是打開的方式是什么,比如默認缺省不寫是文本寫入,我們上述代碼塊的第二行是二進制寫入的方式打開文件。
打開文件之后我們有兩件事,第一件事是查看文件是否被打開成功,我們調(diào)用的是ofstream對象的is_open()成員函數(shù);第二件事是關閉文件,調(diào)用的是ofstream對象的close()成員函數(shù)。當然C++當中有析構函數(shù),可以不用主動close,ofs對象生命周期結(jié)束的時候,可以自動調(diào)用close,但是能主動調(diào)就主動調(diào),減少資源的占據(jù)。

1.2.2 C++文件讀取

C++文件讀取,我們使用的是ifstream類對象,構造函數(shù)第一個參數(shù)是要進行讀取文件的路徑+文件名,第二個參數(shù)是傳入的打開文件的模式,默認是文本讀取,下面代碼我們設置的是二進制讀取模式。
ifstream讀取文件內(nèi)容的方式可以調(diào)用對于int string類等自己封裝的的operator>>函數(shù),也可以調(diào)用ifstream類的成員方法read。
 //explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);std::ifstream ifs("./diary2.txt",ios_base::in | ios_base::binary);//打開文件就要檢查是否打開成功if(!ifs.is_open()){cout<<"file open error"<<endl;return 1;}//對文件進行讀取string name;int age = 0;ifs >> name >> age;//打印讀取到的信息cout<<"We Read:\n姓名:"<<name<<" "<<"年齡:"<<age<<endl;//還可以使用read語法char buffer[128];//讀取到的內(nèi)容放到buffer當中,期待讀取的字節(jié)數(shù)是sizeof(buffer)ifs.read((char*)buffer,sizeof(buffer));cout<<"We Also Read:\n"<<buffer<<endl;//即使我們不主動close,也會在析構的過程中自動關閉,但是我們提倡主動釋放,減少資源占據(jù)ifs.close();

如圖看到我們的讀取文件代碼是成功的。

1.2.3 文件追加

C++的追加寫入,我們只要在寫入ofstream類構造函數(shù)基礎上,設置app追加模式,然后進行對ofs的寫入即可。
//explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);std::ofstream ofs("./diary2.txt",std::ios::app | std::ios::binary);//打開文件就要檢查是否打開成功if(!ofs.is_open()){cout<<"file open error"<<endl;return 1;}//對文件進行追加寫入string name = "李四";int age = 19;ofs << name <<" "<<age<<endl;//還可以調(diào)用ofs的write接口進行寫入string message_temp = "Not Bad Everyday!~\n";for(int i = 0;i<3;++i){ofs.write(message_temp.c_str(),message_temp.size());}                                                                                                                                         //即使我們不主動close,也會在析構的過程中自動關閉,但是我們提倡主動釋放,減少資源占據(jù)ofs.close();

2.三個默認輸入輸出流

2.1 C語言中的三個

C程序,在加載到內(nèi)存,成為一個進程的時候面,會默認打開三個輸入輸出流stdin,stdout,stderr。他們都是FILE*類型。這個FILE的本質(zhì)是C語言提供的,一個結(jié)構體,可以通過這個結(jié)構體找到這個文件。
站在體系結(jié)構的角度理解,stdin對應的設備是鍵盤,stdout對應的硬件設備是顯示器,stderr對應的硬件設備是顯示器。它們的學名分別叫做標準輸入,標準輸出,標準錯誤
同時C++當中,也會默認有三個對象:cout,cin,cerr,也分別對應標準輸入,標準輸出,標準錯誤,也分別對應鍵盤,顯示器,顯示器。

2.2從三個流的操作引入一切皆文件

2.2.1主體操作

剛剛我們接觸的C語言的三個默認打開的文件流,stdin,stdout,stderr,都是FILE*類型,其實都是可以當做打開的文件FILE* f_stream直接去操作的。
//C語言會默認打開三個文件流stdin stdout stderr6   //我們可以直接使用這三個FILE* 文件流 7   const char* w_str = "hello fprintf stdout\n";8   fprintf(stdout,w_str,strlen(w_str));

我們看到fprintf stdout,就是往stdout這個文件,也就是顯示器進行寫入。效果是等同于這個printf的。
char buffer[128];  
memset(buffer,0,sizeof(buffer));
fscanf(stdin,"%s",buffer);
printf("We Read From stdin:\n%s\n",buffer);

我們看到fsacnf stdin,就是往stdin這個文件,也就是鍵盤進行寫入。效果是等同于scanf的。
const char* w_str = "hello fprintf stderr\n";                    
fprintf(stderr,w_str,strlen(w_str));

我們看到fprintf stderr,就是往stderr這個文件,也就是顯示器進行寫入。

2.2.2標準輸出和標準錯誤的小區(qū)別

我們往stdout和stderr寫入,本質(zhì)都是往對應的顯示器寫入,他們對應的設備是一樣的,使用寫入接口如fprintf對這兩個標準輸出,標準輸出,本質(zhì)都是在顯示器寫入,那有什么小文件寫入呢?
區(qū)別就在于輸出重定向的時候,只有我們往標準輸出sdtout寫入的內(nèi)容,才會被重定向,寫入到目標文件當中,而向stderr標準錯誤寫入的的內(nèi)容是不會被重定向的,仍然被寫入打印到了屏幕當中。
下面我們演示重定向操作:

2.2.3從文件操作體會一切皆文件

可是你是否有想過,這個stdout,stdin,stderr,都是FILE*類型,也可以被當做文件使用,可是他們本質(zhì)代表的是顯示器,鍵盤這些硬件啊!難道這些硬件都是一種文件file嗎?
事實上,在LinuxOS看來,這些都是文件!剛剛我們做的實驗fputs向 一般文件 或者 硬件設備 都能進行寫入一般文件,都存儲在磁盤上,所以其實這些文件的本質(zhì)也是硬件,也可以證明硬件設備也是一種FILE。
在LinuxOS看來,所有的存儲在磁盤上的file,這些是我們通常認識的一般文件,事實上,我們可以繼續(xù)擴展,所有的硬件也是文件!
======》得出一個結(jié)論:Linux下一切皆文件!!!

2.3從流文件操作看OS對底層的封裝

OS是軟件和硬件的管理者,任何外部勢力要訪問,都要經(jīng)由OS。所有的文件file,都是儲存在磁盤當中的,或者說是磁盤的一部分,所以他們是硬件,所以我們剛剛的寫入/讀取文件(硬件)的操作都是經(jīng)由OS之手的。
OS不相信任何人,任何用戶想要訪問只能通過OS對上提供的系統(tǒng)調(diào)用接口System Call,進行合法的訪問。所以,我們對文件(軟件 / 硬件)寫入,本質(zhì)都是通過System Call 即系統(tǒng)調(diào)用接口訪問到的!

所以,我們可以大膽的得出一個結(jié)論:
幾乎所有的語言,fopen fclose fread fwrite fgetsfputs fgetc fputc ,等這些對文件(硬件)進行讀寫接口的實現(xiàn),這個過程一定是經(jīng)由了System Call層故這些上層語言的接口一定使用OS提供的系統(tǒng)調(diào)用接口封裝實現(xiàn)的!
我們接下來演示系統(tǒng)調(diào)用接口,當然這里演示的是文件的系統(tǒng)調(diào)用接口,因為這個離著OS更近,我們可以用語言(OS System Call層)進行講解。
萬變不離其宗,所有語言的文件調(diào)用接口,都是對(文件操作的)System Call系統(tǒng)調(diào)用接口的封裝。
我們把底層學好了,上層怎么學都可以,上面我們是從OS對軟件硬件的管理的角度理解的系統(tǒng)調(diào)用與上層語言之間的關系。

3.系統(tǒng)調(diào)用接口(文件操作)

3.1 open接口

3.1.1 open參數(shù)與返回值

open接口是Linux中的系統(tǒng)調(diào)用接口,負責對文件的打開,第一個參數(shù)pathname,傳入的是想要打開文件的路徑+文件名;第二個參數(shù)int flags是打開文件的標志,即我們是以什么方式打開這個文件(只讀,只寫,還是追加);第三個參數(shù)是mode_t mode,這個是打開文件的權限設置。
open的返回值是int,這個int其實就是文件描述符fd(file descriptor)。如果打開文件失敗返回-1,并設置全局錯誤碼。
pathname好理解,就是路徑+文件名。int flags也可以直接類比C語言fopen接口的打開方式"w","r",“a”,但是這里傳入的實際上是一個int,但是我們不直接傳入int,而是通過系統(tǒng)文件給我們提供的宏(如下圖)進行傳入。

int fd = open("./diary3.txt",O_WRONLY | O_CREAT,xxxxx);
舉個上面代碼片的例子,第一個參數(shù)指定打開的路徑+文件名,第二個參數(shù)是兩個宏的或運算,這個就是我們傳入的int。
從感性的角度理解,O_WRONLY是以只寫方式打開這個文件,O_CREAT是創(chuàng)建這個文件,所以我們是以如果這個文件不存在我們就創(chuàng)建,然后以只寫的方式打開。這個O_WRONLY | O_CREAT其實就可以直接類比為C語言fopen的"w"打開方式!
從理性的角度理解,這兩個宏可以進行或運算,成為一個int,說明這些宏本身就是一個數(shù),然后這些宏或運算起來可以表征某種信息,open接口接收到這個整形信息,就知道你要以什么方式打開這個文件。現(xiàn)在有6個bit位,比如第一個bit位代表米飯,第二個bit位代表饅頭,第三個bit位代表牛肉,第四個bit位代表羊肉,第五個bit位代表可樂,第六個bit位代表雪碧,我傳入的是011001,然后open接口就知道你要吃的是饅頭+牛肉+雪碧。
這里的每一個宏其實就代表了某一個特定bit位的數(shù),在open當中就看int的32個bit位的有無情況來設定你是在以什么方式在打開這個文件,如第一個bit標志位, 看看你是想創(chuàng)建這個文件 , 第二個bit位的有代表你是想寫入這文件。所以此時O_WRONLY是0b1,O_CREAT是0b10,O_WRONLY | O_CREAT就是0b0000 0011。
本質(zhì)上這些宏就是在代表不同的bit位。而且不同的宏代表不同的bit位。
我們的理解是這樣的,我們緊接著看一下系統(tǒng)文件是怎么樣的:

通過grep指令,我們看到#define的這些宏,就是bit位樣式的定義!這驗證了我們的想法。
理解完第二個參數(shù),我們理解第三個參數(shù),mode_t mode:任何一個文件,都有一個重要的屬性,即文件權限,尤其是你沒有文件的時候,你創(chuàng)建一個文件,肯定要設置這個文件的權限,所以這個mode其實就是傳入對于owner,group,other的權限設置。我們采用八進制方案傳入0644,本質(zhì)就是rw-r--r--。
int fd = open("./diary3.txt",O_WRONLY | O_CREAT,0644);
不是你的生活充滿陽光,總有人替你負重前行!!!(C語言封裝都替你搞好了mode權限管理)同時根據(jù)我們之前的理論,C語言上的打開文件接口fopen都是封裝的系統(tǒng)調(diào)用open,這個mode參數(shù)fopen都已經(jīng)幫我們搞好了!
你在C語言的接口對文件的權限(mode)都是漠不關心的,因為這些概念都是和OS強相關的。C語言給你做封裝,你也就不用再關心權限這些細節(jié)了
open系統(tǒng)調(diào)用接口的返回值int,是文件描述符,可以類比fopen的返回值FILE* fp,這個其實就是我們后續(xù)對特定文件進行寫入讀取的索引(如何知道你是在對哪個文件進行寫入,C語言用的是fopen打開文件的返回值FILE* fp,系統(tǒng)調(diào)用這里用的是open打開文件的返回值int fd)。

3.1.2 open的實踐使用

我們open一個文件之后,不管怎么樣,一定要記得關閉一個這個文件,我們配套的系統(tǒng)調(diào)用關閉文件的接口是close(int fd)。

所以完整的打開一個文件的過程:
 //int open(const char *pathname, int flags, mode_t mode);//int fd = open("./diary3.txt",O_WRONLY | O_CREAT);//這里的O_WRONLY,O_CREAT的本質(zhì)都是代表一個bit為1的整形值,通過或出的值的方式,設計相應標志位//open接口就知道你是以什么方式打開的了//這里O_WRONLY代表寫的方式打開接口,O_CREAT代表創(chuàng)建這個文件,這兩個的組合就是C中的“w的意義//0644代表設置對于打開這個文件的權限管理模式設置(采用八進制表示法)int fd = open("./diary3.txt",O_WRONLY | O_CREAT,0644);//檢查是否打開成功(依托的是返回值)if(fd<0){printf("file open error\n");return 1;}//關閉文件close(1);\

3.2 write接口

系統(tǒng)調(diào)用write,它的作用就是對特定文件進行寫入操作int fd表征你在具體往哪個文件寫,buf表示的是你要寫入的內(nèi)容緩沖區(qū),size_t count是你期待寫入的字節(jié)數(shù)。返回值ssize_t是你實際向文件寫入的字節(jié)數(shù)目,如果寫入失敗返回-1。(你想寫入的字節(jié)數(shù),不一定都寫入,萬一你的傳的count過大了,那寫入的數(shù)目就是錯的,真正的寫入的字節(jié)數(shù)還是看write的返回值)

直接結(jié)合open上寫入文件的操作:
  //1.打開/創(chuàng)建文件int fd = open("./diary3.txt",O_CREAT | O_WRONLY);//檢查是否打開成功if(fd<0){perror("open");return 1;}//2.對文件進行寫入char buffer[128] = "Never ever ever ever give up\n";//系統(tǒng)調(diào)用接口write://第三個參數(shù)是你期待寫入的字節(jié)數(shù),返回值是實際上寫入成功的字節(jié)數(shù)//我們寫入字符串不寫入\0,因為這是僅僅只是C語言層面對字符串的標記而已ssize_t w_size = write(fd,buffer,strlen(buffer));//檢查寫入if(w_size<0){perror("write");return 2;}printf("We Write File Success:%s",buffer);//關閉文件close(fd);

3.3 read接口

系統(tǒng)調(diào)用read,它的作用就是對特定文件進行讀取操作int fd表征你在具體往哪個文件讀,buf表示的是你要接收讀取內(nèi)容的緩沖區(qū),size_t count是你期待讀取的字節(jié)數(shù)量。返回值ssize_t是你實際向文件讀取到的字節(jié)數(shù)目,如果讀取失敗返回-1。(你想讀取到的字節(jié)數(shù),不一定能讀取這么多,萬一你的傳的count過大了,那實際讀取的數(shù)目就是錯的,真正的讀取到的字節(jié)數(shù)還是看read的返回值)

write要注意的是不要寫入字符串最后的\0這個字節(jié)read要注意的是,你在讀取的時候,要注意給buffer預留一個字節(jié),自己主動填寫\0,所以我們期待讀取的count字節(jié)數(shù),不要寫成sizeof(buffer),而是要寫sizeof(buffer)-1。
  //1.打開/創(chuàng)建文件int fd = open("./diary3.txt",O_RDONLY);//檢查是否打開成功if(fd<0){                                           perror("open");   return 1;                                                    }                                                                  //2.對文件進行讀取                                             char buffer[128] ;memset(buffer,0,sizeof(buffer));//系統(tǒng)調(diào)用接口read://第三個參數(shù)是你期待讀到的字節(jié)數(shù),返回值是實際上讀取成功的字節(jié)數(shù)ssize_t r_size = read(fd,buffer,sizeof(buffer)-1);//檢查寫入 if(r_size<0){perror("read");                        return 2;                                                                                                              }         //[0,r_size-1]是讀取到的字節(jié)數(shù)據(jù)buffer[r_size] = '\0';printf("We Read File Success:%s\n",buffer);//關閉文件close(fd);

3.4 write追加

//1.打開/創(chuàng)建文件//ERROR:int fd = open("./diary3.txt",O_APPEND); 要追加首先要有WR寫權限int fd = open("./diary3.txt",O_WRONLY | O_APPEND);
我們只要在打開open這個文件的時候,在O_WRONLY的基礎上,再或上一個O_APPEND標志即可。然后就用相應的write寫入系統(tǒng)調(diào)用,就是在文件尾進行寫入,即追加。
http://m.risenshineclean.com/news/59405.html

相關文章:

  • 學校英語網(wǎng)站欄目名稱域名備案
  • WordPress漢化卡片式主題長嶺網(wǎng)站優(yōu)化公司
  • 做直播網(wǎng)站需要什么環(huán)球軍事網(wǎng)
  • 網(wǎng)站建設好之后怎么自己推廣免費推廣引流平臺有哪些
  • 服務器做網(wǎng)站需安裝哪些軟件佛山網(wǎng)站建設排名
  • 外包做網(wǎng)站賺錢么app注冊推廣拉人
  • 濟南做網(wǎng)站哪家便宜seo項目經(jīng)理
  • 網(wǎng)站怎么添加js廣告位免費seo搜索優(yōu)化
  • 常德論壇網(wǎng)站看廣告賺錢
  • 住房和城鄉(xiāng)建設部網(wǎng)站安廣東省淘寶指數(shù)官網(wǎng)
  • 優(yōu)化網(wǎng)站用軟件好嗎山東一級造價師
  • 建設摩托車官網(wǎng)旗艦店寶雞seo排名
  • 甘肅省蘭州市建設廳網(wǎng)站硬件優(yōu)化大師
  • 用dreamever如何建設網(wǎng)站百度指數(shù)數(shù)據(jù)官網(wǎng)
  • 什么系統(tǒng)做網(wǎng)站好2022年最新新聞播報稿件
  • 濰坊做網(wǎng)站個人工作室cms自助建站系統(tǒng)
  • 個人網(wǎng)站建設工作室深圳網(wǎng)站設計十年樂云seo
  • 怎么做賣花的網(wǎng)站9個廣州seo推廣神技
  • 星沙做淘寶店鋪網(wǎng)站seo偽原創(chuàng)工具
  • 江門做公司網(wǎng)站百度競價排名公式
  • 網(wǎng)站后臺 更新緩存品牌推廣方式
  • 網(wǎng)站維護開發(fā)合同seo怎么做推廣
  • 課程網(wǎng)站怎么做關鍵詞優(yōu)化app
  • 從化專業(yè)做網(wǎng)站培訓網(wǎng)站模板
  • 內(nèi)蒙古網(wǎng)站建設價格qq推廣官網(wǎng)
  • 遼寧新聞網(wǎng)站的建設seo官網(wǎng)
  • 個人網(wǎng)站 cdn學生個人網(wǎng)頁設計作品
  • 網(wǎng)站主機空間價格廣州網(wǎng)站運營專注樂云seo
  • 做淘寶客服的網(wǎng)站數(shù)字營銷
  • 深圳網(wǎng)站建設 設計創(chuàng)公司搜索排名廣告營銷怎么做