| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 760 人关注过本帖
标题:如何编写处理不定个数的文件的程序
只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
1我在网上找到Brian W. Kernighan , Rob Pike写的一段代码是用C语言来处理 ^$* 这三个 wildcard

网址是

http://cm.

当然这段代码是实现grep查找命令的

2 我记得在K&R The c programming language 中第八章有一个遍历目录的程序

http://net.pku.

这两个点结合在一起是不是稍微修改一下就可以完成你的想法??

首先列出目录写到文件里,

然后用grep里面处理 wildcard 的那种递归方法 找到完整的文件名

用fopen 打开

哈哈

The quieter you become, the more you can hear
2012-01-19 23:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
嗯,關鍵是輪詢得到那堆文件的文件名數組。這個問題涉及多個方面,訪問操作系統進行文件查尋、動態分配數組空間、文件的讀寫,是比較綜合的應用過程。有心做實用程序的,是應該好好研究它。

2樓小魚兒的那個參考帖,是不錯的方案,好好琢磨,消化了就是自己的。

[ 本帖最后由 TonyDeng 于 2012-1-20 02:53 编辑 ]

授人以渔,不授人以鱼。
2012-01-20 02:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
//--------------------------------------
// 程序功能:調用Win32功能用通配符查找一批文件的文件名
//     說明:1.採用DOS通配符,即包含*和?號的文件,比如*.c是所有以.c為擴展名的文件,可帶路徑
//           2.用命令行指定文件樣式,若省略,默認為*.*
//           3.默認將結果輸出到控制臺,若用重定向,可輸出到文本文件,語法類如為test *.c > list.txt,即寫到list.txt上
//           4.獲得文件清單,可用數組循環處理(本例是寫到標準容器vector中,相當於文件名數組)
//           5.要獲取文件的其他屬性,可查閱MSDN中WIN32_FIND_DATA結構的內容
//           6.本程序使用寬字符以及安全版本的函數,然而用重定向輸出得到的文本文件是可以用Ansi模式讀入的
//--------------------------------------

#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <vector>

BOOL GetFileList(const wchar_t FileName[], std::vector<WIN32_FIND_DATAW>& FileList);

int wmain(int argc, wchar_t* argv[])
{
    wchar_t FileName[FILENAME_MAX];
    wcscpy_s(FileName, FILENAME_MAX - 1, (argc < 2) ? L"*.*" : argv[1]);

    std::vector<WIN32_FIND_DATAW> FileList;
    FileList.clear();                        // 清空集合,如果需要追加模式,重覆調用GetFileList()函數而不要再清空
    if (GetFileList(FileName, FileList))
    {
        for (std::vector<std::wstring>::size_type index = 0; index != FileList.size(); ++index)
        {
            _putws(FileList[index].cFileName);
        }
    }
    return 0;
}

// 獲取文件清單
// 備註:結果通過集合FileList返回,傳遞的是引用
BOOL GetFileList(const wchar_t FileName[], std::vector<WIN32_FIND_DATAW>& FileList)
{
    WIN32_FIND_DATAW FindFileData;            // 文件數據結構,類型聲明末尾為W表示是寬字符版本,若為A則是Ansi版本的
    HANDLE Handle;                            // 用於搜索文件的句柄,將此句柄供給FindNextFile()函數,文件信息儲存在上面結構中

    Handle = FindFirstFileW(FileName, &FindFileData);
    if (Handle != INVALID_HANDLE_VALUE)
    {
        do
        {
            FileList.push_back(FindFileData);
        } while (FindNextFileW(Handle, &FindFileData));
        return true;
    }
    else return false;
}


[ 本帖最后由 TonyDeng 于 2012-1-22 04:50 编辑 ]

授人以渔,不授人以鱼。
2012-01-22 04:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果要改成C版本,自己用鏈表替代集合就是了。我上面之所以這樣設計,是考慮到若對鏈表不熟練,可以從文件中把數據讀回來,此時數組的尺寸是已知的,即使分配數組空間就可以了,從而避開動態分配和釋放的雷區。這樣,各種可能性都兼顧到了。其實,C++的標準庫容器比C的數據結構好用得多,人家向這個方向發展,當然是考慮到現實情況的,有充分的理由,我們沒必要逞能非要用鏈表不可。

[ 本帖最后由 TonyDeng 于 2012-1-24 00:46 编辑 ]

授人以渔,不授人以鱼。
2012-01-24 00:05
快速回复:如何编写处理不定个数的文件的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015967 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved