c語言遍歷目錄
A. 怎樣使用c語言列出某個目錄下的文件
C語言本身沒有提供象dir_list()這樣的函數來列出某個目錄下所有的文件。不過,利用C語言的幾個目錄函數,你可以自己編寫一個dir_list()函數。 首先,頭文件dos.h定義了一個find_t結構,它可以描述DOS下的文件信息,包括文件名、時間、日期、大小和屬性。其次,C編譯程序庫中有_dos_findfirst()和_dos_findnext()這樣兩個函數,利用它們可以找到某個目錄下符合查找要求的第一個或下一個文件。 dos_findfirst()函數有三個參數,第一個參數指明要查找的文件名,例如你可以用「*.*」指明要查找某個目錄下的所有文件。第二個參數指明要查找的文件屬性,例如你可以指明只查找隱含文件或子目錄。第三個參數是指向一個find_t變數的指針,查找到的文件的有關信息將存放到該變數中。 dos_findnext()函數在相應的目錄中繼續查找由_dos_findfirst()函數的第一個參數指明的文件。_dos_findnext()函數只有一個參數,它同樣是指向一個find_t變數的指針,查找到剛文件的有關信息同樣將存放到該變數中。 利用上述兩個函數和find_t結構,你就可以遍歷磁碟上的某個目錄,並列出該目錄下所有的文件,請看下例: #include <stdio.h> #include <direct.h> #include <dos.h> #include <malloc.h> #include <memory.h> #include <string.h> typedef struct find_t FILE_BLOCK void main(void); void main(void){FILE_BLOCK f-block; /* Define the find_t structure variable * / int ret_code; / * Define a variable to store the return codes * / / * Use the "*.*" file mask and the 0xFF attribute mask to list all files in the directory, including system files, hidden files, and subdirectory names. * / ret_code = _dos_findfirst(" *. * ", 0xFF, &f_block); /* The _dos_findfirst() function returns a 0 when it is successful and has found a valid filename in the directory. * / while (ret_code == 0){/* Print the file's name * / printf(" %-12s\n, f_block, name); / * Use the -dos_findnext() function to look
B. MFC CFileFind和CFile遍歷一個指定文件夾並刪除裡面的所有文件(裡面沒有下層文件夾目錄)問題
首先鄙視一下樓主的代碼 毫無章法 亂定義變數 居然還不按同一風格定義
其次 你寫的這玩意 我不知道 你是想學習字元轉換呢 還是 想遍歷文件
最後我想說的是 他們說的都沒找到本質問題上去
把這句話
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
改為 下面2句
CString str = finder.GetFilePath();
pFile = (LPSTR)(LPCTSTR) str;
你的程序就沒問題了
下面看偶的分析
第一
char* pFile;
TCHAR* p;
你讓 p = pFile ; 居然沒出問題 說明 你的char 和 TCHAR 是一樣的玩意 你多半用的是VC6開發
要麼就是自己設置了工程屬性為 多位元組的, 所以根本不存在什麼 字元集的轉換
什麼 UNICODE ANSI 多位元組都是瞎扯
第二
斷點tiao'shi
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
執行後 pFile 指向的是亂碼 所以你再往後運行肯定就會出錯了
仔細看一下 finder.GetFilePath() 返回的是一個CString;
莫非樓主的 從CString 轉換 為 char * 的方式錯誤了?
測試
CString str("123");
pFile = (LPSTR)(LPCTSTR) str;
完全沒有問題啊...
所以問題 歸根到底 在與 返回值是 CString 會導致很多 bug的哦
這如果要說起來就太多了... 樓主再找度娘吧
//-- 下面的寫法稍微規范點 我就不懂 你定義 TCHAR 為了什麼
int main()
{
CFileFind finder;
CString path("D:\\1\\Cache\\");
CString file;
BOOL has = finder.FindFile(path+"*.*");
while(has)
{
has = finder.FindNextFile();
//IsDots 就是的 . 和 .. 如果你不判斷是文件夾 它會把當成文件去刪除,結果去刪除不掉
//在Windows系統下 文件和文件夾被看作同樣的東西
if( !finder.IsDots() && !finder.IsDirectory() )
{
file= finder.GetFilePath();
//CFile::Remove(file); 你這函數都沒有返回值 你好意思直接就在下面顯示刪除成功
if (DeleteFile(file))
{
cout<<file<<" 刪除成功"<<endl;
}
else
{
cout<<file<<" 刪除失敗, 非共享的文件是否正在使用?"<<endl;
}
}
}
finder.Close(); //----
return 0;
}
C. c語言 關於二叉樹的創建和遍歷(中序遍歷)
這個還是我學《數據結構》時做的有關二叉樹的練習呢,本來是全的,包括樹的初始化,建立,遍歷(中序、前序、後序和層次),還有輸出,復制,刪除節點,求深度,樹的刪除等等,看你只問了有關創建和中序遍歷的,所以選了一部分給你,供你參考吧!
#include <stdio.h>
#include <malloc.h>
#define MaxSize 10
#define Number 30
struct BiTNode{//定義數據結構
char data;
BiTNode *lchild,*rchild;
};
void InitBtree(BiTNode * &BT){//初始化二叉樹
BT=NULL;
}
void CreateBiTree(BiTNode *&BT,char *str){//建立二叉樹
BiTNode *s[MaxSize];//這里定義了一個數組用作堆棧方便檢查輸入和操作
int top=-1;
BT=NULL;
BiTNode *p=NULL;
int k, j=0;
char ch;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':
top++;
s[top]=p;
k=1;
break;
case ')':
top--;
break;
case ',':
k=2;
break;
default:
p=(struct BiTNode *) malloc(sizeof(struct BiTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(BT==NULL)
BT=p;
else{
if(k==1)
s[top]->lchild=p;
else
s[top]->rchild=p;
}
}
j++;
ch=str[j];
}
}
void inorder(BiTNode *BT){//中序遍歷二叉樹——遞歸形式
if(BT!=NULL){
inorder(BT->lchild );
printf("%c ",BT->data);
inorder(BT->rchild );
}
}
void main(){
BiTNode *BT;
printf("以廣義表形式表示輸入的二叉數 (如A(B(C,D),E(,F))的形式)\n\n");
char string[Number]="A(B(,C),D(E(F),G(,H)))";
//如果想要自己輸入,可以將下邊的注釋去掉,然後自己按照廣義表形式輸入,
//(如上例的形式)此處為了方便查看,用了默認的數值
//這里之所以用此種形式(廣義表形式輸入)是為了保證輸入的數組成的二叉樹完全符合你所定義的樹的形狀
/*char string[Number],ch;
int i=0;
ch=getchar();
while(ch!='\n' && i<Number){
string[i]=ch;
i++;
ch=getchar();
}
string[i]='\0';
*/
InitBtree(BT);//初始化二叉樹
CreateBiTree(BT,string);//創建二叉樹
printf("\n中序遍歷二叉樹順序為: ");
inorder(BT);//中序遍歷二叉樹
printf("\n");
}
程序不復雜,所以只是加了必要和最簡單的注釋,相信你看看應該完全可以理解的,祝你進步!