青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我生如山

#

[導入][轉載]個人收藏的編程下載資源全部公布

java方面的:
it人資訊交流網
http://www.it315.org
這個網站是我最近才發現的,雖然內容不多,但是提供的相關java工具挺齊全。還有就是里面提供了java教學視頻錄象的免費下載,好像一兩周更換一段。個人覺得挺適合初學者的,尤其是那個classpath的設置,講的很透徹,大家有空可以看一看。

java官方站點(英文)
http://java.sun.com
要想了解最新的java動態,下載最新的java相關,比如j2se、j2ee、j2se的最新jdk版本就來這里吧。

java中文站
http://www.java-cn.com
這個可能大家都知道,不用說了,他提供的java資源是最豐富的。注冊論壇是免費的,還送積分,用積分可以下載軟件和電子書等,如果積分用完了,就需要自己發表一些文章來賺新的積分。

中文java網站
http://www.cn-java.com
跟上面站點類似的一個站,宗旨就是:為java愛好者服務。值得一看!

鋒網
http://www.ijsp.net/tech/book/index.jsp
綜合性的java網站,內含“下載中心”、“教程教學”等欄目。

java動力
http://eww.cn
網站的內容可以,但是最為出色的是它所運用的flash技術,我就不在這里多說了,大家去看看就知道了,一個字“酷”!!!

vc方面的:
vc知識庫
http://www.vckbase.com
這個網站就不用多說了,學習vc必去之地。網站專門提供了免費的ftp下載,好東東巨多!

vc之路
http://www.vcroad.com
綜合軟件開發網站,以vc為主。“資源中心”有許多值得下載的東東。

visual c++/mfc開發指南
http://www.vchelp.net
以講述windows開發為主的站點,提供了最新的源代碼,開發工具,開發資料,開發教程和對好的開發站點,開發工具,圖書做介紹,同時為從事開發的朋友提供發布自己開發的軟件,代碼和工具場所。

c維視點
http://www.c-view.org/root/index.htm
最近發現的vc好站,書籍、軟件、代碼下載一應具全!!!


游戲開發:
風云工作室
http://member.netease.com/~cloudwu/2000/index.html

標點游戲制作
http://makegame.myetang.com/

未來開發者
http://www.fdev.net/


綜合的:
中國軟件網
http://www.csdn.net
中國最大的開發者網絡,他之所以著名就是因為他的論壇,大家有空可以去看看,能下到很多不錯的東東,另外也是交流學習的好地方。

電子書籍的:
http://www.itebook.net

最后公布一個巨好的,狂多的電子書下載
http://www.pdown.net
還有巨好的
http://www.codestudy.net/default.asp

我會不斷完善這個帖子,要是斑竹允許,請置頂


若我 2008-10-27 13:28 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/10/27/65195.html

posted @ 2008-10-27 13:28 悟山 閱讀(138) | 評論 (1)編輯 收藏

[導入]轉:(一)深入淺出理解索引結構

(一)深入淺出理解索引結構

實際上,您可以把索引理解為一種特殊的目錄。微軟的SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,我們舉例來說明一下聚集索引和非聚集索引的區別:

其實,我們的漢語字典的正文本身就是一個聚集索引。比如,我們要查“安”字,就會很自然地翻開字典的前幾頁,因為“安”的拼音是“an”,而按照拼音排序漢字的字典是以英文字母“a”開頭并以“z”結尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”開頭的部分仍然找不到這個字,那么就說明您的字典中沒有這個字;同樣的,如果查“張”字,那您也會將您的字典翻到最后部分,因為“張”的拼音是“zhang”。也就是說,字典的正文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。

我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為“聚集索引”。

如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據“偏旁部首”查到您要找的字,然后根據這個字后的頁碼直接翻到某頁來找到您要找的字。但您結合“部首目錄”和“檢字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“張”字,我們可以看到在查部首之后的檢字表中“張”的頁碼是672頁,檢字表中“張”的上面是“馳”字,但頁碼卻是63頁,“張”的下面是“弩”字,頁面是390頁。很顯然,這些字并不是真正的分別位于“張”字的上下方,現在您看到的連續的“馳、張、弩”三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然后再翻到您所需要的頁碼。

我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為“非聚集索引”。

通過以上例子,我們可以理解到什么是“聚集索引”和“非聚集索引”。

進一步引申一下,我們可以很容易的理解:每個表只能有一個聚集索引,因為目錄只能按照一種方法進行排序。

(二)何時使用聚集索引或非聚集索引

下面的表總結了何時使用聚集索引或非聚集索引(很重要)。

動作描述
使用聚集索引
使用非聚集索引

列經常被分組排序



返回某范圍內的數據

不應

一個或極少不同值
不應
不應

小數目的不同值

不應

大數目的不同值
不應


頻繁更新的列
不應


外鍵列



主鍵列



頻繁修改索引列
不應



事實上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某范圍內的數據一項。比如您的某個表有一個時間列,恰好您把聚合索引建立在了該列,這時您查詢2004年1月1日至2004年10月1日之間的全部數據時,這個速度就將是很快的,因為您的這本字典正文是按日期進行排序的,聚類索引只需要找到要檢索的所有數據中的開頭和結尾數據即可;而不像非聚集索引,必須先查到目錄中查到每一項數據對應的頁碼,然后再根據頁碼查到具體內容。

(三)結合實際,談索引使用的誤區

理論的目的是應用。雖然我們剛才列出了何時應使用聚集索引或非聚集索引,但在實踐中以上規則卻很容易被忽視或不能根據實際情況進行綜合分析。下面我們將根據在實踐中遇到的實際問題來談一下索引使用的誤區,以便于大家掌握索引建立的方法。

1、主鍵就是聚集索引

這種想法筆者認為是極端錯誤的,是對聚集索引的一種浪費。雖然SQL SERVER默認是在主鍵上建立聚集索引的。

通常,我們會在每個表中都建立一個ID列,以區分每條數據,并且這個ID列是自動增大的,步長一般為1。我們的這個辦公自動化的實例中的列Gid就是如此。此時,如果我們將這個列設為主鍵,SQL SERVER會將此列默認為聚集索引。這樣做有好處,就是可以讓您的數據在數據庫中按照ID進行物理排序,但筆者認為這樣做意義不大。

顯而易見,聚集索引的優勢是很明顯的,而每個表中只能有一個聚集索引的規則,這使得聚集索引變得更加珍貴。

從我們前面談到的聚集索引的定義我們可以看出,使用聚集索引的最大好處就是能夠根據查詢要求,迅速縮小查詢范圍,避免全表掃描。在實際應用中,因為ID號是自動生成的,我們并不知道每條記錄的ID號,所以我們很難在實踐中用ID號來進行查詢。這就使讓ID號這個主鍵作為聚集索引成為一種資源浪費。其次,讓每個ID號都不同的字段作為聚集索引也不符合“大數目的不同值情況下不應建立聚合索引”規則;當然,這種情況只是針對用戶經常修改記錄內容,特別是索引項的時候會負作用,但對于查詢速度并沒有影響。

在辦公自動化系統中,無論是系統首頁顯示的需要用戶簽收的文件、會議還是用戶進行文件查詢等任何情況下進行數據查詢都離不開字段的是“日期”還有用戶本身的“用戶名”。

通常,辦公自動化的首頁會顯示每個用戶尚未簽收的文件或會議。雖然我們的where語句可以僅僅限制當前用戶尚未簽收的情況,但如果您的系統已建立了很長時間,并且數據量很大,那么,每次每個用戶打開首頁的時候都進行一次全表掃描,這樣做意義是不大的,絕大多數的用戶1個月前的文件都已經瀏覽過了,這樣做只能徒增數據庫的開銷而已。事實上,我們完全可以讓用戶打開系統首頁時,數據庫僅僅查詢這個用戶近3個月來未閱覽的文件,通過“日期”這個字段來限制表掃描,提高查詢速度。如果您的辦公自動化系統已經建立的2年,那么您的首頁顯示速度理論上將是原來速度8倍,甚至更快。

在這里之所以提到“理論上”三字,是因為如果您的聚集索引還是盲目地建在ID這個主鍵上時,您的查詢速度是沒有這么高的,即使您在“日期”這個字段上建立的索引(非聚合索引)。下面我們就來看一下在1000萬條數據量的情況下各種查詢的速度表現(3個月內的數據為25萬條):

(1)僅在主鍵上建立聚集索引,并且不劃分時間段:

Select gid,fariqi,neibuyonghu,title from tgongwen

用時:128470毫秒(即:128秒)

(2)在主鍵上建立聚集索引,在fariq上建立非聚集索引:

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

用時:53763毫秒(54秒)

(3)將聚合索引建立在日期列(fariqi)上:

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

用時:2423毫秒(2秒)

雖然每條語句提取出來的都是25萬條數據,各種情況的差異卻是巨大的,特別是將聚集索引建立在日期列時的差異。事實上,如果您的數據庫真的有1000萬容量的話,把主鍵建立在ID列上,就像以上的第1、2種情況,在網頁上的表現就是超時,根本就無法顯示。這也是我摒棄ID列作為聚集索引的一個最重要的因素。

得出以上速度的方法是:在各個select語句前加:declare @d datetime

set @d=getdate()

并在select語句后加:

select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate())

2、只要建立索引就能顯著提高查詢速度

