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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【项目源码分享】基于C++实现的小型数据库(Windows/Linux环境)

發布時間:2024/4/11 linux 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【项目源码分享】基于C++实现的小型数据库(Windows/Linux环境) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

前言

項目介紹

功能實現

重要說明

源代碼分享

寫在最后


前言

程設實驗終于收工了!🎉

終于到了本學期最后一個項目,可謂是一波三折:剛拿到項目要求時認為只是項目二的網店+LINUX操作系統,very easy;中間遇到文件讀寫的bug,苦苦找不到對策,整整一周幾乎沒有進展;最后兩天靈感迸發,修復了之前的bug,并一天碼了破千行代碼,掉了滿地頭發……無論如何,項目終歸是結束了,也留給了我日后繼續學習數據庫和操作系統的基礎,再說回程設實驗,不得不說這門課耗時只能用恐怖形容,所幸下一屆學弟學妹們不用再受這苦😭

最后只想說一句:程設實驗,再nm的見!


項目介紹

本項目中我們需要在Linux環境下使用C/C++語言搭建一個最簡單、最基礎的數據庫mySQL,模擬數據庫的基本操作,實現六大類基本命令語句,待解決的問題有:

1. 如何實現Linux環境下代碼的編譯與執行(注意LinuxWindows環境下文件操作的不同);

2. 如何(使用正則表達式)解析指令,獲取不同的操作對象;

3. 如何使用文件保存各個表格的內容以及維護整個數據庫的狀態;

4….


功能實現

本項目中只要求實現一個最簡單的數據庫,也即實現六大類基本功能——

CREATE TABLEDROP TABLEINSERT INTODELETEUPDATESELECT

