當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程語言 » c語言文件查詢

c語言文件查詢-九游会j9娱乐平台

發布時間: 2024-01-18 17:39:47

㈠ c語言 如何查詢文件數據

先用getline或fgets讀取數據到一個字元串中,這個串定義的長一點,保證夠用就行,如:
char
str[1024];
fgets(
str
,
sizeof(str),
fp
);
//fp為你打開的文件指針
然後調用for循環去讀取串的的數據,假設你的分隔符是空格,遍歷str,遇到空格就得到一個數據,然後繼續遍歷,直到str尾。
然後再去fgets數據,再遍歷,即可得到所有的數據。

㈡ c語言編寫"全盤搜索一個文件"的程序

用c 遍歷目錄
河南洛陽 祝曉鷹

--------------------------------------------------------------------------------

---- 所謂遍歷目錄,就是給定一個目錄,訪問其中的所有文件(包括子目錄下的文件)。迭代是比較常用的遍歷演算法。本文利用c 面向對象的特性,通過一個類cbrowsedir,對目錄遍歷進行了封裝。用戶只需掌握該類四個成員函數的用法,就可以在自己的程序中,很方便地實現目錄遍歷。

---- 類cbrowsedir使用了迭代演算法。因為演算法不是本文重點,筆者不打算展開進一步討論,對其感興趣者可參考相關資料。

一、類成員函數說明:

---- bool setinitdir(const char *dir);

---- 功能:設置要遍歷的目錄。

---- 參數:dir 指向要遍歷的目錄,可以使用相對路徑,比如"d:..\hawk";還可以使用網路路徑,比如"\\wf\d\hawk"(其中wf是主機名,d是共享目錄,hawk是目錄)。

---- 返回值:返回true,表示設置成功;返回false,說明目錄不可用。

---- bool beginbrowse(const char *filespec);

---- 功能:開始遍歷目錄中由filespec指定的文件(包括隱藏文件)。

---- 參數:filespec 指定文件類型,可以使用通配符*和?,比如"*.exe"或"a?.*"都是合法參數。注意:filespec中不能包含路徑,象"hawk\*.*"是錯誤的。

---- 返回值:函數返回true,表明已順利遍歷完所有文件;返回false,遍歷過程被用戶中止。

---- virtual bool processfile(const char *filename);

---- 功能:虛函數。每找到一個文件,程序就會調用processfile,並把文件名作為參數傳遞給函數。如果函數返回false,則強制遍歷中止,並導致類成員函數函數beginbrowse返回false。 用戶應該覆寫此函數,以加入自己的處理代碼。

---- 參數:filename 指向一個文件名。注意:filename使用絕對路徑。

---- 返回值:返回true,繼續遍歷;否則,中止遍歷。

---- virtual void processdir (const char *currentdir,const char *parentdir);

---- 功能:虛函數。在遍歷過程中,每進入一個子目錄,程序就會調用processdir,並把目錄名及其上一級目錄名作為參數傳遞給函數。如果該目錄是成員函數setinitdir指定的初始目錄,則parentdir=null。用戶可以覆寫此函數,以加入自己的處理代碼。比如可以在這里統計子目錄的個數。

---- 參數:currentdir 指向一個子目錄。
---- parentdir 指向currentdir的父目錄。
---- 注意:currentdir和parentdir均使用絕對路徑。

二、使用:

---- 把類cbrowsedir的頭文件browsedir.h及實現文件browsedir.cpp加到項目(project)中,然後派生自己的類並覆寫虛函數processfile和processdir。遍歷目錄時,先構造一個派生類對象,用成員函數setinitdir指定目錄,然後調用beginbrowse開始遍歷。

---- 本文提供了一個例子 example.cpp,它從cbrowsedir派生出子類cstatdir,通過統計函數processfile及processdir的調用次數,可以得知目錄中的文件及子目錄個數。程序都有注釋,這里就不再羅嗦了。

三、注意事項:

---- 1. 類cbrowsedir會改變當前工作目錄。同一個相對路徑,使用cbrowsedir前後,可能會有不同的含義。因此用戶編程時,要小心使用相對路徑。

---- 2. 如果項目(project)是一個mfc應用程序,直接加入browsedir.h及browsedir.cpp會導致編譯出錯。這是因為預設情況下,mfc項目使用了預編譯頭(precompiled header),而browsedir.h和browsedir.cpp是用標准c 語句編寫的,沒用預編譯。一個解決辦法是先用類向導生成類cbrowsedir的"架子",再把相應的代碼拷貝過去。

---- 本文代碼均在win95、visual c 5.0環境下調試通過。

附源代碼:

/**************************************************
這是cbrowsedir的類定義文件 browsedir.h

/**************************************************
#include "stdlib.h"

class cbrowsedir
{
protected:
//存放初始目錄的絕對路徑,以'\'結尾
char m_szinitdir[_max_path];

public:
//預設構造器
cbrowsedir();

//設置初始目錄為dir,如果返回false,表示目錄不可用
bool setinitdir(const char *dir);

//開始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符 * ?,不能包含路徑。
//如果返回false,表示遍歷過程被用戶中止
bool beginbrowse(const char *filespec);

protected:
//遍歷目錄dir下由filespec指定的文件
//對於子目錄,採用迭代的方法
//如果返回false,表示中止遍歷文件
bool browsedir(const char *dir,const char *filespec);

//函數browsedir每找到一個文件,就調用processfile
//並把文件名作為參數傳遞過去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫該函數,加入自己的處理代碼
virtual bool processfile(const char *filename);

//函數browsedir每進入一個目錄,就調用processdir
//並把正在處理的目錄名及上一級目錄名作為參數傳遞過去
//如果正在處理的是初始目錄,則parentdir=null
//用戶可以覆寫該函數,加入自己的處理代碼
//比如用戶可以在這里統計子目錄的個數
virtual void processdir(const char
*currentdir,const char *parentdir);
};

/*********************************************/

這是cbrowsedir的類實現文件 browsedir.cpp

/***********************************************/
#include "stdlib.h"
#include "direct.h"
#include "string.h"
#include "io.h"

#include "browsedir.h"

cbrowsedir::cbrowsedir()
{
//用當前目錄初始化m_szinitdir
getcwd(m_szinitdir,_max_path);

//如果目錄的最後一個字母不是'\',則在最後加上一個'\'
int len=strlen(m_szinitdir);
if (m_szinitdir[len-1] != '\\')
strcat(m_szinitdir,"\\");
}

bool cbrowsedir::setinitdir(const char *dir)
{
//先把dir轉換為絕對路徑
if (_fullpath(m_szinitdir,dir,_max_path) == null)
return false;

//判斷目錄是否存在
if (_chdir(m_szinitdir) != 0)
return false;

//如果目錄的最後一個字母不是'\',則在最後加上一個'\'
int len=strlen(m_szinitdir);
if (m_szinitdir[len-1] != '\\')
strcat(m_szinitdir,"\\");

return true;
}

bool cbrowsedir::beginbrowse(const char *filespec)
{
processdir(m_szinitdir,null);
return browsedir(m_szinitdir,filespec);
}

bool cbrowsedir::browsedir
(const char *dir,const char *filespec)
{
_chdir(dir);

//首先查找dir中符合要求的文件
long hfile;
_finddata_t fileinfo;
if ((hfile=_findfirst(filespec,&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果不是,則進行處理
if (!(fileinfo.attrib & _a_subdir))
{
char filename[_max_path];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
if (!processfile(filename))
return false;
}
} while (_findnext(hfile,&fileinfo) == 0);
_findclose(hfile);
}

//查找dir中的子目錄
//因為在處理dir中的文件時,派生類的processfile有可能改變了
//當前目錄,因此還要重新設置當前目錄為dir。
//執行過_findfirst後,可能系統記錄下了相關信息,因此改變目錄
//對_findnext沒有影響。
_chdir(dir);
if ((hfile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是 . 或 ..
//如果不是,進行迭代
if ((fileinfo.attrib & _a_subdir))
{
if (strcmp(fileinfo.name,".") != 0 && strcmp
(fileinfo.name,"..") != 0)
{
char subdir[_max_path];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
processdir(subdir,dir);
if (!browsedir(subdir,filespec))
return false;
}
}
} while (_findnext(hfile,&fileinfo) == 0);
_findclose(hfile);
}
return true;
}

bool cbrowsedir::processfile(const char *filename)
{
return true;
}

void cbrowsedir::processdir(const char
*currentdir,const char *parentdir)
{
}

/*************************************************
這是例子example.cpp

/*************************************************
#include "stdio.h"

#include "browsedir.h"

//從cbrowsedir派生出的子類,用來統計目錄中的文件及子目錄個數
class cstatdir:public cbrowsedir
{
protected:
int m_nfilecount; //保存文件個數
int m_nsubdircount; //保存子目錄個數

public:
//預設構造器
cstatdir()
{
//初始化數據成員m_nfilecount和m_nsubdircount
m_nfilecount=m_nsubdircount=0;
}

//返迴文件個數
int getfilecount()
{
return m_nfilecount;
}

//返回子目錄個數
int getsubdircount()
{
//因為進入初始目錄時,也會調用函數processdir,
//所以減1後才是真正的子目錄個數。
return m_nsubdircount-1;
}

protected:
//覆寫虛函數processfile,每調用一次,文件個數加1
virtual bool processfile(const char *filename)
{
m_nfilecount ;
return cbrowsedir::processfile(filename);
}

//覆寫虛函數processdir,每調用一次,子目錄個數加1
virtual void processdir
(const char *currentdir,const char *parentdir)
{
m_nsubdircount ;
cbrowsedir::processdir(currentdir,parentdir);
}
};

void main()
{
//獲取目錄名
char buf[256];
printf("請輸入要統計的目錄名:");
gets(buf);

//構造類對象
cstatdir statdir;

//設置要遍歷的目錄
if (!statdir.setinitdir(buf))
{
puts("目錄不存在。");
return;
}

//開始遍歷

熱點內容
愛奇藝正義聯盟為啥不能緩存 發布:2024-01-20 00:52:13 瀏覽:248
caccess查詢資料庫 發布:2024-01-20 00:43:10 瀏覽:769
xp文件夾圖標更改 發布:2024-01-20 00:43:03 瀏覽:19
python和node 發布:2024-01-20 00:37:12 瀏覽:194
android拖拉 發布:2024-01-20 00:00:49 瀏覽:583
少兒編程課程體系介紹 發布:2024-01-20 00:00:48 瀏覽:846
我說你做下載ftp 發布:2024-01-20 00:00:47 瀏覽:8
安卓驅動培訓哪裡好 發布:2024-01-19 23:55:41 瀏覽:987
python轉為字元串 發布:2024-01-19 23:51:39 瀏覽:272
合同文件夾 發布:2024-01-19 23:50:52 瀏覽:740
网站地图