事實上,我們可以發現上面的例子中,第2、3條語句完全相同,且建立索引的字段也相同;不同的僅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查詢速度卻有著天壤之別。所以,并非是在任何字段上簡單地建立索引就能提高查詢速度。

從建表的語句中,我們可以看到這個有著1000萬數據的表中fariqi字段有5003個不同記錄。在此字段上建立聚合索引是再合適不過了。在現實中,我們每天都會發幾個文件,這幾個文件的發文日期就相同,這完全符合建立聚集索引要求的:“既不能絕大多數都相同,又不能只有極少數相同”的規則。由此看來,我們建立“適當”的聚合索引對于我們提高查詢速度是非常重要的。

3、把所有需要提高查詢速度的字段都加進聚集索引,以提高查詢速度

上面已經談到:在進行數據查詢時都離不開字段的是“日期”還有用戶本身的“用戶名”。既然這兩個字段都是如此的重要,我們可以把他們合并起來,建立一個復合索引(compound index)。

很多人認為只要把任何字段加進聚集索引,就能提高查詢速度,也有人感到迷惑:如果把復合的聚集索引字段分開查詢,那么查詢速度會減慢嗎?帶著這個問題,我們來看一下以下的查詢速度(結果集都是25萬條數據):(日期列fariqi首先排在復合聚集索引的起始列,用戶名neibuyonghu排在后列)

