Ⅰ 如何在linux下用C/C++語言操作資料庫sqlite3
1.SQLite資料庫特點(1)SQLite資料庫是開源的嵌入式資料庫,無需獨立的資料庫引擎,直接嵌入到應用程序進程中,因此,通過API,應用程序可以直接操作它。(2)事務的處理是原子的,一致的,獨立的,可持久化的(ACID),即使在系統崩潰和掉電後。(3)SQLite資料庫通過獨占性與共享鎖來實現事務的獨立處理。(4)一個單獨的跨平台的磁碟文件就能夠存儲一個資料庫。(5)能支持2TB級的數據。(6)自包含,無外部依賴性。(7)支持NULL,INTEGER,NUMERIC,REAL,TEXT和BLOG等數據類型。(8)SQLite資料庫沒有用戶帳戶的概念。資料庫的許可權僅依賴於文件系統。2.SQLite資料庫的基本操作(1)建立資料庫sqlite3data.sqlite3在當前目錄下建立了名為data.sqlite3的資料庫。(2)建立數據表createtablecall_list(idINTEGERPRIMARYKEY,typeNUMERIC,telnumNUMERIC,bttimeTEXT,tcountNUMERIC,charge_rateNUMERIC,charge_sumNUMERIC);建立了名為call_list的數據表,有7個欄位,分別為id,type,telnum,bttime,tcount,charge_sum.charge_rate.(3)向數據表中插入數據insertintocall_listvalues($num,1,2,'new',4,5,6);(4)查詢數據表中的數據select*fromcall_list;(5)修改call_list表中的數據updatecall_listsetid=00001000whereid=10001;(6)刪除表中的數據記錄deletefromcall_listwhereid=1000;(7)SQlite中的其它常用命令.tables-列出所有的資料庫中的數據表.schematablename-列出指定數據表的結構.quit-離開資料庫(8)SQLite資料庫的導入與導出a.將data.sqlite資料庫的數據全部導出:sqlite3data.sqlite>.outputdd.sql>.mp這樣,數據就保存在dd.sql的文件中,注意這個文件不是資料庫,而是SQL語句。然後再把這些數據導入到另外一個資料庫data1.sqlite資料庫中。sqlite3data1.sqlite>.readdd.sql這樣,數據就從data.sqlite資料庫復制到data1.sqlite資料庫中去了。b.將數據表中的數據導出到a.txt中去.outputa.txt//輸出重定向到a.txtselect*fromcall_list;c.將導出的表中的數據導入到另一個資料庫的新建的表中去如:當從data.sqlite中的call_list表中導出了數據,再導入到另外一個資料庫表call中去。首先建立表call.然後.importa.txtcall即可。3.C語言操作Sqlite資料庫API:intsqlite3_open(constchar*filename,sqlite3**ppdb);第一個參數用來指定資料庫文件名。第二個參數是一個資料庫標識符指針。如果打開資料庫成功,則返回0,否則返回一個錯誤代碼。intsqlite3_close(sqlite3*);傳遞的參數是資料庫標識符指針用來關閉資料庫,操作成功是返回0,否則返回一個錯誤代碼。intsqlite3_errcode(sqlite3*db);constchar*sqlite3_errmsg(sqlite3*db);constchar*sqlite3_errmsg16(sqlite3*db);這三個函數都是返回錯誤信息,第一個函數返回的是最近調用資料庫介面的錯誤代碼,第二,第三個函數是返回最近調用資料庫介面的錯誤信息。第二個函數返回的錯誤信息是用UTF-8編碼的,第三個函數返回的錯誤信息是用UTF-16編碼的。intsqlite3_exec(sqlite3*,constchar*sql,int(*callback)(void*,int,char**,char**),void*,**errmsg);這個函數非常重用,是用來執行SQLite資料庫的SQL語句的。第一個參數是sqlite資料庫標識符指針。第二個參數是要執行的SQL語句。第三個參數是一個回調函數,在執行查詢操作時用到,其它的操作可以傳空值即NULL。第四個參數是傳遞給回調函數第一個參數的實參。第五個參數是一個錯誤信息。回調函數:intcallback(void*,intargc,char**argv,char**cname);第一個參數是從sqlite3_exec傳遞過來的參數,可以為任意的類型。第二個參數是查詢的列數。第三個參數是查詢結果集的值。第四個參數是列名。intsqlite3_get_table(sqlite3*db,constchar*sql,char***result,int*row,int*col,char**errmsg);這個函數主要是用來查詢的。第一個參數是資料庫描述符指針第二個參數是SQL語句。第三個參數是查詢的結果集。第四個參數是結果集中的行數。第五個參數是結果集中的列數。第六個參數是錯誤信息。它查詢出的行數是從欄位名開始的。即第0行是欄位名。實例:/**本例主要實現用Sqlite的回調函數進行查詢intsqlite3_exec(sqlite3*,constchar*sql,int(*callback)(void*,int,char**,char**),void*,errmsg);第一個參數是資料庫標識符第二個參數是要執行的sql命令第三個參數是回調函數第四個參數是回調函數的第一個參數第五個參數是用於指示錯誤信息其中回調函數的形式:int_sql_callback(void*arg,intargc,char**argv,char**cname);第二個參數指示結果集中的列數第三個參數是保存結果集的字元串第四個參數是結果集中的列名**/#include#include#include#include#include#includeint_call_back(void*arg,intargc,char**argv,char**cname);intmain(){intres;constchar*dbfile="data.sqlite1";char*errmsg=NULL;sqlite3*db;res=sqlite3_open(dbfile,&db);if(res!=0){perror("資料庫打開失敗");exit(EXIT_FAILURE);}//創建一張數據表constchar*sqlcreate="createtablecall_list(idINTEGERPRIMARYKEY,typeNUMERIC,telnumNUMERIC,bttimeTEXT,tcountNUMERIC,charge_rateNUMERIC,charge_sumNUMERIC)";res=sqlite3_exec(db,sqlcreate,NULL,NULL,&errmsg);if(res!=0){perror("建立數據表失敗");exit(EXIT_FAILURE);}//插入100000條數據intnum=0;structtimevaltv;gettimeofday(&tv,NULL);longold=tv.tv_sec;while(num<100000){constchar*sqlinsert="insertintocall_listvalues($num,1,2,'new',4,5,6)";res=sqlite3_exec(db,sqlinsert,NULL,NULL,&errmsg);//插入時不需要用到回調函數if(res!=0){perror("插入失敗");exit(EXIT_FAILURE);}num++;}gettimeofday(&tv,NULL);printf("插入100000條數據的時間為:%d秒/n",(tv.tv_sec-old));//更新constchar*sqlupdate="updatecall_listsetid=00001000whereid=10001";res=sqlite3_exec(db,sqlupdate,NULL,NULL,&errmsg);if(res!=0){perror("更新數據失敗");exit(EXIT_FAILURE);}//刪除constchar*sqldelete="deletefromcall_listwhereid=1000";res=sqlite3_exec(db,sqldelete,NULL,NULL,&errmsg);if(res!=0){perror("刪除數據失敗");exit(EXIT_FAILURE);}//查詢constchar*sqlquery="select*fromcall_list";res=sqlite3_exec(db,sqlquery,&_call_back,NULL,&errmsg);if(res!=0){printf("%s/n",errmsg);perror("執行失敗/n");exit(EXIT_FAILURE);}res=sqlite3_close(db);if(res!=0){perror("資料庫關閉失敗");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}int_call_back(void*arg,intargc,char**argv,char**cname){inti;//二重指針可以看成指針數組for(i=0;i
Ⅱ linux下的c/c++開發
我就是做LINUX下的C開發的。
准確的說,LINUX下C才是主要的開發語言,但是寫應用程序還是要用面向對象的,尤其是圖形界面的,不如QT和X和GTK等等。下面說的必須要求你C語言學的很好而且會使用LINUX的情況下。LINUX常用命令要熟悉。
要學LINUX下的C編程,先看一兩本LINUX下C的書比較好,這個你自己選擇,但是經典的書還是好一些,比如《LINUX程序設計》、《UNIX環境高級編程》,看這些的時候把書上的例子選擇一些自己編譯一下,哪怕是照著敲進去,事半功倍。
看完一本這樣的書,你對LINUX系統編程的知識就足夠了,這時候你可以開始閱讀一些LINUX下的源代碼來鍛煉和提升能力了,LINUX下有很多開源的軟體,你可以搜一下,應用程序也很多,但是最好的源代碼還是LINUX內核。
推薦一本簡單的內核書《linux內核完全剖析0.12》,這個講的是0.12內核,代碼量只有1萬多行的內核,現在的2.6估計一千萬,一輩子看不完。這個書講了很多X86體系結構的知識,這時理解內核必備的,匯編你要能看懂。
能看懂內核代碼了,就說明你至少不是初學者了,現在肯定能開發項目了,有了經驗後,恭喜你,你就成為一名LINUX程序員了。
再由這些基礎後,你就可以選擇一些具體的開放方向了,比如底層一點,驅動,協議等、或者嵌入式應用等、或者是QT等。不過這就是後話了,呵呵
我自己的一些體會,希望能對你有用。
Ⅲ 有誰知道linux下有什麼好的C庫嗎,較通用,有list的
樓上的,有一個libgraph的庫可以實現在linux上用C繪制簡單的折線圖及各類圖形,它基於SDL庫,但它是以應用程序的方式彈出一個窗體,不明白如何才能將其以cgi程序的方式輸出至web頁面,苦悶中!!! 查看>>
Ⅳ linux 下的c語言編程
我試過了!!可以啊!!
Ⅳ C/C++/Linux/編程/開源方面的問題:Mozilla和GNU的區別
許多混亂就始於你不知道License到底是什麼,到底有什麼含義。當你對你的產品使用License時,並不意味著你放棄了任何權利,你依然對其擁有原著作權。License只是授予他們於特定權利來使用你的產品。
License只是把你的作品釋放到公有領域,或者給各個拷貝賦予許可權。也意味著你放棄了版權收入,別人也沒有義務把你列為原作者或貢獻者。
開放源代碼許可協議更容易為他人作出貢獻,而不必尋求特別的許可。它也可以保護你作為原創者的權利,至少確認了你的貢獻。它還可以保證你的工作不為別人所剽竊。
GNU General Public License
GNU General Public License (GPL)的可能是開源項目最常用的許可證。GPL賦予和保證了開源項目開發者廣泛的權利。基本上,它允許用戶合法復制,分發和修改軟體。 這意味著你可以:
* 復制軟體
復制軟體到自己的伺服器,客戶端的伺服器,你自己的電腦,幾乎任何你想要的地方,而且沒有數量限制。
* 發布軟體
發布你想要的軟體,例如,在你的網站提供下載鏈接,刻成光碟,列印出來等等。
* 收取費用
如果你想在向別人提供軟體時收費,如設置在別人的網站上或者其他用途時。GPL允許你這么做,但是你必須給客戶提供一個GPL副本,告訴他們可以在其他地方得到免費版本。當然最好在此之前,告訴客戶,你為什麼收費。
* 可以任意修改
如果你想添加或刪除功能,沒問題。如果想在其他項目中使用部分代碼,也是可以的,但是唯一的限制是此項目也必須按GPL發布。
商業軟體不能使用GPL協議的代碼。
GNU Lesser General Public License
還有另一個GNU License:GNU Lesser General Public License (LGPL)。比起GPL它授予的許可權較少。一般來說,LGPL比較適合連接到非GPL或者非開源文件的庫文件。由於GPL的規定,使用到部分GPL代碼的軟體,必須也使用GPL,開發人員不能使用GPL來開發收費軟體或者專有軟體。LGPL則沒有這方面的要求,不要求使用與部分代碼相同的 License。
商業軟體可以使用,但不能修改LGPL協議的代碼。
BSD License
BSD License與其他自由軟體License相比,如GPL,限制更少。但是請注意到BSD License兩種版本之間的差別:New BSD License/Modified BSD License 和Simplified BSD License/FreeBSD License。它們兩者都是於GPL兼容的自由軟體License。
New BSD License (」3-clause license」) 可以用於任何作為版權聲明和保證許可的免責聲明的目的,可以通過無限長的再分發來得以維持,也就是說如果再發布的產品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協 議。它還有一個特殊限制條款,不用特別的許可就是限制使用派生工作的工作者名字,也就是說不可以用開源代碼的作者/機構名字和原來產品的名字做市場推廣。
New BSD License和Simplified BSD License的主要區別是,後者忽略了非認可條款。
商業軟體可以使用,也可以修改使用BSD協議的代碼。
MIT License
MIT是和BSD一樣寬松的許可協議,作者只想保留版權,而無任何其他了限制.也就是說,你必須在你的發行版里包含原許可協議的聲明,無論你是以二進制發布的還是以源代碼發布的。
* 你可以使用,復制和修改軟體
* 你可以免費使用軟體或出售
* 唯一的限制是,它是必須附有MIT授權協議
商業軟體可以使用,也可以修改MIT協議的代碼,甚至可以出售MIT協議的代碼。
Mozilla Public License 1.1 (MPL)
MPL協議允許免費重發布、免費修改,但要求修改後的代碼版權歸軟體的發起者。這種授權維護了商業軟體的利益,,它要求基於這種軟體得修改無償貢獻版權給該軟體。這樣,圍繞該軟體得所有代碼得版權都集中在發起開發人得手中。但MPL是允許修改,無償使用得。MPL軟體對鏈接沒有要求。
商業軟體可以使用,也可以修改MPL協議的代碼,但修改後的代碼版權歸軟體的發起者。
Common Development and Distribution License
CDDL(Common Development and Distribution License,通用開發與銷售許可)開源協議,是MPL(Mozilla Public License)的擴展協議,它允許公共版權使用,無專利費,並提供專利保護,可集成於商業軟體中,允許自行發布許可。
商業軟體可以使用,也可以修改CDDL協議的代碼。
Apache License
Apache Licence是著名的非盈利開源組織Apache採用的協議。該協議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權,同樣允許代碼修改,再發布 (作為開源或商業軟體)。需要滿足的條件:
* 需要給代碼的用戶一份Apache License。
* 如果你修改了代碼,需要在被修改的文件中說明。
* 在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協議,商標,專利聲明和其他原來作者規定需要包含的說明。
* 如果再發布的產品中包含一個Notice文件,則在Notice文件中需要帶有Apache License。你可以在Notice中增加自己的許可,但不可以表現為對Apache License構成更改。
Apache Licence也是對商業應用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要並作為開源或商業產品發布/銷售。
商業軟體可以使用,也可以修改使用Apache協議的代碼。
Eclipse Public License
EPL是一個與CPL相類似的許可證,任何擴展自Eclipse源碼的代碼也必須是開源的。
Creative Commons
Creative Commons(CC)的許可證不太開放源代碼授權,它們通常用於設計項目。 CC許可證有著寬廣的定義,每個定義都會授予一定的權利。它有四個基本部分,可以單獨或者組合使用。下面是部分概述:
* 署名
作者必須是作品的原創者。 除此之外,作品可以修改,分發,復制和以其他方式使用。
* 相同方式共享
工作可以修改,分發等等,但必須在一個許可證下。
* 非商業
可以修改,分發等,但不用於商業目的。 關於什麼是「商業」,說法比較含糊(沒有提供明確的定義),因此您可能需要在自己的項目中澄清這一點。
* 禁止修改
這意味著您可以復制和分發許可工作,但你不能以任何方式修改,或在原有的基礎開發。
商業軟體的使用要遵從CC協議的具體規定,最嚴格的許可證將是「署名,非商業,不能修改」的授權。這意味著你可以自由共享的工作,但不能改變它,你必須把它歸功於原創者。
Common Public License 1.0
Common許可證有一些細節性的規定值得參考:
* 明確了專利授權。一般的開源軟體都明確源代碼的版權人將自己的修改權、復制權等版權權利向公眾許可,但保留署名權,而Common許可證在此基礎上還明確假如源代碼中含有專利權,源代碼專利權人將復制、使用的專有權利向公眾許可。
* 規定可以將源代碼及修改過的源代碼與其他類型的不受本許可證約束的代碼結合,以新產品的形式發布,只要其中經該許可證獲得的源代碼及修改過的源代碼能按該許可證的要求發布即可。
* 細化了該許可證終止的情形,包括發生專利侵權訴訟。
* 明確了一個獨立承擔責任的原則,就是假如按該許可證使用源代碼的使用者將獲得的源代碼應用於商業使用,那麼他就要對在商業應用中出現的由於使用該源代碼程序而產生的侵權訴訟承擔完全責任。這一條規定是比較特殊的,絕大多數開源軟體許可證都不這么要求。
商業軟體可以使用,也可以修改Common協議的代碼,但要承擔代碼產生的侵權責任。
Ⅵ 在linux上有哪些C語言的代碼靜態/動態分析工具 最好開源的
用cygwin咯
win下模擬linux平台
需要c的話只要gcc就好,編輯器用vi或者emacs什麼的都可以
完全開源免費
Ⅶ 大神們,常用的linux c/c++ http開源庫有哪些,給個推薦吧
客戶端庫有libcurl
服務端庫有基於libevent的libevhtp
Ⅷ linux Development Tools 包括哪些軟體
編輯器:
vi:老牌編輯器,在各個unix和unix-like平台都可以找到 。
emacs:GNU項目開發的編輯器,功能強大擴展性強,絕對不是一個編輯器那麼簡單 。
代碼打補丁工具:
diff & patch:一對好搭擋,diff用來生成代碼補丁,而patch則用來給代碼打補丁 。
項目構建工具:
make(Makefile):常用的項目構建工具,用一個Makefile就可以從整個項目的代碼中構建各個目標 。
autotool(包括Autoconf, Automake 和 Libtool):方便在項目中生成標準的Makefile,為許多自由和開源軟體項目所使用 。
版本控制工具:
cvs:老牌的版本控制工具,適用於集中式版本控制,為許多項目服務過,現在略顯疲態
subversion:一個為了代替cvs而開發的工具,解決了cvs的一些詬病 。
GNU Arch:GNU項目開發的版本控制工具,屬於分布式版本控制工具 。
git:Linus Torvalds為內核版本控制所開發的工具,當然也適用於普通應用程序,也屬於分布式版本控制工具 。
C庫:
glibc:GNU項目開發的C庫,很龐大和全面,是許多自由和開源軟體的基石。
uclibc:為嵌入式系統所開發的C庫,比glibc小得多,但是對glibc保持很高的兼容,基於glibc的軟體很容易移植到uclibc上 。
newlib:另一個為嵌入式系統所開發的C庫 。
diet libc:同樣是為嵌入式系統所開發的C庫 。
二進制和目標文件處理工具:
binutils:GNU項目所開發的二進制和目標文件處理工具包,包括多種開發過程所需的工具:連接器、匯編器、一系列的二進制和目標文件處理工具還有一個性能分析器。
編譯器:
gcc:GNU
項目所開發的全能編譯器,它支持的語言包括C、C++、Objective-C、Fortran、Java和Ada,它支持的處理器包括i386、
MIPS、ARM、PowerPC、IA64等等,此外你還可以為它添加其他語言前端和其他處理器後端。gcc性能不俗,還支持交叉編譯,為這個星球;)
許多軟體項目所採用。
源代碼調試器:
gdb:GNU項目所開發的源代碼調試器,功能強大,是程序員的好助手 。
內存管理檢查器:
valgrind:非常優秀的內存檢查器,可以程序中的內存錯誤。另外還可以對cache的使用和堆(也可以包括棧)的使用進行分析,能夠優化代碼 。
調用跟蹤器:
strace:系統調用跟蹤器,可以跟蹤程序所調用的系統調用 。
ltrace:動態庫調用跟蹤器,可以跟蹤程序所調用的動態庫介面 。
性能分析器:
gprof:binutils中帶的性能分析器,可以優化代碼,提高程序速度 。
qprof:另一個性能分析器,支持動態庫的性能分析和多線程、多進程性能分析
oprofile:一個系統范圍的性能分析器,使用內核模塊和一個後台進程進行數據採集,不但可以獲得某個進程的性能分析數據還可以獲得內核的性能分析數據。
Ⅸ 怎麼用linux寫c語言
Linux正在成為開發人員的編程天堂,成為開源和免費操作系統。 Turbo C編譯器已經是一種編譯程序的舊方法,所以讓程序員轉向Linux以獲得新的編程環境。 在本文中,我們將解釋如何編寫,編譯和運行一個簡單的C程序。 這將成為您遷移到可以在Linux上編寫和執行的更復雜和有用的C程序的基礎。
我們在Ubuntu 18.04 LTS系統上運行了本文中提到的步驟和命令。
我們將使用Linux命令行工具Terminal,以編譯一個簡單的C程序。 要打開終端,您可以使用Ubuntu Dash或Ctrl + Alt + T快捷方式。
第1步:安裝build-essential軟體包
為了編譯和執行C程序,您需要在系統上安裝必要的軟體包。 在Linux終端中以root用戶身份輸入以下命令:
sudo apt-get install build-essential
系統會要求您輸入root用戶密碼; 安裝過程將在此之後開始。 請確保您已連接到互聯網。
第2步:編寫一個簡單的C程序
安裝必要的軟體包之後,讓我們編寫一個簡單的C程序。
打開Ubuntu的圖形文本編輯器,將以下示常式序寫入或復制到其中:
#include<stdio.h>
int main()
{
printf("nA sample C program www.linuxidc.comnn");
return 0;
}
然後使用.c擴展名保存文件。 在這個例子中,我將我的C程序命名為linuxidc.c
或者,您可以通過gedit中的終端編寫C程序,如下所示:
gedit linuxidc.c
這將創建一個.c文件,您可以在其中編寫和保存程序。
第3步:使用gcc編譯C程序
在終端中,輸入以下命令以生成您編寫的程序的可執行版本:
句法:
$ gcc [programName].c -o programName
示例:
$ gcc linuxidc.c -o linuxidc
Ⅹ 新手:Linux下使用第三方C庫(openssl),是調用.so文件還是直接調用.h文件
不管什麼庫文件,你都既要在包含.h文件(不然編譯通不過:有未聲專明的函數),也屬要在gcc選項裡面指定.so文件的位置(不然鏈接通不過:未知的符號)
比如
gcc -I include_path -L lib_path -lyourlib
include_path改成你頭文件的目錄
lib_path改成你動態庫文件的目錄
-lyourlib 改成l加上你要引用的庫文件名字
比如libpthread.so就改成-lpthread