它們對應的命令語句如下:

  • CREATE TABLE name (column1,column2,···,columnT) TO file
  • CREATE TABLE name FROM filename
  • DROP TABLE name
  • TABLE LIST
  • INSERT INTO name VALUES (value1,value2,···,valueT)
  • INSERT INTO name (column1,column2,···) VALUES (value1,value2,···)
  • DELETE FROM name WHERE column = value
  • DELETE * FROM name
  • UPDATE name SET column1 = value1, column2 = value2, ···
  • UPDATE name SET column1 = value1, column2 = value2, ··· WHERE column = value
  • SELECT column1,column2,··· FROM name
  • SELECT * FROM name
  • SELECT DISTINCT column1,column2,··· FROM name
  • SELECT * FROM name ORDER BY column1,column2,··· ASC|DESC
  • SELECT column1,column2,··· FROM name WHERE column = value
  • SELECT column1,column2,··· FROM name TO file
  • 接下來展示部分命令功能的實現截圖:??


    重要說明

    • 正規數據庫的命令解析還是應當考慮正則表達式,本項目中由于時間原因直接使用原始的字符串解析方法,非常暴力,有待改進
    • 為了盡可能減少bug,文件名最好采用英文
    • Linux環境下可能出現小部分字符亂碼現象,但基礎功能均可正常實現
    • 源碼開源 ≠ 完全開放,代碼分享僅供學習工作交流使用,嚴禁作業抄襲及商業用途
    • 致謝NJU最后一屆程設實驗課的老師與助教,耐心解答了我的許多問題

    接下來分享源代碼!接近兩千行,時間原因不能注釋詳盡,之后有時間爭取補上(有時間也不一定🙄)


    源代碼分享

    #include<iostream> #include<string> #include<fstream> using namespace std;/*一些測試指令 * TABLE LIST * CREATE TABLE Student FROM student.txt * CREATE TABLE CS_Student FROM CS.txt * CREATE TABLE Student (學號,姓名,專業) TO student.txt * CREATE TBALE Lecture (課程編號,課程名稱,任課老師) TO lecture.txt * DROP TABLE Lecture * * INSERT INTO Student VALUES (170000001,張三,計算機科學與技術) * INSERT INTO Student VALUES (170000002,李四,金融系) * INSERT INTO Student (學號,姓名) VALUES (170000003,王二) * INSERT INTO Student (學號,姓名,專業) VALUES (170000004,劉五,微電子) * * DELETE FROM Student WHERE 姓名 = 張三 * DELETE * FROM Student * * UPDATE Student SET 學號 = 170000000, 專業 = 計算機科學與技術 * UPDATE Student SET 學號 = 170000000, 專業 = 地球科學 WHERE 姓名 = 張三 * * SELECT 學號,姓名 FROM Student * SELECT * FROM Student * SELECT 專業 FROM Student * SELECT DISTINCT 專業 FROM Student * SELECT * FROM Student ORDER BY 學號 DESC * SELECT 專業 FROM Student WHERE 姓名 = 張三 * SELECT * FROM Student WHERE 姓名 = 張三 * SELECT * FROM Student WHERE 專業 = 計算機科學與技術 TO CS.txt * * SELECT * FROM Student WHERE 學號 > 170000000 * SELECT MAX(學號) FROM Student * SELECT * FROM Student WHERE 學號 < (SELECT MAX(學號) FROM Student) *//* * 這里是數據結構及函數聲明~ */ struct SQL //數據庫結構體,包括表名和文件名和表格對應序號 {string table_name;string file_name;int index; }; SQL my_sql[100]; //維護一個數據庫狀態數組 int my_sql_num = 0; //當前數據庫狀態行數struct TABLE //表格結構體,包括表名,文件名,各列的屬性名,行數列數 {string table_name;string file_name;string column[50];int col_num = 0; int row_num = 0; }; TABLE all_table[100]; //維護一個全體表格數組 int table_num = 0; //當前數據庫表格數量string table_data[100][100]; //維護一個數據二維數組,用于暫時存儲更新的表格數據 int row = 0, col = 0; //當前表格數據行列數//讀取數據庫文件 void read_my_sql();//寫入數據庫文件 void write_my_sql();//讀取所有表格及其屬性 void read_all_table();//讀取表頭 void read_table(int index, string filename);//寫入表頭 void write_table(int index, string filename);//讀取表格數據 void read_table_data(int index, string filename);//寫入表格數據 void write_table_data(int index, string filename);//根據指令創建表格 void Create_table(char ins[]);//根據指令刪除表格 void Drop_table(char ins[]);//查看所有表格 void Table_list();//向表格中插入數據 void Insert_table_data(char ins[]);//刪除表格數據 void Delete_table_data(char ins[]);//修改表格數據 void Updata_table_data(char ins[]);//選擇表格數據并展示 void Selete_table_data(char ins[]);//打印表格數據 void printf_table(int index);//打印所有表格列表 void printf_table_list();//判斷是否為空行(即m是否為字母) bool is_not_endl(char m);/* * 這里是主函數~ */ int main() {cout << "\033[33m-----\033[32mWelcome \033[35mto \033[36mmySQL!\033[33m-----\033[0m" << endl;while (true){cout << "(mysql)==>";char ins[100]; //用來接受指令cin.getline(ins, 100);//Quit 退出數據庫if (ins[0] == 'q'&& ins[1] == 'u'&& ins[2] == 'i'&& ins[3] == 't'){cout << "\033[33m-----\033[32mQuit \033[36mmySQL!\033[33m-----\033[0m" << endl;break;}//CREATE TABLE 創建表格功能else if (ins[0] == 'C' && ins[1] == 'R' && ins[2] == 'E' && ins[3] == 'A' && ins[4] == 'T' && ins[5] == 'E'){Create_table(ins);}//DROP TABLE 刪除表格功能 else if (ins[0] == 'D' && ins[1] == 'R' && ins[2] == 'O' && ins[3] == 'P'){Drop_table(ins);}//TABLE LIST 查看所有表格else if ((ins[0]=='0')||(ins[0] == 'T' && ins[1] == 'A' && ins[2] == 'B' && ins[3] == 'L' && ins[4] == 'E')){Table_list();}//INSERT INTO 插入數據else if (ins[0] == 'I' && ins[1] == 'N' && ins[2] == 'S' && ins[3] == 'E' && ins[4] == 'R' && ins[5] == 'T'){Insert_table_data(ins);}//DELETE 刪除數據else if (ins[0] == 'D' && ins[1] == 'E' && ins[2] == 'L' && ins[3] == 'E' && ins[4] == 'T' && ins[5] == 'E'){Delete_table_data(ins);}//UPDATE 更新數據else if (ins[0] == 'U' && ins[1] == 'P' && ins[2] == 'D' && ins[3] == 'A' && ins[4] == 'T' && ins[5] == 'E'){Updata_table_data(ins);}//SELECT 選擇數據else if (ins[0] == 'S' && ins[1] == 'E' && ins[2] == 'L' && ins[3] == 'E' && ins[4] == 'C' && ins[5] == 'T'){Selete_table_data(ins);}//ERROR 指令錯誤else{cout << "Error instruction!" << endl;}}return 0; }/* * 下面是函數的定義~ *///讀取數據庫狀態文件 void read_my_sql() {my_sql_num = 0; //讀入新狀態前先將原狀態歸零const string my_sql_filename = "my_sql.txt"; //設置數據庫狀態文件名//打開文件,若文件不存在,則創建文件ifstream in_file(my_sql_filename, ios::_Noreplace);while (in_file.peek() != EOF){in_file >> my_sql[my_sql_num].table_name;in_file >> my_sql[my_sql_num].file_name;in_file >> my_sql[my_sql_num].index;if (is_not_endl(my_sql[my_sql_num].table_name[0]) == 1)my_sql_num++;}in_file.close(); }//寫入數據庫狀態文件 void write_my_sql() {const string my_sql_filename = "my_sql.txt"; //設置數據庫狀態文件名ofstream out_file(my_sql_filename, ios::out);for (int i = 0; i < my_sql_num; i++){//表名 文件名 下標out_file << my_sql[i].table_name << " ";out_file << my_sql[i].file_name << " ";out_file << my_sql[i].index << endl;}out_file.close(); }//讀取所有表格及其屬性 void read_all_table() {table_num = 0; //表格數歸零for (int i = 0; i < my_sql_num; i++){//每讀一行數據庫信息都會得到一張表int ind = my_sql[i].index;all_table[ind].table_name = my_sql[i].table_name;all_table[ind].file_name = my_sql[i].file_name;read_table(ind, my_sql[i].file_name);if (is_not_endl(all_table[ind].file_name[0]) == 1)table_num++;} }//讀取表頭 void read_table(int index, string filename) {all_table[index].col_num = 0; //讀入表頭前先將表格列數歸零//打開文件,若文件不存在,則創建文件ifstream in_file(filename, ios::_Noreplace);string s;getline(in_file, s);int i = 0;//解析表頭while(i<s.size()){int k = 0;string str;if (s[i + k] == ' ') //規避漢字中間的兩個空格i++;while (i+k!=s.size() && s[i + k] != ' '){str += s[i + k];k++;}int c = all_table[index].col_num;all_table[index].column[c] = str;all_table[index].col_num++;i = i + k + 1;}in_file.close(); }//寫入表頭 void write_table(int index, string filename) {ofstream out_file(filename, ios::out);for (int i = 0; i < all_table[index].col_num; i++)out_file << all_table[index].column[i] << " ";out_file << endl;out_file.close(); }//讀取表格數據 void read_table_data(int index, string filename) {all_table[index].row_num = 0; //讀入表頭前先將表格行數歸零//打開文件,若文件不存在,則創建文件ifstream in_file(filename, ios::_Noreplace);//先讀表頭string s;getline(in_file, s);//剩下的是表格數據while(in_file.peek()!=EOF){for (int j = 0; j < all_table[index].col_num; j++)in_file >> table_data[all_table[index].row_num][j]; //用二維數組接受表格信息if(table_data[all_table[index].row_num][0]>="0" && table_data[all_table[index].row_num][0]<="9")all_table[index].row_num++;} in_file.close(); }//寫入表格數據 void write_table_data(int index, string filename) {ofstream out_file(filename, ios::out);//寫入表頭for (int i = 0; i < all_table[index].col_num; i++){out_file << all_table[index].column[i] << " ";}out_file << endl;//寫入數據for (int i = 0; i < all_table[index].row_num; i++){for (int j = 0; j < all_table[index].col_num; j++){out_file << table_data[i][j]<<" ";}out_file << endl;}out_file.close(); }//根據指令創建表格,獲取表名、文件名、屬性名等 void Create_table(char ins[]) {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();//解析指令獲取表名,記錄到總表格數組中string tablename;int i = 13; //移動到指令中name的第一位while (ins[i] != ' '){tablename += ins[i];i++;}all_table[table_num].table_name = tablename;i += 1;//第一類創建語句if (ins[i] == '(') {//檢測表格名是否重復for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//表格名已存在cout << "TABLE " << tablename << " Already Exists !" << endl;return;}}//解析指令獲取每一列的屬性名,記錄到總表格數組中i += 1; //移動到指令中column[i]的第一位int k = 0;string col_name[50];col = 0;while (true){col_name[col] += ins[i + k];k++;if (ins[i + k] == ',' || ins[i + k] == ','){//把每列的名字給到對應表格的column數組中,對應列數+1int c = all_table[table_num].col_num;all_table[table_num].column[c] = col_name[col];all_table[table_num].col_num++; col++;//移動至下一個列名的第一位i = i + k + 1;k = 0;}else if (ins[i + k] == ')' || ins[i + k] == ')'){//把每列的名字給到對應表格的column數組中,對應列數+1int c = all_table[table_num].col_num;all_table[table_num].column[c] = col_name[col];all_table[table_num].col_num++; col++;i = i + k + 1;break;}}//解析指令獲取文件名,記錄到總表格數組中i += 4; //移動到指令中file的第一位string filename;while (ins[i] != '\0'){filename += ins[i];i++;}all_table[table_num].file_name = filename;//創建表格文件并寫入表頭write_table(table_num, filename);//修改數據庫狀態my_sql[my_sql_num].table_name = tablename;my_sql[my_sql_num].file_name = filename;my_sql[my_sql_num].index = table_num;my_sql_num++;write_my_sql(); //更新數據庫狀態文件table_num++; //最后,表格數量加一//展示最新創建的表頭cout << "--------------------" << endl;cout << "ID ";for (int i = 0; i < all_table[table_num - 1].col_num; i++){cout << all_table[table_num - 1].column[i] << " ";}cout << endl;cout << "--------------------" << endl;}//第二類創建語句(相當于打印已有表格)else if (ins[i] == 'F') {int index;string filename;bool flag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);printf_table(index);flag = 0;break;}else if (my_sql[j].table_name == "None"){//給無名氏表格命名my_sql[j].table_name = tablename;write_my_sql();index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);printf_table(index);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}}else{cout << "Error instruction!" << endl;} }//根據指令刪除表格 void Drop_table(char ins[]) {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();//解析指令獲取待刪除表名string tablename;int i = 11;while (ins[i] != '\0'){tablename += ins[i];i++;}bool flag = 1;for (int j = 0; j < my_sql_num;j++){if (my_sql[j].table_name == tablename){//找到待刪的表格,則進行數據遷移for (int k = j; k < my_sql_num-1; k++){my_sql[k].table_name = my_sql[k+1].table_name;my_sql[k].file_name = my_sql[k+1].file_name;}table_num--;my_sql_num--;flag = 0;cout << "DROP TABLE SUCCESS !" << endl;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}write_my_sql(); //更新數據庫狀態文件read_all_table(); //修改當前表格列表 }//查看所有表格 void Table_list() {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();//依次讀取每張表格的數據for (int i = 0; i < table_num; i++){read_table_data(i, all_table[i].file_name);}//打印所有表格信息cout << " Total table number:" << table_num << endl;for (int i = 0; i < table_num; i++){cout << " " << all_table[i].table_name << ":";cout << "(" << all_table[i].col_num << "," << all_table[i].row_num << ")";if (all_table[i].col_num == 0)cout << "[ ]" << endl;else{cout << "[" << all_table[i].column[0];for (int j = 1; j < all_table[i].col_num; j++)cout << "," << all_table[i].column[j];cout << "]" << endl;}} }//向表格中插入數據 void Insert_table_data(char ins[]) {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();//解析指令獲取表名string tablename;int i = 12; //移動到指令中name的第一位while (ins[i] != ' '){tablename += ins[i];i++;}all_table[table_num].table_name = tablename;//根據表名打開對應文件,讀取表格數據int index;string filename;bool flag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}i += 1; //第一類插入語句if (ins[i] == 'V') {i += 8; //i移動到value[i]的第一位int k = 0;string col_value[50];int num = 0;col = 0, row = all_table[index].row_num;while (true){col_value[num] += ins[i + k];k++;if (ins[i + k] == ',' || ins[i + k] == ','){//把每列的值給到對應表格的值數組中,對應列數+1table_data[row][col] = col_value[num];num++; col++;//移動至下一個值i = i + k + 1;k = 0;}else if (ins[i + k] == ')' || ins[i + k] == ')'){//把每列的值給到對應表格的值數組中,對應列數+1table_data[row][col] = col_value[num];num++; col++;i = i + k + 1;break;}}cout << "INSERT SUCCESS !" << endl;all_table[index].row_num++;printf_table(index);//修改表格文件write_table_data(index, filename);}//第二類插入語句else if (ins[i] == '(') {//獲取給定列名稱和添加的值i += 1; //i移動到column[i]的第一位int k = 0;string cols[50]; //暫存column[i]的值int num = 0; //給定值的個數while (true){cols[num] += ins[i + k];k++;if (ins[i + k] == ',' || ins[i + k] == ','){num++;//移動至下一個值i = i + k + 1;k = 0;}else if (ins[i + k] == ')' || ins[i + k] == ')'){num++;i = i + k + 1;break;}}i += 9; //i移動到value[i]的第一位k = 0;string value[50]; //暫存value[i]的值num = 0; //給定值的個數while (true){string col_value;value[num] += ins[i + k];k++;if (ins[i + k] == ',' || ins[i + k] == ','){num++;//移動至下一個值i = i + k + 1;k = 0;}else if (ins[i + k] == ')' || ins[i + k] == ')'){num++;i = i + k + 1;break;}}col = 0, row = all_table[index].row_num;for (int m = 0; m < all_table[index].col_num; m++){bool tag = 1; //表示是否為缺省for (int n = 0; n < num; n++){if (all_table[index].column[m] == cols[n]){table_data[row][m] = value[n];tag = 0;break;}}if (tag == 1)table_data[row][m] = "空"; //缺省值默認為空}cout << "INSERT SUCCESS !" << endl;all_table[index].row_num++;printf_table(index);//修改表格文件write_table_data(index, filename);}else{cout << "Error instruction!" << endl;} }//刪除表格數據 void Delete_table_data(char ins[]) {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();//第一類刪除語句if (ins[7] == 'F'){//解析指令獲取表名string tablename;int i = 12; //移動到指令中name的第一位while (ins[i] != ' '){tablename += ins[i];i++;}all_table[table_num].table_name = tablename;//讀取表格數據 int index;string filename;bool flag = 1; for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}i += 7; //i移動到待刪除的column第一位string column;while (ins[i] != ' '){column += ins[i];i++;}i += 3; //i移動到待刪除的value第一位string value;while (ins[i] != '\0'){value += ins[i];i++;}col = all_table[index].col_num, row = all_table[index].row_num;//先找到刪除的列的下標int column_index = -1;for (int k = 0; k < col; k++){if (all_table[index].column[k] == column){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}bool tag = 1;//再逐行搜索滿足條件的記錄for (int k = 0; k < row; k++){if (table_data[k][column_index] == value){tag = 0;//找到待刪行,進行數據遷移for (int m = k; m < row - 1; m++){for (int n = 0; n < col; n++){table_data[m][n] = table_data[m + 1][n];}}break;}}if (tag == 1){cout << "Error instruction!" << endl;return;}else{all_table[index].row_num--;cout << "DELETE SUCCESS !" << endl;printf_table(index);//修改表格文件write_table_data(index, filename);}}//第二類刪除語句else if (ins[7] == '*' && ins[9]=='F'){//解析指令獲取表名string tablename;int i = 14; //移動到指令中name的第一位while (ins[i] != '\0'){tablename += ins[i];i++;}all_table[table_num].table_name = tablename;//讀取表格數據 int index;string filename;bool flag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}all_table[index].row_num = 0; //刪除所有行cout << "DELETE SUCCESS !" << endl;printf_table(index);//修改表格文件write_table_data(index, filename);}else{cout << "Error instruction!" << endl;} }//修改表格數據 void Updata_table_data(char ins[]) {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();//解析指令獲取表名string tablename;int i = 7; //移動到指令中name的第一位while (ins[i] != ' '){tablename += ins[i];i++;}all_table[table_num].table_name = tablename;//根據表名打開對應文件,讀取表格數據int index;string filename;bool flag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}i += 5; //移動到column i第一位int k = 0;int tag = 0;string s[50];string column[50], value[50];int num = 0;while (true){while (ins[i + k] != ','&& ins[i + k] != '\0'&&ins[i + k] != 'W'){s[num] += ins[i + k];k++;}if (ins[i + k] == ','){num++;i = i + k + 2;k = 0;}else if (ins[i + k] == '\0'){tag = 1; //第一類更新語句num++;break;}else if (ins[i + k] == 'W'){tag = 2; //第二類更新語句num++;//最后一句多了一個空格,刪去之string temp = s[num - 1].substr(0, s[num - 1].size() - 1);s[num - 1] = temp;i = i + k + 6; //i 移動到column首位break;}}//逐句再次解析for (int j = 0; j < num; j++){int cur = 0;while (s[j][cur] != ' ')cur++;column[j] = s[j].substr(0, cur);cur += 3;value[j] = s[j].substr(cur, s[j].size());}if (tag == 1){//對表格每一列進行遍歷,搜索column[]數組判斷是否需要更改for (int j = 0; j < all_table[index].col_num; j++){for (int n = 0; n < num; n++){if (all_table[index].column[j] == column[n]) {//更改這一列每一行的值for (int m = 0; m < all_table[index].row_num; m++){//m是表格的某一行,j是表格的某一列,n是對應要修改的值table_data[m][j] = value[n];}break;}}}cout << "UPDATE SUCCESS !" << endl;printf_table(index);//修改表格文件write_table_data(index, filename);}else if (tag == 2){//記錄限制條件 column = valuestring clmn, val;while (ins[i] != ' '){clmn += ins[i];i++;}i += 3;while (ins[i] != '\0'){val += ins[i];i++;}//找到對應的列的下標int column_index = -1;for (k = 0; k < all_table[index].col_num; k++){if (all_table[index].column[k] == clmn){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}//對表格每一列進行遍歷,搜索column[]數組判斷是否需要更改for (int j = 0; j < all_table[index].col_num; j++){for (int n = 0; n < num; n++){if (all_table[index].column[j] == column[n]){//只更改這一列滿足限制條件的行的值for (int m = 0; m < all_table[index].row_num; m++){//判斷是否滿足條件if (table_data[m][column_index] == val){//m是表格的某一行,j是表格的某一列,n是對應要修改的值table_data[m][j] = value[n];}}break;}}}cout << "UPDATE SUCCESS !" << endl;printf_table(index);//修改表格文件write_table_data(index, filename);}else{cout << "Error instruction!" << endl;} }//選擇表格數據并展示 void Selete_table_data(char ins[]) {//先讀取數據庫狀態文件和現有表格列表read_my_sql();read_all_table();if (ins[7] == '*'){//解析指令獲取表名string tablename;int i = 14; //移動到指令中name的第一位while (ins[i] != '\0' && ins[i] != ' '){tablename += ins[i];i++;}//根據表名打開對應文件,讀取表格數據int index;string filename;bool flag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}//從TABLE name里選擇所有列展示,即展示整個TABLEif (ins[i] == '\0'){printf_table(index);}//對返回的查詢結果按某些列進行排序展示else if (ins[i] == ' ' && ins[i + 1] == 'O'){i += 10; //移動到 column i 第一位string column[50];int num = 0;int k = 0;while (true){while (ins[i + k] != ',' && ins[i + k] != ' '){column[num] += ins[i + k];k++;}if (ins[i + k] == ','){num++;i = i + k + 1;k = 0;}else if (ins[i + k] == ' '){num++;i = i + k + 1; //i 移動到ASC|DESC首位break;}}//找到對應的列的下標int column_index = -1;for (k = 0; k < all_table[index].col_num; k++){//支持按某一列的值排序if (all_table[index].column[k] == column[0]){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}if (ins[i] == 'A') //升序{for (int m = 0; m < all_table[index].row_num - 1; m++){for (int n = 0; n < all_table[index].row_num - m - 1; n++){if (table_data[n][column_index] > table_data[n + 1][column_index]){//交換兩行元素for (int tt = 0; tt < all_table[index].col_num; tt++){string temp = table_data[n][tt];table_data[n][tt] = table_data[n + 1][tt];table_data[n + 1][tt] = temp;}}}}}else if (ins[i] == 'D') //降序{for (int m = 0; m < all_table[index].row_num - 1; m++){for (int n = 0; n < all_table[index].row_num - m - 1; n++){if (table_data[n][column_index] < table_data[n + 1][column_index]){//交換兩行元素for (int tt = 0; tt < all_table[index].col_num; tt++){string temp = table_data[n][tt];table_data[n][tt] = table_data[n + 1][tt];table_data[n + 1][tt] = temp;}}}}}else{cout << "Error instruction!" << endl;return;}//打印//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}else if (ins[i] == ' ' && ins[i + 1] == 'W'){i += 7; //i 移動到column第一位//記錄限制條件 column = valuestring clmn, val;while (ins[i] != ' '){clmn += ins[i];i++;}i += 1;// column = valueif (ins[i] == '='){i += 2;while (ins[i] != '\0' && ins[i] != ' '){val += ins[i];i++;}//找到對應的列的下標int column_index = -1;for (int k = 0; k < all_table[index].col_num; k++){if (all_table[index].column[k] == clmn){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}if (ins[i] == '\0'){//打印//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){if (table_data[m][column_index] == val){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}}else{i += 4; //移動到新表格文件名第一位string new_filename;while (ins[i] != '\0'){new_filename += ins[i];i++;}//打印//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){if (table_data[m][column_index] == val){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}//創建新表寫入文件ofstream out_file(new_filename, ios::out);//寫入表頭for (int j = 0; j < all_table[index].col_num; j++){out_file << all_table[index].column[j] << " ";}out_file << endl;//寫入數據for (int m = 0; m < all_table[index].row_num; m++){if (table_data[m][column_index] == val){for (int n = 0; n < all_table[index].col_num; n++){out_file << table_data[m][n] << " ";}out_file << endl;}}out_file.close();//修改數據庫狀態my_sql[my_sql_num].table_name = "None";my_sql[my_sql_num].file_name = new_filename;my_sql[my_sql_num].index = table_num;my_sql_num++;write_my_sql(); //更新數據庫狀態文件}}// column > valueelse if (ins[i] == '>'){i += 2;while (ins[i] != '\0'){val += ins[i];i++;}//找到對應的列的下標int column_index = -1;for (int k = 0; k < all_table[index].col_num; k++){if (all_table[index].column[k] == clmn){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}//打印//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){if (table_data[m][column_index] > val){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}}// column < value ,其中value=max(學號)else if (ins[i] == '<'){i += 2;//找到對應的列的下標int column_index = -1;for (int k = 0; k < all_table[index].col_num; k++){if (all_table[index].column[k] == clmn){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}//找學號最大值string max = table_data[0][column_index];for (int j = 0; j < all_table[index].row_num; j++){if (table_data[j][column_index] > max){max = table_data[j][column_index];}}//打印//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){if (table_data[m][column_index] < max){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}}else{cout << "Error instruction!" << endl;return;}}else{cout << "Error instruction!" << endl;}}else if (ins[7] == 'D'){string column[50];int num = 0;int i = 16; //移動到 column i 第一位int k = 0;while (true){while (ins[i + k] != ',' && ins[i + k] != ' '){column[num] += ins[i + k];k++;}if (ins[i + k] == ','){num++;i = i + k + 1;k = 0;}else if (ins[i + k] == ' '){num++;i = i + k + 6; //i 移動到name首位break;}}//解析表名string tablename;while (ins[i] != '\0' && ins[i] != ' '){tablename += ins[i];i++;}//根據表名打開對應文件,讀取表格數據int index;string filename;bool tag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);tag = 0;break;}}if (tag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}bool flag[50]; //給每一列做標記for (int j = 0; j < all_table[index].col_num; j++){flag[j] = 0;}for (int j = 0; j < all_table[index].col_num; j++){for (k = 0; k < num; k++){if (all_table[index].column[j] == column[k]){flag[j] = 1;break;}}}//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){if (flag[j] == 1)cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){bool print = 1; //判斷要不要打印 for (int n = 0; n < all_table[index].col_num; n++){if (flag[n] == 1){for (int a = 0; a < m; a++){if (table_data[a][n] == table_data[m][n]){print = 0;break;}}}}if (print == 1){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){if (flag[n] == 1)cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}}else if (ins[7] == 'M'){int i = 11; string column;while (ins[i] != ')'){column += ins[i];i++;}//解析指令獲取表名i += 7;string tablename;while (ins[i] != '\0'){tablename += ins[i];i++;}//根據表名打開對應文件,讀取表格數據int index;string filename;bool flag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);flag = 0;break;}}if (flag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}//找到對應的列的下標int column_index = -1;for (int k = 0; k < all_table[index].col_num; k++){if (all_table[index].column[k] == column){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}//找最大值int maxline = 0;string max = table_data[0][column_index];for (int j = 0; j < all_table[index].row_num; j++){if (table_data[j][column_index] > max){max = table_data[j][column_index];maxline = j;}}//打印//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據cout << maxline + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){cout << table_data[maxline][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}else{string column[50];int num = 0;int i = 7; //移動到 column i 第一位int k = 0;while (true){while (ins[i + k] != ',' && ins[i + k] != ' '){column[num] += ins[i + k];k++;}if (ins[i + k] == ','){num++;i = i + k + 1;k = 0;}else if (ins[i + k] == ' '){num++;i = i + k + 6; //i 移動到name首位break;}}//解析表名string tablename;while (ins[i] != '\0' && ins[i] != ' '){tablename += ins[i];i++;}all_table[table_num].table_name = tablename;//根據表名打開對應文件,讀取表格數據int index;string filename;bool tag = 1;for (int j = 0; j < my_sql_num; j++){if (my_sql[j].table_name == tablename){//找到了對應的表格index = my_sql[j].index;filename = my_sql[j].file_name;read_table_data(index, filename);tag = 0;break;}}if (tag == 1) //沒找到{cout << "Not found TABLE " << tablename << " !" << endl;return;}bool flag[50]; //給每一列做標記for (int j = 0; j < all_table[index].col_num; j++){flag[j] = 0;}for (int j = 0; j < all_table[index].col_num; j++){for (k = 0; k < num; k++){if (all_table[index].column[j] == column[k]){flag[j] = 1;break;}}}//從TABLE name里選擇若干列展示if (ins[i] == '\0'){//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){if(flag[j]==1)cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){if (flag[n] == 1)cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}//從TABLE name里選擇若干列展示else if (ins[i] == ' ' && ins[i + 1] == 'W'){i += 7; //移動到column首位//記錄限制條件 column = valuestring clmn, val;while (ins[i] != ' '){clmn += ins[i];i++;}i += 3;while (ins[i] != '\0'){val += ins[i];i++;}//找到對應的列的下標int column_index = -1;for (k = 0; k < all_table[index].col_num; k++){if (all_table[index].column[k] == clmn){column_index = k;break;}}if (column_index == -1){cout << "Error instruction!" << endl;return;}//打印表頭cout << "----------------------------------------" << endl;cout << "ID ";for (int j = 0; j < all_table[index].col_num; j++){if (flag[j] == 1)cout << all_table[index].column[j] << " ";}cout << endl;cout << "----------------------------------------" << endl;//打印數據for (int m = 0; m < all_table[index].row_num; m++){if(table_data[m][column_index]==val){cout << m + 1 << " ";for (int n = 0; n < all_table[index].col_num; n++){if (flag[n] == 1)cout << table_data[m][n] << " ";}cout << endl;cout << "----------------------------------------" << endl;}}}else{cout << "Error instruction!" << endl;}} }//打印表格 void printf_table(int index) {cout << "----------------------------------------" << endl;cout << "ID ";for (int i = 0; i < all_table[index].col_num; i++){cout << all_table[index].column[i] << " ";}cout << endl;cout << "----------------------------------------" << endl;for (int i = 0; i < all_table[index].row_num; i++){cout << i + 1 << " ";for (int j = 0; j < all_table[index].col_num; j++)cout << table_data[i][j] << " ";cout << endl;cout << "----------------------------------------" << endl;} }//打印所有表格列表 void printf_table_list() {for (int i = 0; i < table_num; i++)cout << all_table[i].table_name << " " << all_table[i].file_name << endl; }//判斷是否為空行(即m是否為字母) bool is_not_endl(char m) {if (((m >= 'a') && (m <= 'z')) || ((m >= 'A') && (m <= 'Z')))return true;return false; }

    寫在最后

    項目來源不易,能看到這里的話點個贊再走吧~

    如有疑問,可聯系QQ:450112427,備注說明來意

    總結

    以上是生活随笔為你收集整理的【项目源码分享】基于C++实现的小型数据库(Windows/Linux环境)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产成人三级三级三级97 | 又黄又爽又刺激 | 国产精品免费观看久久 | 日日夜精品 | 中文字幕乱码电影 | 久久视频国产精品免费视频在线 | 五月色丁香 | 97超碰成人在线 | 最近中文字幕 | 超碰com| 一级一级一片免费 | 最新av在线网址 | 天天色综合久久 | 国产日韩精品在线 | 欧美日韩亚洲精品在线 | 婷婷中文字幕 | 特级大胆西西4444www | 亚洲激情在线播放 | 欧美日韩视频网站 | 亚洲天天在线日亚洲洲精 | 国产亚洲精品综合一区91 | 精品伊人久久久 | 草久久av| 国产中文字幕视频在线观看 | 亚洲成人国产精品 | 国产精品一区二区三区四区在线观看 | 国产精品免费在线播放 | 青青河边草免费直播 | 日韩女同一区二区三区在线观看 | 国产 色| 免费69视频 | 亚洲精品字幕在线观看 | 黄色免费网战 | 国产免费中文字幕 | 免费观看的黄色片 | 超碰在线观看99 | 天天干天天摸 | 国产一区二区久久久 | 视频一区在线免费观看 | 国产视频资源 | 亚洲精品一区二区精华 | 免费在线观看av网址 | 久久成年人视频 | 麻豆成人小视频 | 久久国产精品视频 | 欧美日韩视频一区二区 | 国产一区在线视频 | www.香蕉 | 国产区精品在线观看 | 天天综合网在线 | 欧美成人中文字幕 | 国产在线一区二区三区播放 | 精品一区欧美 | 搡bbbb搡bbb视频| 久久免费黄色网址 | 亚洲国产成人精品在线 | av国产网站| 国产精久久久久久久 | 永久免费精品视频网站 | 国产精品久久网 | 超碰人人av | 天天艹天天 | a成人v在线 | av高清一区二区三区 | 日韩av资源在线观看 | 91在线观| 亚洲色图av | 99精品偷拍视频一区二区三区 | 国产中文视频 | 欧美午夜性 | 91探花国产综合在线精品 | av在线com | 男女激情免费网站 | 免费男女羞羞的视频网站中文字幕 | 手机看片99 | 天天弄天天干 | 天天操夜夜摸 | 日韩av一区二区在线播放 | 日韩一级电影在线 | 美女国产免费 | 亚洲免费精彩视频 | 成人久久国产 | 91视频3p| 国产精品福利一区 | 久久精品日本啪啪涩涩 | 久草久视频 | 欧美性生活小视频 | 五月婷婷开心 | 久久精品视频中文字幕 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 国产二级视频 | 日日天天狠狠 | 天天曰天天爽 | 在线观看国产麻豆 | 五月天久久综合 | 国产1区2 | 不卡精品 | 国产成人免费高清 | 一级黄色网址 | 国产午夜精品免费一区二区三区视频 | 亚欧日韩成人h片 | 日韩91av | 亚洲精品视频第一页 | 国产成本人视频在线观看 | 中文视频在线看 | 黄色毛片观看 | 久久国产精品电影 | 国产午夜精品福利视频 | 美女精品久久久 | 国产一区二区久久精品 | 91麻豆国产福利在线观看 | www.黄色片网站 | 99热精品在线 | 日本在线观看视频一区 | 久久精品一二区 | 国产不卡精品 | 一本一本久久a久久精品综合妖精 | 日韩爱爱网站 | 久久露脸国产精品 | 综合色在线观看 | 99热99热| 美女网站黄在线观看 | 久久高清毛片 | 91精品国自产在线观看 | 精品久久一二三区 | 亚洲区精品视频 | 国产成人精品福利 | 精品成人久久 | 日韩电影一区二区三区 | 久久久久北条麻妃免费看 | 免费观看成人网 | 国产精品成人一区二区三区吃奶 | 97日日碰人人模人人澡分享吧 | 日本精a在线观看 | a级片网站| 国产精彩视频一区二区 | 午夜国产一区二区 | 久久精品这里精品 | 亚洲久草在线 | 在线观看亚洲精品 | 日本久久久久久久久久久 | 搡bbbb搡bbb视频 | 色婷婷综合视频在线观看 | 国产精品久久人 | 色五月成人 | 午夜色影院 | 五月天综合网 | 国产麻豆视频在线观看 | 天天夜夜操 | 狠狠色免费 | 精品亚洲男同gayvideo网站 | 黄色影院在线观看 | 久久综合影院 | 日韩久久一区二区 | 日本精品久久久久中文字幕5 | 久草国产在线观看 | 正在播放久久 | 一区二区三区国 | 国产黄色免费电影 | 韩国av免费看 | 久久久久久久99精品免费观看 | 狠狠综合久久av | 99久久婷婷国产一区二区三区 | 黄色毛片在线看 | 国产精品麻豆果冻传媒在线播放 | 国产成人高清 | 在线亚洲免费视频 | 在线中文字幕一区二区 | 欧美激情第一区 | 国产一线二线三线在线观看 | 九九99 | 黄色软件在线观看免费 | 九九热在线免费观看 | 欧美在线99 | 亚洲午夜精品电影 | 久久精品久久久久久久 | 日日夜夜噜 | 中文字幕av播放 | 麻豆成人小视频 | 欧美成a人片在线观看久 | 国产一级黄大片 | 中文国产在线观看 | 91热在线 | 中文字幕麻豆 | 麻豆精品视频 | 人人爽人人澡人人添人人人人 | 一区二区三区四区五区在线 | 久久a热6 | 欧美 日韩 视频 | 久久99最新地址 | 日韩网站在线播放 | 69视频网站 | 又粗又长又大又爽又黄少妇毛片 | 国产黄色美女 | 二区视频在线观看 | 日日夜夜狠狠干 | 99久久夜色精品国产亚洲96 | 亚洲精品国偷自产在线91正片 | 日本在线观看一区二区三区 | 欧美成年网站 | 中文字幕一区二区三区四区视频 | 在线成人看片 | 99精品久久99久久久久 | 欧美日韩精品久久久 | 国产精品成人久久久 | a午夜在线 | 久草在线最新 | 国产成人精品一区在线 | 天天色天天干天天色 | 黄色成人在线观看 | 国产原创av在线 | 欧美最猛性xxx | 国产日韩欧美在线播放 | 色婷婷激情综合 | 福利视频一二区 | 国产高清成人在线 | 国模一区二区三区四区 | 国产字幕在线看 | 五月婷婷视频 | 免费观看完整版无人区 | 97超碰中文| 男女激情片在线观看 | 日韩天天综合 | 成人黄大片视频在线观看 | 综合久久久久久久久 | 国产小视频国产精品 | 欧美大码xxxx | 成年人免费在线观看网站 | 中文字幕精品视频 | 国产999在线 | 久久久99精品免费观看 | 丝袜美腿亚洲综合 | 久久久久久久久久久黄色 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 日韩久久精品一区二区三区下载 | 91片网| 国产麻豆精品一区 | 一区二区欧美日韩 | 久久av伊人 | 五月婷婷丁香综合 | 国产精品com | 狠狠亚洲 | 久久久麻豆 | 日本精品va在线观看 | 精品视频9999 | 亚洲精品视频网 | 久久久精品视频成人 | 在线影院av | 在线观看日韩一区 | 婷婷色站 | 狠狠干狠狠操 | av在线专区 | 97超碰国产精品女人人人爽 | av资源免费看 | 成人免费在线视频观看 | 日韩成人欧美 | 久久午夜电影院 | 在线久热 | 亚洲成人精品在线 | 亚洲专区在线 | 在线看的av网站 | 97视频在线免费播放 | 在线观看理论 | 国产精品视频地址 | 日韩av视屏在线观看 | av电影一区二区三区 | 亚洲精品国产品国语在线 | 4438全国亚洲精品在线观看视频 | 一区二区三区韩国免费中文网站 | 91成人在线观看高潮 | 精品一区二区在线免费观看 | 美女视频黄频大全免费 | 色.www| 国产成人黄色 | 久久不射电影院 | 午夜精选视频 | 玖玖精品在线 | 丝袜足交在线 | 午夜10000 | 天堂久色 | 久久精品一区二区三 | 久久影院中文字幕 | 免费看黄在线网站 | 欧美一级免费片 | 久久黄色a级片 | 免费视频二区 | 国产午夜在线观看 | 亚洲国产中文字幕在线视频综合 | 天天干天天上 | 福利视频网站 | 黄色的网站在线 | 国产一区欧美在线 | 四虎影视精品成人 | 啪啪av在线| 一级成人免费视频 | 丁香久久婷婷 | 91欧美精品 | 久久 在线 | 成人黄色电影在线 | 视频一区二区三区视频 | 日韩视频中文字幕 | 国产成人精品一区在线 | 亚洲成人精品av | 在线视频你懂 | 免费午夜视频在线观看 | 在线 国产 日韩 | 欧美成天堂网地址 | 国产精品v欧美精品v日韩 | 中文字幕在线观看三区 | 麻豆91精品91久久久 | 91香蕉视频污在线 | 日韩国产精品毛片 | 韩国精品一区二区三区六区色诱 | av不卡免费看| 免费视频91 | 久久理论片 | 国产午夜精品理论片在线 | 九九精品在线观看 | 久久新视频 | 成人三级视频 | 午夜电影中文字幕 | 伊人色综合网 | 一级精品视频在线观看宜春院 | 伊人亚洲综合 | 美女免费网视频 | av在线最新 | 808电影免费观看三年 | 亚洲视频在线观看网站 | 久久综合狠狠综合 | 97超碰人人网 | 高清精品久久 | 日本中文字幕久久 | 久久久精品在线观看 | 91看片在线免费观看 | 91色一区二区三区 | 天天色天 | 久久精品国产成人 | 亚洲1区 在线 | 一二三区在线 | 久草免费在线观看视频 | 色综合夜色一区 | 国产91勾搭技师精品 | 日日爱999 | 在线观看视频h | 五月激情站| a黄在线观看 | 91精品网站 | 婷婷六月综合网 | av色影院| 综合网成人 | 日本黄色黄网站 | 91精品国产网站 | 亚洲综合五月天 | 高清免费在线视频 | 中文字幕黄色网址 | 狠狠久久婷婷 | 成人h视频在线播放 | 久久久久国产一区二区三区四区 | 国产成人精品午夜在线播放 | 欧美日韩一级视频 | 国产又黄又猛又粗 | 五月开心六月伊人色婷婷 | 一级淫片a| 国产99久久久国产精品免费看 | 久久社区视频 | 亚洲精品午夜久久久 | 亚洲女欲精品久久久久久久18 | 国内精品久久久久 | 免费a视频| 中文字幕第一页在线vr | 日韩精品一区二区三区视频播放 | 天天色图 | 国色天香永久免费 | 久久久综合九色合综国产精品 | 麻豆视频91 | 久久久精品欧美一区二区免费 | 国产成人在线免费观看 | 一区二区三区视频网站 | 国产精品一区二区麻豆 | 欧美俄罗斯性视频 | 国产精品麻豆三级一区视频 | 国产福利a | 午夜久草 | av免费试看| 中文网丁香综合网 | 91麻豆精品国产91久久久无需广告 | 天天做综合网 | 蜜臀久久99精品久久久无需会员 | 日韩欧美一级二级 | 精品一区二区免费视频 | 日日碰狠狠躁久久躁综合网 | 一区二区视频在线看 | 国产在线国偷精品产拍免费yy | 午夜精品久久久久久久99 | 亚洲精品国产精品国 | 日日夜夜网 | 亚洲狠狠婷婷综合久久久 | 夜夜夜影院 | 中文字幕一区二区三区四区视频 | 五月综合激情婷婷 | 天天色草 | 日本在线免费看 | 国产精品永久在线观看 | 免费a v在线 | 久久久久久久久久久久国产精品 | 久久高清国产 | 丁香六月网 | 在线一区av | 国产精品欧美 | 日韩一二区在线观看 | 看av免费网站 | www.天天综合 | 日韩大片在线免费观看 | 日韩在线高清免费视频 | 福利电影久久 | 免费高清在线观看成人 | 精品96久久久久久中文字幕无 | 黄色av三级在线 | 亚洲综合最新在线 | 免费在线观看污网站 | 999久久| 久久99国产精品免费网站 | 欧美色图亚洲图片 | 99久久综合精品五月天 | 99久久婷婷 | 依人成人综合网 | 欧美日视频| 免费一级片视频 | 香蕉视频国产在线观看 | 欧美日韩一区二区三区免费视频 | 国产v亚洲v | 干狠狠 | 国产精品综合在线 | 久草精品视频在线观看 | 色999视频 | 六月激情 | 欧美久久综合 | adn—256中文在线观看 | www.黄色片.com | 国产一级精品在线观看 | 9在线观看免费高清完整 | 最近日本韩国中文字幕 | 亚洲精品高清视频 | 日韩一区精品 | 天天摸天天操天天爽 | 91重口视频| 91av视频在线观看 | 中文字幕在线观看第三页 | 亚洲最大的av网站 | 91麻豆精品国产自产在线游戏 | 不卡的av在线 | 天天操天天舔天天爽 | 岛国av在线免费 | 91久久精品日日躁夜夜躁国产 | 最新日韩电影 | 国内精品久久久久影院日本资源 | 99夜色| 91成人黄色| 中文字幕大全 | 久久久91精品国产一区二区三区 | 狠狠88综合久久久久综合网 | 久久毛片高清国产 | 国产99久久精品一区二区永久免费 | 久久久成人精品 | 黄色av成人在线观看 | 99av国产精品欲麻豆 | 免费av的网站 | 色a资源在线 | 免费看污的网站 | 国产精品九九热 | 精品麻豆入口免费 | 91在线小视频 | 天无日天天操天天干 | 国产一区二区精品91 | 在线观看中文字幕一区二区 | 午夜免费视频网站 | 91麻豆国产 | 在线中文字幕网站 | 亚洲在线视频播放 | 欧美一区二区在线刺激视频 | 中文av资源站 | 9999在线观看 | av成人免费在线 | 99精品热视频只有精品10 | 在线免费观看黄色 | 四虎在线永久免费观看 | 亚洲黄色精品 | 欧美一级视频在线观看 | 亚洲狠狠操 | 一区二区三区视频在线 | av高清在线观看 | 在线观看av网 | 日本高清免费中文字幕 | 国产成人在线看 | 欧美日韩精品在线视频 | 波多野结衣在线播放一区 | 久久久久久综合 | 色狠狠综合天天综合综合 | 欧美日韩国产xxx | 亚洲激精日韩激精欧美精品 | 久久国产综合视频 | 日韩免费观看高清 | 一区二区三区高清在线 | 精品高清美女精品国产区 | 久久人人97超碰精品888 | 在线看黄网站 | 日韩黄色大片在线观看 | 国产三级视频 | 久久久午夜精品理论片中文字幕 | 97人人超碰在线 | 欧美午夜a | 亚洲成a人片77777潘金莲 | 九九爱免费视频在线观看 | 丰满少妇对白在线偷拍 | 成人在线播放免费观看 | 国产探花 | 最近中文字幕视频完整版 | 伊人狠狠色丁香婷婷综合 | 中文字幕在线观看视频免费 | 九七视频在线 | 人人玩人人添人人澡97 | 天天摸夜夜添 | 国产不卡在线观看视频 | 六月丁香激情网 | 黄色精品国产 | 一级片免费观看视频 | 99久久久久久久久 | 中文字幕在线日本 | 91成人看片 | 亚洲免费在线播放视频 | 午夜少妇一区二区三区 | 在线播放 亚洲 | 国产欧美精品在线观看 | 欧美亚洲专区 | 麻豆 91 在线 | 麻豆国产精品一区二区三区 | 国产美女免费观看 | 人人澡人人爽欧一区 | 日韩av图片 | 日日干夜夜草 | 999久久久免费视频 午夜国产在线观看 | 国产成人在线免费观看 | av在线亚洲天堂 | 在线亚洲天堂网 | 欧美日韩久久久 | 伊人宗合网 | 色999五月色 | 国产高清视频免费在线观看 | 国产成人精品综合久久久久99 | 国产精品 日韩精品 | 在线国产小视频 | 中文字幕在线视频第一页 | 国产资源在线观看 | 成年人av在线播放 | 久久激情五月激情 | 亚洲精品久久久久久久蜜桃 | 肉色欧美久久久久久久免费看 | 免费观看av | 91专区在线观看 | av黄色免费网站 | 2023年中文无字幕文字 | 日韩久久在线 | 婷婷丁香色 | 在线日韩视频 | 伊香蕉大综综综合久久啪 | 韩国在线视频一区 | 国产精品久久久久久久久久三级 | 色网址99| 亚洲专区在线 | 婷婷伊人网| 欧美一级性生活片 | 在线三级中文 | 亚洲永久精品在线 | 在线中文日韩 | 国产福利一区二区在线 | 国产亚洲精品福利 | 国产一区二区三区在线 | 婷婷丁香七月 | 国产黄色一级片 | 2021国产精品 | 91av原创| 日韩免费小视频 | 91视频在线观看免费 | 国内视频1区 | 成人在线免费av | 日批网站免费观看 | 国产视频一区二区在线观看 | 亚洲精品在线观看免费 | 射射射综合网 | 国产手机在线 | 国产又粗又猛又黄 | 91在线蜜桃臀 | 一区二区精品视频 | 国产一区二区精 | 国产在线精品一区二区 | 免费观看日韩 | 在线观看免费黄视频 | 国产特级毛片 | 免费中午字幕无吗 | 久久久激情网 | 日本成人黄色片 | 人人爽人人乐 | 天天干夜夜干 | 91在线一区 | 日日日爽爽爽 | 91大神精品视频在线观看 | 视频一区二区视频 | 国产精品久久久久永久免费观看 | 日韩免费网址 | 久久精品国产免费观看 | 夜夜夜夜爽 | 天天干天天插伊人网 | 色先锋资源网 | 在线观看av中文字幕 | 日韩三级免费 | 色福利网站 | 亚洲另类在线视频 | 中文字幕亚洲情99在线 | 国产麻豆精品95视频 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产精品一区免费观看 | 国产一区二区网址 | 96av麻豆蜜桃一区二区 | 欧美激情视频一二三区 | 午夜精品福利一区二区 | 免费看黄色毛片 | 亚洲最大激情中文字幕 | www.久草.com| 国产精品久久久久久久久蜜臀 | 开心激情五月网 | 久久爱资源网 | 成人高清在线 | 69视频永久免费观看 | 蜜臀av在线一区二区三区 | 久久精品一区二区三区视频 | 成人三级黄色 | 日韩在线观看一区 | 五月开心激情 | 999成人| 热久久国产 | 国产精品美女久久久久久久 | 亚洲黄色片一级 | 一区二区三区电影在线播 | 欧美激情视频一区二区三区 | 国产高h视频 | 国产特级毛片aaaaaaa高清 | 亚洲精品在线观 | 日韩欧美在线综合网 | 婷婷五情天综123 | 久久综合狠狠综合久久狠狠色综合 | 欧美精品在线观看免费 | 天天弄天天干 | 91色国产| 久久艹人人 | 国产精品电影在线 | 美女网站视频免费黄 | 麻豆影音先锋 | 99热播精品 | 中文字幕在线观看免费高清电影 | 欧美一区日韩精品 | 亚洲免费高清视频 | 福利视频一区二区 | 91最新视频在线观看 | 免费在线观看不卡av | av在线免费播放网站 | 久久特级毛片 | 欧洲精品码一区二区三区免费看 | 国产看片网站 | 亚洲精品国产精品国自产观看 | 欧美在线视频一区二区 | 欧美日韩午夜爽爽 | 久久久久久久国产精品影院 | 91免费看黄色 | 欧美精品资源 | 99成人精品 | 六月色播 | 一级黄色片在线 | 黄色一集片| 国产精品情侣视频 | 激情开心站 | 成人av在线网 | 一区二区三区免费在线 | 国产视频亚洲精品 | 天天天色综合a | 天天草天天干天天 | 成人在线视频在线观看 | 中文字幕在线视频一区 | 久久久久亚洲精品中文字幕 | 在线免费观看的av网站 | 中文字幕有码在线 | 97超碰在线视| 国产真实精品久久二三区 | 国产日产精品一区二区三区四区的观看方式 | 日日干日日操 | 99精品视频网站 | 亚洲每日更新 | 日韩精品中文字幕在线观看 | 欧美电影在线观看 | 亚洲欧洲精品一区二区精品久久久 | 超碰在线中文字幕 | 国产在线一线 | 久草视频国产 | 最近能播放的中文字幕 | 成人免费xyz网站 | 久草男人天堂 | 看av免费网站 | 国产精品一区二区免费 | 超碰人人av| 蜜臀av网站| 日韩高清一二三区 | 激情综合六月 | 久久久高清视频 | 九九在线视频 | 国产成人一区二区三区在线观看 | 国产美女久久久 | 亚洲在线高清 | 欧美另类交人妖 | 国产乱码精品一区二区蜜臀 | 亚洲国产电影在线观看 | 精品国产一区二区三区免费 | 能在线看的av | 天天摸天天干天天操天天射 | 午夜丁香视频在线观看 | 久久久久久久av麻豆果冻 | 欧美一区二区三区激情视频 | 最新国产在线 | 97久久久免费福利网址 | 久久综合色播五月 | 果冻av在线 | 亚洲精品午夜久久久久久久久久久 | 国产精品美女久久久久久网站 | 天天拍夜夜拍 | 91精品国产网站 | 97视频亚洲 | 99视频免费看 | 欧美激情精品久久久久久 | 久久理论影院 | 国产一级一级国产 | 欧美在线a视频 | 一区二区三区免费在线观看 | 午夜精品久久久久久久久久久久久久 | 久久女同性恋中文字幕 | 五月天av在线| 最新国产在线观看 | 伊在线视频| 欧美大片第1页 | 欧美激情在线看 | 久久福利小视频 | 国产一区二区在线播放 | 涩涩成人在线 | 亚洲少妇影院 | 久久免费视频在线 | 亚洲国产精品一区二区尤物区 | 手机av电影在线 | 久久精品免费 | 一级片免费观看视频 | 国产成人一级 | 中文字幕有码在线观看 | 一级片免费观看视频 | 91精品国产91久久久久 | 久久欧美精品 | 国产成人三级一区二区在线观看一 | 成人免费观看网站 | 日韩欧美一区二区三区免费观看 | 国产日产精品一区二区三区四区 | 日韩视频一区二区在线 | 欧美日本在线观看视频 | 在线不卡a | 国产精品手机在线播放 | 欧美三级高清 | 免费在线观看中文字幕 | 亚洲伦理一区 | 韩国av在线 | 久久久91精品国产 | 久久99精品国产麻豆宅宅 | 激情五月综合 | 91精品91 | 在线播放国产精品 | 中文字幕在线观看完整 | www.狠狠操 | 免费亚洲婷婷 | 97视频网站 | 亚洲男人天堂a | 日本中文字幕在线一区 | 国产精品一区免费看8c0m | 亚洲一区精品二人人爽久久 | 91污在线 | 91尤物在线播放 | 国产麻豆电影在线观看 | 久久69精品 | 国产午夜亚洲精品 | 夜夜躁狠狠躁日日躁 | 99久久99久国产黄毛片 | 免费看一级黄色大全 | 超碰人在线 | 97国产一区 | 国产精品一区二区在线免费观看 | 中文字幕久久久精品 | 国产1区2区3区精品美女 | 久久久久五月天 | 五月婷婷综合色拍 | av中文字幕在线观看网站 | 国产 欧美 在线 | 国产福利精品视频 | 久久久久久综合 | aav在线| 国产精品久久久久久久久久久久午夜 | 精品在线观看一区二区 | 久久露脸国产精品 | 一级黄色片在线 | 精品亚洲免费 | 国产一线在线 | 久久1电影院 | 日日夜夜精品视频天天综合网 | 右手影院亚洲欧美 | www.天天射.com | 国产一级不卡视频 | 成人免费共享视频 | 国产福利av在线 | 97av视频 | 一区二区三区在线观看免费 | 88av色| 日韩欧美电影 | 精品亚洲在线 | 欧美日韩不卡在线观看 | 日本资源中文字幕在线 | 99久热精品 | 国产97碰免费视频 | 欧美日韩国产一区二 | 四虎8848免费高清在线观看 | avwww在线 | 亚洲小视频在线 | 免费a级大片 | 国产成人在线免费观看 | 久久久久久片 | 91自拍91 | 欧美日韩国产免费视频 | 美女网色 | 久草在线视频免费资源观看 | 精品久久一区二区 | 婷婷伊人五月 | 亚洲片在线资源 | av在线免费不卡 | 国产精品黄色av | 欧美a级成人淫片免费看 | 国产成人精品综合 | 久久视频一区二区 | 日韩毛片久久久 | 在线免费视频 你懂得 | 91亚洲国产成人久久精品网站 | 黄网站色视频免费观看 | 欧美激情综合五月色丁香小说 | 国产高清av | 日本3级在线观看 | 少妇bbw搡bbbb搡bbb | 中文字幕在线观看完整版 | 99精品视频网 | 中文字幕在线观看国产 | 国产一区二区三区免费在线观看 | 国产成人精品在线播放 | 中文字幕成人 | 日韩色区| 日韩高清在线一区二区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 96精品高清视频在线观看软件特色 | 亚洲成人家庭影院 | 天天干夜夜夜 | 婷婷国产一区二区三区 | 精品视频免费看 | 视频国产在线观看18 | 亚洲午夜精品久久久久久久久久久久 | 亚洲成免费 | 国产一级在线 | 日本黄色免费在线 | 免费在线观看黄色网 | 日免费视频 | 国产在线小视频 | 天天av天天 | 精品国产免费一区二区三区五区 | 成人禁用看黄a在线 | 久久这里有精品 | 午夜91视频 | 亚洲一区二区三区精品在线观看 | 亚洲精品mv在线观看 | 亚洲夜夜综合 | 91在线视频播放 | 天天操伊人 | 亚洲专区在线播放 | 免费a级观看 | 在线观看黄色大片 | 精品96久久久久久中文字幕无 | 中国美女一级看片 | 少妇按摩av | 激情综合五月婷婷 | 亚洲成a人片77777kkkk1在线观看 | 国产精品一区二区吃奶在线观看 | www.色五月.com| 国产在线中文字幕 | 91在线观看黄 | 久久超碰在线 | 波多野结衣小视频 | 99re中文字幕 | 欧美成人亚洲成人 | 久久艹人人 | 国产美女精品人人做人人爽 | 韩国av电影在线观看 | 成人精品亚洲 | 女人久久久久 | 91成人破解版 | 久久综合九色99 | 超碰人人超 | 国产精品午夜久久 | 98超碰在线观看 | 国产黄色免费电影 | 操久| 国产一二三四在线观看视频 | 黄色大片免费网站 | 亚洲在线不卡 | 97精品国产97久久久久久免费 | 色网站中文字幕 | 波多野结衣一区 | 西西4444www大胆艺术 | 免费视频xnxx com | 欧美在线观看视频一区二区 | 国产精品成人免费一区久久羞羞 | 欧美日韩视频免费 | 天天色天天操综合 | 国产精品一区二区三区在线播放 | 精品在线免费观看 | 麻豆91在线看 | 九九九热 | 三级在线播放视频 | 欧美激情综合五月色丁香小说 | 色婷婷激情五月 | 国产成人在线播放 | 久草视频一区 | 日韩激情综合 | 国产精品麻豆99久久久久久 | 亚洲精品乱码久久久一二三 | 狠狠狠狠狠狠狠 | 日韩av一区二区三区四区 | 国产精品女人网站 | 国产色综合天天综合网 | 国产理论免费 | 在线黄av | 亚洲国产精品资源 | 国产免费嫩草影院 | 狠狠色丁香婷婷综合久久片 | 狠狠色丁香婷婷综合久小说久 | 色综合久久天天 | 青青草国产精品 | 欧美91在线| 亚洲欧美视频网站 | 国内精品久久久 | 91精品国产欧美一区二区成人 | 日韩av快播电影网 | 99自拍视频在线观看 | 中文字幕人成乱码在线观看 | 国产vs久久| 国产精品s色 | 欧美久久久久久久久久久久 | 色www.| 5月丁香婷婷综合 | 欧美男同视频网站 | 国产精品 日韩 欧美 | 日韩精品你懂的 | 色一色在线| 九九视频精品在线 | av在线播放免费 | 国产日韩欧美精品在线观看 | 亚洲韩国一区二区三区 | 国产资源免费在线观看 | 久久精品国亚洲 | 久久婷婷国产色一区二区三区 | 婷婷六月天丁香 | 日韩av免费一区二区 | 国产婷婷色 | 久久一级片 | 热久久国产精品 | 成人免费视频网 | 欧美日韩激情视频8区 | 国产日韩精品在线观看 | 国产婷婷精品av在线 | 五月婷婷综合在线 | 欧亚日韩精品一区二区在线 | 成人av电影免费观看 | 最近免费在线观看 | 中文字幕亚洲精品在线观看 | aa一级片| 久久精品中文视频 | 97人人爽| 91中文字幕永久在线 | 色欲综合视频天天天 | 99中文字幕| 69精品在线观看 | 亚洲年轻女教师毛茸茸 | 成人高清av在线 | 97成人在线免费视频 |