(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'

查詢速度:2513毫秒

(2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='辦公室'

查詢速度:2516毫秒

(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='辦公室'

查詢速度:60280毫秒

從以上試驗中,我們可以看到如果僅用聚集索引的起始列作為查詢條件和同時用到復合聚集索引的全部列的查詢速度是幾乎一樣的,甚至比用



若我 2008-10-27 13:25 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/10/27/65193.html

posted @ 2008-10-27 13:25 悟山 閱讀(82) | 評論 (0)編輯 收藏

[導入]__declspec,__cdecl,__stdcall都是什么意思?有什么作用?

__cdecl和__stdcall都是函數調用規范(還有一個__fastcall),規定了參數出入棧的順序和方法,如果只用VC編程的話可以不用關心,但是要在C++和Pascal等其他語言通信的時候就要注意了,只有用相同的方法才能夠調用成功.另外,像printf這樣接受可變個數參數的函數只有用cdecl才能夠實現.  
  __declspec主要是用于說明DLL的引出函數的,在某些情況下用__declspec(dllexport)在DLL中生命引出函數,比用傳統的DEF文件方便一些.在普通程序中也可以用__declspec(dllimport)說明函數是位于另一個DLL中的導出函數. 

int   WINAPI   MessageBoxA(HWND,LPCSTR,LPSTR,UINT);  
  而WINAPI實際上就是__stdcall.  
  大多數API都采用__stdcall調用規范,這是因為幾乎所有的語言都支持__stdcall調用.相比之下,__cdecl只有在C語言中才能用.但是__cdecl調用有一個特點,就是能夠實現可變參數的函數調用,比如printf,這用__stdcall調用是不可能的.  
  __fastcall這種調用規范比較少見,但是在Borland   C++   Builder中比較多的采用了這種調用方式.  
  如果有共享代碼的需要,比如寫DLL,推薦的方法是用__stdcall調用,因為這樣適用范圍最廣.如果是C++語言寫的代碼供Delphi這樣的語言調用就必須聲明為__stdcall,因為Pascal不支持cdecl調用(或許Delphi的最新版本能夠支持也說不定,這個我不太清楚).在其他一些地方,比如寫COM組件,幾乎都用的是stdcall調用.在VC或Delphi或C++Builder里面都可以從項目設置中更改默認的函數調用規范,當然你也可以在函數聲明的時候加入__stdcall,__cdecl,__fastcall關鍵字來明確的指示本函數用哪種調用規范.  
  __declspec一般都是用來聲明DLL中的導出函數.這個關鍵字也有一些其他的用法,不過非常罕見.

若我 2008-10-21 17:46 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/10/21/64627.html

posted @ 2008-10-21 17:46 悟山 閱讀(274) | 評論 (0)編輯 收藏

[導入]AVL Tree的一個簡單實現

#ifndef _ALV_TREE_H
#define _ALV_TREE_H
#define Max(a,b) (((a)>(b))?(a):(b))
#include <iostream>

template<class T>
class AVLTree
{
 struct _TreeNode;
 typedef struct _TreeNode TreeNode;
 struct _TreeNode
 {
  T data;
  int height;
  TreeNode* left;
  TreeNode* right;
 };

private:
 TreeNode *root;
public:
 AVLTree()
 {
  this->root=NULL;
 }

 ~AVLTree()
 {
  this->MakeEmpty(this->root);
 }

 int GeiHeight()
 {
  return this->GetHeightUtil(this->root);
 }

 void Insert(T data)
 {
  this->root=this->InsertUtil(this->root,data);
 }
 
 void Delete(T data)
 {
  this->root=this->DeleteUtil(this->root,data);
 }

 void Print()
 {
  /*if(root!=NULL)
  {
   std::cout<<"The root node is: "<<root->data<<std::endl;
  }*/
  for(int level=0;;level++)
  {
   if(this->PrintUtil(this->root,level)==0)
   {
    break;
   }
   std::cout<<std::endl;
  }
 }

private:
 TreeNode *InsertUtil(TreeNode *_root,T data)
 {
  if(_root==NULL)
  {
   _root=new TreeNode();
   _root->data=data;
   _root->left=0;
   _root->right=0;
   _root->height=0;
  }
  if(data>_root->data)
  {
   _root->right=this->InsertUtil(_root->right,data);
   if(GetHeightUtil(_root->right)-GetHeightUtil(_root->left)==2)
   {
    if(data>_root->right->data)
    {
     _root=this->SingleRotateWithRight(_root);
    }
    else
    {
     _root=this->DoubleRotateWithRight(_root);
    }
   }
  }
  else if(data<_root->data)
  {
   _root->left=this->InsertUtil(_root->left,data);
   if(GetHeightUtil(_root->left)-GetHeightUtil(_root->right)==2)
   {
    if(data<_root->left->data)
    {
     _root=this->SingleRotateWithLeft(_root);
    }
    else
    {
     _root=this->DoubleRotateWithLeft(_root);
    }
   }
  }
  _root->height=Max(GetHeightUtil(_root->left),GetHeightUtil(_root->right))+1;
  return _root;
 }

 TreeNode *DeleteUtil(TreeNode *_root,T data)
 {
  if(_root==NULL)
  {
   return _root;
  }
  else if(_root->data==data
   &&_root->left==NULL
   &&_root->right==NULL)
  {
   delete _root;
   return NULL;
  }
  else if(_root->data==data
   &&_root->left!=NULL
   &&_root->right==NULL)
  {
   TreeNode* tmpNode=_root->left;
   delete _root;
   tmpNode->height=this->RecalculateHeight(tmpNode);
   return tmpNode;
  }
  else if(_root->data==data
   &&_root->left==NULL
   &&_root->right!=NULL)
  {
   TreeNode *tmpNode=_root->right;
   delete _root;
   tmpNode->height=this->RecalculateHeight(tmpNode);
   return tmpNode;
  }
  else
  {
   if(data==_root->data)
   {
    TreeNode *tmpNode,*parentNode;
    tmpNode=_root->right->right;
    parentNode=_root->right;
    if(tmpNode!=NULL)
    {
     while(tmpNode->right!=NULL)
     {
      parentNode->height-=1;
      parentNode=tmpNode;
      tmpNode=tmpNode->right;
     }
     parentNode->right=NULL;
     _root->data=tmpNode->data;
     delete tmpNode;
    }
    else
    {
     _root=parentNode;
    }
    _root->height=this->RecalculateHeight(_root);
    //TreeNode *tmpNode=this->FindMax(_root->right);
    //_root->data=tmpNode->data;
    if(GetHeightUtil(_root->left)-GetHeightUtil(_root->right)==2)
    {
     if(_root->left->left!=NULL)
     {
      _root=this->SingleRotateWithLeft(_root);
     }
     else if(_root->left->right!=NULL)
     {
      _root=this->DoubleRotateWithLeft(_root);
     }
    }
   }
   else
   if(data>_root->data)
   {
    _root->right=this->DeleteUtil(_root->right,data);
    _root->height=this->RecalculateHeight(_root);
    if(GetHeightUtil(_root->left)-GetHeightUtil(_root->right)==2)
    {
     if(_root->left->left!=NULL)
     {
      _root=this->SingleRotateWithLeft(_root);
     }
     else if(_root->left->right!=NULL)
     {
      _root=this->DoubleRotateWithLeft(_root);
     }
    }
   }
   else
   {
    _root->left=this->DeleteUtil(_root->left,data);
    _root->height=this->RecalculateHeight(_root);
    if(GetHeightUtil(_root->right)-GetHeightUtil(_root->left)==2)
    {
     if(_root->right->right!=NULL)
     {
      _root=this->SingleRotateWithRight(_root);
     }
     else if(_root->right->left!=NULL)
     {
      _root=this->DoubleRotateWithRight(_root);
     }
    }
   }
  }
  //_root->height=this->RecalculateHeight(_root);
  return _root;
 }

 void MakeEmpty(TreeNode *_root)
 {
  if(_root==NULL)
  {
   return;
  }
  else
  {
   MakeEmpty(_root->left);
   MakeEmpty(_root->right);
   delete _root;
  }
 }

 int GetHeightUtil(TreeNode *_root)
 {
  /*if(_root==NULL|| (_root->left==NULL && _root->right==NULL))
  {
   return 0;
  }
  else
  {
   return 1+GetHeightUtil(_root->left)+GetHeightUtil(_root->right);
  }*/
  if(_root==NULL)
  {
   return -1;
  }
  else
  {
   return _root->height;
  }
 }

 int PrintUtil(TreeNode *node, int level)
 {
  if(node==NULL||level<0)
  {
   return 0;
  }
  else
  {
   if(level==0)
   {
    std::cout<<node->data<<" ";
    return 1;
   }
   return PrintUtil(node->left,level-1)+PrintUtil(node->right,level-1);
  }
 }

 TreeNode *SingleRotateWithLeft(TreeNode *node)
 {
  TreeNode *tmpNode=node->left;
  node->left=tmpNode->right;
  tmpNode->right=node;
  node->height=Max(GetHeightUtil(node->left),GetHeightUtil(node->right))+1;
  tmpNode->height=Max(GetHeightUtil(tmpNode->left),GetHeightUtil(tmpNode->right))+1;
  return tmpNode;
 }

 TreeNode*SingleRotateWithRight(TreeNode *node)
 {
  TreeNode *tmpNode=node->right;
  node->right=tmpNode->left;
  tmpNode->left=node;
  node->height=Max(GetHeightUtil(node->left),GetHeightUtil(node->right))+1;
  tmpNode->height=Max(GetHeightUtil(tmpNode->left),GetHeightUtil(tmpNode->right))+1;
  return tmpNode;
 }

 TreeNode* DoubleRotateWithLeft(TreeNode *node)
 {
  node->left=this->SingleRotateWithRight(node->left);
  return this->SingleRotateWithLeft(node);
 }

 TreeNode* DoubleRotateWithRight(TreeNode *node)
 {
  node->right=this->SingleRotateWithLeft(node->right);
  return this->SingleRotateWithRight(node);
 }

 TreeNode* FindMax(TreeNode *node)
 {
  //T maxData;
  while(node!=NULL&&node->right!=NULL)
  {
   node=node->right;
  }
  //maxData=node->data;
  return node;
 }

 int RecalculateHeight(TreeNode *node)
 {
  if(node==NULL)
  {
   return -1;
  }
  else
  {
   node->height=Max(RecalculateHeight(node->left),RecalculateHeight(node->right))+1;
   return node->height;
  }
 }
};

#endif



若我 2008-09-28 17:30 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/09/28/62997.html

posted @ 2008-09-28 17:30 悟山 閱讀(140) | 評論 (0)編輯 收藏

[導入]VC2005中出現無法找到調試信息的解決方法

首先打開菜單 項目->項目屬性頁

1。選擇配置屬性->鏈接器->調試->生成調試信息 改為 是

2。選擇 配置屬性->C/C++ ->常規->調試信息格式 改為 用于“編輯并繼續”的程序數據庫(/ZI)

3。選擇 配置屬性->C/C++ ->優化->優化 改為 自定義

重新編譯,運行



若我 2008-09-28 16:56 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/09/28/62994.html

posted @ 2008-09-28 16:56 悟山 閱讀(697) | 評論 (0)編輯 收藏

[導入][轉載]vi命令一覽表

文本編輯器是所有計算機系統中最常用的一種工具。UNIX下的編輯器有ex,sed和vi等,其中,使用最為廣泛的是vi,而vi命令繁多,論壇里好像這方面的總結不多,以下稍做總結,以資共享!渴望更正和補充! 

進入vi的命令
vi filename :打開或新建文件,并將光標置于第一行首
vi +n filename :打開文件,并將光標置于第n行首
vi + filename :打開文件,并將光標置于最后一行首
vi +/pattern filename:打開文件,并將光標置于第一個與pattern匹配的串處
vi -r filename :在上次正用vi編輯時發生系統崩潰,恢復filename
vi filename....filename :打開多個文件,依次進行編輯

移動光標類命令
h :光標左移一個字符
l :光標右移一個字符
space:光標右移一個字符
Backspace:光標左移一個字符
k或Ctrl+p:光標上移一行
j或Ctrl+n :光標下移一行
Enter :光標下移一行
w或W :光標右移一個字至字首
b或B :光標左移一個字至字首
e或E :光標右移一個字至字尾
) :光標移至句尾
( :光標移至句首
}:光標移至段落開頭
{:光標移至段落結尾
nG:光標移至第n行首
n+:光標下移n行
n-:光標上移n行
n$:光標移至第n行尾
H :光標移至屏幕頂行
M :光標移至屏幕中間行
L :光標移至屏幕最后行
0:(注意是數字零)光標移至當前行首
$:光標移至當前行尾

屏幕翻滾類命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:將第n行滾至屏幕頂部,不指定n時將當前行滾至屏幕頂部。

插入文本類命令
i :在光標前
I :在當前行首
a:光標后
A:在當前行尾
o:在當前行之下新開一行
O:在當前行之上新開一行
r:替換當前字符
R:替換當前字符及其后的字符,直至按ESC鍵
s:從當前光標位置處開始,以輸入的文本替代指定數目的字符
S:刪除指定數目的行,并以所輸入文本代替之
ncw或nCW:修改指定數目的字
nCC:修改指定數目的行

刪除命令
ndw或ndW:刪除光標處開始及其后的n-1個字
do:刪至行首
d$:刪至行尾
ndd:刪除當前行及其后n-1行
x或X:刪除一個字符,x刪除光標后的,而X刪除光標前的
Ctrl+u:刪除輸入方式下所輸入的文本

搜索及替換命令
/pattern:從光標開始處向文件尾搜索pattern
?pattern:從光標開始處向文件首搜索pattern
n:在同一方向重復上一次搜索命令
N:在反方向上重復上一次搜索命令
:s/p1/p2/g:將當前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:將第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:將文件中所有p1均用p2替換

選項設置
all:列出所有選項設置情況
term:設置終端類型
ignorance:在搜索中忽略大小寫
list:顯示制表位(Ctrl+I)和行尾標志($)
number:顯示行號
report:顯示由面向行的命令修改過的數目
terse:顯示簡短的警告信息
warn:在轉到別的文件時若沒保存當前文件則顯示NO write信息
nomagic:允許在搜索模式中,使用前面不帶“\”的特殊字符
nowrapscan:禁止vi在搜索到達文件兩端時,又從另一端開始
mesg:允許vi顯示其他用戶用write寫到自己終端上的信息

最后行方式命令
:n1,n2 co n3:將n1行到n2行之間的內容拷貝到第n3行下
:n1,n2 m n3:將n1行到n2行之間的內容移至到第n3行下
:n1,n2 d :將n1行到n2行之間的內容刪除
:w :保存當前文件
:e filename:打開文件filename進行編輯
:x:保存當前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:執行shell命令command
:n1,n2 w!command:將文件中n1行至n2行的內容作為command的輸入并執行之,若不指定n1,n2,則表示將整個文件內容作為command的輸入
:r!command:將命令command的輸出結果放到當前行

寄存器操作
"?nyy:將當前行及其下n行的內容保存到寄存器?中,其中?為一個字母,n為一個數字
"?nyw:將當前行及其下n個字保存到寄存器?中,其中?為一個字母,n為一個數字
"?nyl:將當前行及其下n個字符保存到寄存器?中,其中?為一個字母,n為一個數字
"?p:取出寄存器?中的內容并將其放到光標位置處。這里?可以是一個字母,也可以是一個數字
ndd:將當前行及其下共n行文本刪除,并將所刪內容放到1號刪除寄存器中。


若我 2008-09-23 14:57 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/09/23/62583.html

posted @ 2008-09-23 14:57 悟山 閱讀(154) | 評論 (0)編輯 收藏

[導入]用DeviceIoControl獲取系統磁盤信息

代碼:
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
 SECURITY_ATTRIBUTES secStru;
 secStru.bInheritHandle=0;
 secStru.lpSecurityDescriptor=0;
 secStru.nLength=0; 
 HANDLE hDevice=CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

 if(hDevice==INVALID_HANDLE_VALUE)
 {
  return -1;
 }

 //DWORD outBuff[1000];
 GET_LENGTH_INFORMATION infoStruct;

 memset(&infoStruct,0,sizeof(infoStruct));
 DWORD bytesReturned;
 if(DeviceIoControl(hDevice,IOCTL_DISK_GET_LENGTH_INFO,NULL,0,&infoStruct,sizeof(infoStruct),&bytesReturned,NULL)==0)
 {
  cout<<"Failed to get disk information."<<endl;
  DWORD error;
  error=GetLastError();
  HRESULT hRe=HRESULT_FROM_WIN32(error);
  char errorData[10];
  sprintf(errorData,"%x",hRe);
  cout<<"Error code:"<</*hRe*/errorData<<endl;
  CloseHandle(hDevice);
  return -1;
 }

 DISK_GEOMETRY_EX geoStruct;
 memset(&geoStruct,0,sizeof(geoStruct));
 if(DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ,NULL,0,&geoStruct,sizeof(geoStruct),&bytesReturned,NULL)==0)
 {
  cout<<"Failed to get disk information."<<endl;
  DWORD error;
  error=GetLastError();
  HRESULT hRe=HRESULT_FROM_WIN32(error);
  char errorData[10];
  sprintf(errorData,"%x",hRe);
  cout<<"Error code:"<</*hRe*/errorData<<endl;
  CloseHandle(hDevice);
  return -1;
 }

 cout<<"The disk's size is:"<<infoStruct.Length.QuadPart/1024/1024/1024<<" G Bytes."<<endl;
 cout<<"The disk's cylinder number:"<<geoStruct.Geometry.Cylinders.QuadPart<<endl;
 cout<<"The disk's media type:"<<geoStruct.Geometry.MediaType<<endl;
 cout<<"Number of tracks per cylinder:"<<geoStruct.Geometry.TracksPerCylinder<<endl;
 cout<<"Number of sectors per track:"<<geoStruct.Geometry.SectorsPerTrack<<endl;
 cout<<"Number of bytes per sector:"<<geoStruct.Geometry.BytesPerSector<<endl;

 PDISK_PARTITION_INFO  partitionInfo=DiskGeometryGetPartition(&geoStruct);

 DRIVE_LAYOUT_INFORMATION_EX layOutInfo[20];

 memset(&layOutInfo,0,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20);

 //layOutInfo.PartitionEntry=*(new PARTITION_INFORMATION_EX[10]);

 if(DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&layOutInfo,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20,&bytesReturned,NULL)==0)
 {
  cout<<"Failed to get disk information."<<endl;
  DWORD error;
  error=GetLastError();
  HRESULT hRe=HRESULT_FROM_WIN32(error);
  char errorData[10];
  sprintf(errorData,"%x",hRe);
  cout<<"Error code:"<</*hRe*/errorData<<endl;
  CloseHandle(hDevice);
  return -1;
 }

 int partitionCount=layOutInfo[0].PartitionCount;
 cout<<"Number of partitions:"<<layOutInfo[0].PartitionCount<<endl;
 cout<<"Partitions' information:"<<endl;
 for(int i=0;i<partitionCount;i++)
 {
  //PDISK_PARTITION_INFO pParInfo=partitionInfo+i*sizeof(DISK_PARTITION_INFO);
  if(layOutInfo[i].PartitionEntry[0].PartitionNumber!=0)
  {
   cout<<"Partition "<<layOutInfo[i].PartitionEntry[0].PartitionNumber<<",  partition size is "<<layOutInfo[i].PartitionEntry[0].PartitionLength.QuadPart/1024/1024/1024<<" G Bytes, partition style is "<<layOutInfo[i].PartitionEntry[0].PartitionStyle<<endl;
  }
 }

 //cout<<"The type of partition:"<<((partitionInfo.PartitionStyle==PARTITION_STYLE_MBR) ?"MBR":((partitionInfo.PartitionStyle==PARTITION_STYLE_GPT )?"GPT":((partitionInfo.PartitionStyle==PARTITION_STYLE_RAW)?"RAW":"")))<<endl;

 CloseHandle(hDevice);

 return 0;
}



若我 2008-09-23 13:19 發表評論

文章來源:http://m.shnenglu.com/dingding/archive/2008/09/23/62570.html

posted @ 2008-09-23 13:19 悟山 閱讀(518) | 評論 (0)編輯 收藏

僅列出標題
共3頁: 1 2 3 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            老司机aⅴ在线精品导航| 久久久精品日韩欧美| 亚洲精品日产精品乱码不卡| 亚洲一区二区黄色| 亚洲第一精品影视| 亚洲一级二级| 欧美精品久久久久久| 伊人成人在线视频| 欧美xart系列高清| 久久这里有精品15一区二区三区| 欧美日韩在线大尺度| 亚洲日本va在线观看| 蜜桃av一区| 久久精品综合| 激情成人av在线| 久久久久久精| 欧美在线观看网址综合| 久久免费99精品久久久久久| 91久久久久久| 国内外成人在线视频| 亚洲国产精品久久久久秋霞不卡| 亚洲日本中文字幕免费在线不卡| 欧美日韩91| 欧美gay视频| 国产精品一区二区你懂得| 欧美自拍偷拍午夜视频| 欧美亚洲一区| 伊人精品在线| 中国亚洲黄色| 国产酒店精品激情| 蜜臀久久99精品久久久画质超高清| 久久精品成人欧美大片古装| 亚洲第一主播视频| 久久综合一区二区三区| 亚洲精选91| 欧美一区深夜视频| 欧美精品福利视频| 久久久成人网| 99精品国产一区二区青青牛奶| 久久深夜福利免费观看| 伊人精品成人久久综合软件| 欧美国产日韩亚洲一区| 欧美激情二区三区| 亚洲一区影音先锋| 欧美在线看片a免费观看| 在线电影国产精品| 亚洲福利视频网| 欧美成人国产一区二区| 亚洲私拍自拍| 亚洲免费小视频| 激情小说亚洲一区| 最新日韩精品| 国产欧亚日韩视频| 欧美黑人一区二区三区| 欧美性大战久久久久| 久久精视频免费在线久久完整在线看 | 欧美巨乳在线观看| 欧美亚洲免费电影| 欧美freesex交免费视频| 国产在线欧美日韩| 久久久久久婷| 日韩亚洲欧美在线观看| 亚洲一区二区三区视频| 黄色日韩网站视频| 国内激情久久| 久久精品国产亚洲aⅴ| 国产日韩亚洲欧美综合| 麻豆成人综合网| 国外成人在线| 国产色综合久久| 中文有码久久| 中文欧美在线视频| 午夜精品一区二区三区在线| 红桃视频成人| 亚洲影院色无极综合| 亚洲激情校园春色| 亚洲欧美在线观看| 亚洲最新合集| 久久综合国产精品| 午夜久久黄色| 欧美日韩午夜| 91久久精品日日躁夜夜躁欧美| 亚洲一区二区三区四区中文 | 国产在线视频不卡二| 亚洲精品欧美日韩专区| 极品少妇一区二区三区精品视频| 亚洲网站在线看| 久久久久久久网| 亚洲一区日本| 欧美视频二区| 日韩亚洲不卡在线| 日韩一级精品视频在线观看| 老牛国产精品一区的观看方式| 久久免费视频网站| 国产亚洲成av人片在线观看桃| 亚洲视频观看| 午夜久久99| 国产欧美日韩另类一区| 中日韩美女免费视频网址在线观看| 国产精品久久久久aaaa| 在线亚洲高清视频| 亚洲一区二区三区在线| 欧美日韩精品免费观看视频完整 | 亚洲国产精品一区二区第四页av | 久久人人九九| 午夜国产精品视频免费体验区| 欧美日韩国产首页在线观看| 亚洲人精品午夜| 国产精品白丝av嫩草影院| 亚洲精品乱码| 中日韩午夜理伦电影免费| 欧美插天视频在线播放| 亚洲电影天堂av| 日韩午夜黄色| 欧美日韩视频在线观看一区二区三区| 亚洲六月丁香色婷婷综合久久| 亚洲欧美日韩网| 欧美主播一区二区三区| 亚洲视频精选在线| 欧美激情视频一区二区三区免费| 久久精品首页| 久久野战av| 欧美一区三区三区高中清蜜桃| 久久综合影音| 亚洲国产精品一区二区第四页av| 国产精品成人免费精品自在线观看| 99亚洲一区二区| 国内精品久久久久国产盗摄免费观看完整版 | 欧美激情第三页| 中文国产一区| 在线视频精品一区| 国产欧美综合在线| 欧美一二区视频| 在线一区日本视频| 欧美在线电影| 亚洲免费观看视频| 亚洲天堂第二页| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲精品免费一二三区| 在线观看一区| 欧美日韩亚洲一区二区三区在线观看| 亚洲国产精品999| 亚洲天堂成人| 国产精品白丝jk黑袜喷水| 亚洲自拍偷拍福利| 欧美黑人国产人伦爽爽爽| 小嫩嫩精品导航| 国内精品99| 久久精品国产欧美亚洲人人爽| 久久久国产一区二区| 欧美日韩国产一级| 亚洲欧美日韩中文播放| 免费在线国产精品| 欧美一区二区三区在线| 久久综合中文| 亚洲卡通欧美制服中文| 日韩亚洲一区二区| 久久综合999| 欧美日韩综合在线| 久久精品国产综合精品| 亚洲国产导航| 午夜久久tv| 老牛国产精品一区的观看方式| 亚洲免费电影在线| 国产精品美女久久久久久2018| 亚洲精品美女91| 欧美在线91| 国产日韩欧美日韩| 欧美日韩亚洲另类| 久久久99爱| 99亚洲精品| 欧美高清视频一区| 新狼窝色av性久久久久久| 亚洲国产成人91精品| 国产精品亚洲综合一区在线观看| 欧美另类人妖| 久久本道综合色狠狠五月| 99精品国产在热久久下载| 欧美高清在线精品一区| 免费久久99精品国产自| 欧美一区二区三区在| 日韩一区二区精品视频| 国内外成人免费视频| 黑人操亚洲美女惩罚| 国产精品久久久久aaaa九色| 免费成人黄色av| 久久久久久黄| 久久久久成人精品| 午夜日韩电影| 久久爱另类一区二区小说| 亚洲亚洲精品在线观看| 亚洲精品一区二区三区av| 在线精品国产欧美| 亚洲欧洲日韩综合二区| 1024日韩| 黄色一区三区| 国产综合激情| 亚洲欧美三级伦理| 国产专区一区| 麻豆成人精品|