如何依次读取文件夹中的txt文件并处理其数据?

starsmiling 2013-08-30 05:42:42
各位前辈,我想依次地读取文件夹中的txt文档,并且处理里面的数据。查了很多资料都说要用FindFirstFile
和FindNextFile.但是因为我是新手,觉得这个难度好大。。。
可不可以这样做呢?
使用循环,首先定义一个FILE *fp文件指针,让其指向要读的文件夹中的第一个txt,然后读取数据进行处理。第一个
txt搞定之后,*fp指向下一个txt,然后再处理数据,依次类推直到处理完所有的txt。。。。。
但是总感觉fp不能这样做。。。因为fp应该不能自动指向下一个文件名吧?
小妹是最近才接触到C语言中的文本读取操作的,跪求各位大侠指导。。。。查了好长时间的资料
还是一头雾水。。。。泪奔了。。。
...全文
826 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
OnePeace888 2013-09-02
  • 打赏
  • 举报
回复
_findfirst 能够找到指定目录下特定的后缀明文件,百度多得很,搜索的文件依次打开就行了,应该没问题。
图灵狗 2013-09-02
  • 打赏
  • 举报
回复
fgets函数一定是可以的,你最好把每个步骤的结果都看一下。
引用 5 楼 starsmiling 的回复:
[quote=引用 3 楼 turingo 的回复:] 你的需求其实是包含了两个步骤: 1、先通过FindFirstFile/FindNextFile搜索文件夹中到底有哪些.txt文档,可以参考:

WIN32_FIND_DATA FindFileData;

HANDLE hFind = FindFirstFile("*.txt", &FindFileData);
	while (hFind != INVALID_HANDLE_VALUE)
	{
		<do stuff with FindFileData Here>

if (!FindNextFile(hFind, &FindFileData))
		{
			FindClose(hFind);
			hFind = INVALID_HANDLE_VALUE;
		}
	}
2、然后可以搜索到的文件名再用FILE*打开,用fopen/fread/fwrite/fclose等函数去处理。 [quote=引用 楼主 starsmiling 的回复:] 各位前辈,我想依次地读取文件夹中的txt文档,并且处理里面的数据。查了很多资料都说要用FindFirstFile 和FindNextFile.但是因为我是新手,觉得这个难度好大。。。 可不可以这样做呢? 使用循环,首先定义一个FILE *fp文件指针,让其指向要读的文件夹中的第一个txt,然后读取数据进行处理。第一个 txt搞定之后,*fp指向下一个txt,然后再处理数据,依次类推直到处理完所有的txt。。。。。 但是总感觉fp不能这样做。。。因为fp应该不能自动指向下一个文件名吧? 小妹是最近才接触到C语言中的文本读取操作的,跪求各位大侠指导。。。。查了好长时间的资料 还是一头雾水。。。。泪奔了。。。
[/quote] 前辈您好!我现在实现了搜索所有的txt文件,并且把所有的文件名存到另一个name.txt文件中,每行存储一个文件名。但是接下来不知道应该怎样循环读入name.txt文件中的文件名,我想用fgets但是总是出错。。。求帮助。。。[/quote]
Gonefar 2013-09-02
  • 打赏
  • 举报
回复
引用 5 楼 starsmiling 的回复:
[quote=引用 3 楼 turingo 的回复:] 你的需求其实是包含了两个步骤: 1、先通过FindFirstFile/FindNextFile搜索文件夹中到底有哪些.txt文档,可以参考:

WIN32_FIND_DATA FindFileData;

HANDLE hFind = FindFirstFile("*.txt", &FindFileData);
	while (hFind != INVALID_HANDLE_VALUE)
	{
		<do stuff with FindFileData Here>

if (!FindNextFile(hFind, &FindFileData))
		{
			FindClose(hFind);
			hFind = INVALID_HANDLE_VALUE;
		}
	}
2、然后可以搜索到的文件名再用FILE*打开,用fopen/fread/fwrite/fclose等函数去处理。 [quote=引用 楼主 starsmiling 的回复:] 各位前辈,我想依次地读取文件夹中的txt文档,并且处理里面的数据。查了很多资料都说要用FindFirstFile 和FindNextFile.但是因为我是新手,觉得这个难度好大。。。 可不可以这样做呢? 使用循环,首先定义一个FILE *fp文件指针,让其指向要读的文件夹中的第一个txt,然后读取数据进行处理。第一个 txt搞定之后,*fp指向下一个txt,然后再处理数据,依次类推直到处理完所有的txt。。。。。 但是总感觉fp不能这样做。。。因为fp应该不能自动指向下一个文件名吧? 小妹是最近才接触到C语言中的文本读取操作的,跪求各位大侠指导。。。。查了好长时间的资料 还是一头雾水。。。。泪奔了。。。
[/quote] 前辈您好!我现在实现了搜索所有的txt文件,并且把所有的文件名存到另一个name.txt文件中,每行存储一个文件名。但是接下来不知道应该怎样循环读入name.txt文件中的文件名,我想用fgets但是总是出错。。。求帮助。。。[/quote] fgets应该可以,但要保证fgets的缓存大于最大文件名,这样每读取一次就是一个txt文件名。 看百度: 从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。 注意:《UNIX 环境高级编程》中指出,每次调用fgets函数会造成标准输出设备自动刷清!案例详见《UNIX环境高级编程(第二版)》中程序清单1-5和课后习题5.7,习题5.7的答案中给出了相关的论述。 stream文件流指针体指向文件内容地址的偏移原则 如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上'\n'),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。而,如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0'),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
starsmiling 2013-09-02
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
你的需求其实是包含了两个步骤: 1、先通过FindFirstFile/FindNextFile搜索文件夹中到底有哪些.txt文档,可以参考:

WIN32_FIND_DATA FindFileData;

HANDLE hFind = FindFirstFile("*.txt", &FindFileData);
	while (hFind != INVALID_HANDLE_VALUE)
	{
		<do stuff with FindFileData Here>

if (!FindNextFile(hFind, &FindFileData))
		{
			FindClose(hFind);
			hFind = INVALID_HANDLE_VALUE;
		}
	}
2、然后可以搜索到的文件名再用FILE*打开,用fopen/fread/fwrite/fclose等函数去处理。 [quote=引用 楼主 starsmiling 的回复:] 各位前辈,我想依次地读取文件夹中的txt文档,并且处理里面的数据。查了很多资料都说要用FindFirstFile 和FindNextFile.但是因为我是新手,觉得这个难度好大。。。 可不可以这样做呢? 使用循环,首先定义一个FILE *fp文件指针,让其指向要读的文件夹中的第一个txt,然后读取数据进行处理。第一个 txt搞定之后,*fp指向下一个txt,然后再处理数据,依次类推直到处理完所有的txt。。。。。 但是总感觉fp不能这样做。。。因为fp应该不能自动指向下一个文件名吧? 小妹是最近才接触到C语言中的文本读取操作的,跪求各位大侠指导。。。。查了好长时间的资料 还是一头雾水。。。。泪奔了。。。
[/quote] 前辈您好!我现在实现了搜索所有的txt文件,并且把所有的文件名存到另一个name.txt文件中,每行存储一个文件名。但是接下来不知道应该怎样循环读入name.txt文件中的文件名,我想用fgets但是总是出错。。。求帮助。。。
赵4老师 2013-08-30
  • 打赏
  • 举报
回复
仅供参考
//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
struct FB {
    char fn[256];
    size_t fl;
    char *b;
    struct FB *next;
    struct FB *prev;
} *fh,*fb,*ft;
char ln[256];
char fpn[256];
FILE *af;
FILE *f;
int L,n;
int main() {
    system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");
    af=fopen("c:\\allfn.txt","r");
    if (NULL==af) {
        printf("Can not open file c:\\allfn.txt!\n");
        return 1;
    }
    fh=NULL;
    fb=NULL;
    n=0;
    while (1) {
        if (NULL==fgets(ln,256,af)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) ln[L-1]=0;
        printf("read %s\n",ln);
        strcpy(fpn,"c:\\tmp\\");
        strcat(fpn,ln);
        ft=(struct FB *)malloc(sizeof(struct FB));
        if (NULL==ft) {
            printf("Can not malloc ft!\n");
            fclose(af);
            return 2;//之前的malloc在main退出后由操作系统自动free
        }
        printf("ft[%d]==%p\n",n,ft);
        strcpy(ft->fn,fpn);
        f=fopen(fpn,"rb");
        if (NULL==f) {
            printf("Can not open file %s!\n",fpn);
            fclose(af);
            return 3;//之前的malloc在main退出后由操作系统自动free
        }
        ft->fl=_filelength(fileno(f));
        ft->b=malloc(ft->fl);
        if (NULL==ft->b) {
            printf("Can not malloc ft->b!\n");
            fclose(f);
            fclose(af);
            return 4;//之前的malloc在main退出后由操作系统自动free
        }
        printf("ft[%d]->b==%p\n",n,ft->b);
        if (ft->fl!=fread(ft->b,1,ft->fl,f)) {
            printf("fread error!\n");
            fclose(f);
            fclose(af);
            return 5;//之前的malloc在main退出后由操作系统自动free
        }
        fclose(f);
        ft->next=NULL;

        if (NULL==fh) {
            ft->prev=NULL;
            fh=ft;
        } else {
            fb->next=ft;
            ft->prev=fb;
        }
        fb=ft;
        n++;
    }
    fclose(af);
    printf("-----list-----\n");
    for (ft=fh;NULL!=ft;ft=ft->next) {
        printf("%8d %s\n",ft->fl,ft->fn);
        if (NULL!=ft) fb=ft;
    }
    printf("-----free-----\n");
    n--;
    if (NULL!=fh) {
        for (ft=fb->prev;NULL!=ft;ft=ft->prev) {
            if (NULL!=ft->next->b) {
                printf("ft[%d]->b==%p\n",n,ft->next->b);
                free(ft->next->b);
            }
            if (NULL!=ft->next) {
                printf("ft[%d]==%p\n",n,ft->next);
                free(ft->next);
            }
            n--;
        }
        if (NULL!=fh->b) {
            printf("ft[0]->b==%p\n",fh->b);
            free(fh->b);
        }
        printf("ft[0]==%p\n",fh);
        free(fh);
    }
    return 0;
}
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//找不到文件
//
//C:\tmp\tmp\Debug>tmp
//找不到文件
//-----list-----
//-----free-----
//
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//2011-06-30  18:04            44,840 my_c.rar
//2011-06-30  17:18             1,036 err.frm
//2011-06-30  14:32            14,243 出租.txt
//2011-06-28  12:08            23,681 MSDN98书签.txt
//             4 个文件         83,800 字节
//             0 个目录 17,041,870,848 可用字节
//
//C:\tmp\tmp\Debug>tmp
//read my_c.rar
//ft[0]==00421800
//ft[0]->b==00520068
//read err.frm
//ft[1]==00421670
//ft[1]->b==0052AFC0
//read 出租.txt
//ft[2]==00421530
//ft[2]->b==00378F28
//read MSDN98书签.txt
//ft[3]==004213F0
//ft[3]->b==0052B3F8
//-----list-----
// 44840 c:\tmp\my_c.rar
//  1036 c:\tmp\err.frm
// 14243 c:\tmp\出租.txt
// 23681 c:\tmp\MSDN98书签.txt
//-----free-----
//ft[3]->b==0052B3F8
//ft[3]==004213F0
//ft[2]->b==00378F28
//ft[2]==00421530
//ft[1]->b==0052AFC0
//ft[1]==00421670
//ft[0]->b==00520068
//ft[0]==00421800
//
//C:\tmp\tmp\Debug>
图灵狗 2013-08-30
  • 打赏
  • 举报
回复
你的需求其实是包含了两个步骤: 1、先通过FindFirstFile/FindNextFile搜索文件夹中到底有哪些.txt文档,可以参考:

WIN32_FIND_DATA FindFileData;

HANDLE hFind = FindFirstFile("*.txt", &FindFileData);
	while (hFind != INVALID_HANDLE_VALUE)
	{
		<do stuff with FindFileData Here>

if (!FindNextFile(hFind, &FindFileData))
		{
			FindClose(hFind);
			hFind = INVALID_HANDLE_VALUE;
		}
	}
2、然后可以搜索到的文件名再用FILE*打开,用fopen/fread/fwrite/fclose等函数去处理。
引用 楼主 starsmiling 的回复:
各位前辈,我想依次地读取文件夹中的txt文档,并且处理里面的数据。查了很多资料都说要用FindFirstFile 和FindNextFile.但是因为我是新手,觉得这个难度好大。。。 可不可以这样做呢? 使用循环,首先定义一个FILE *fp文件指针,让其指向要读的文件夹中的第一个txt,然后读取数据进行处理。第一个 txt搞定之后,*fp指向下一个txt,然后再处理数据,依次类推直到处理完所有的txt。。。。。 但是总感觉fp不能这样做。。。因为fp应该不能自动指向下一个文件名吧? 小妹是最近才接触到C语言中的文本读取操作的,跪求各位大侠指导。。。。查了好长时间的资料 还是一头雾水。。。。泪奔了。。。
zybjtu 2013-08-30
  • 打赏
  • 举报
回复

#include<io.h>
#include<stdio.h>
int main()
{
long Handle;
struct _finddata_t FileInfo;
if((Handle=_findfirst("D:\\*.txt",&FileInfo))==-1L)
printf("没有找到匹配的项目\n");
else
{
printf("%s\n",FileInfo.name);
while( _findnext(Handle,&FileInfo)==0)
printf("%s\n",FileInfo.name);
_findclose(Handle);
}
return 0;
}
findfirst算最基础的了吧。你在linux下的话,倒是有很多简单的办法
max_min_ 2013-08-30
  • 打赏
  • 举报
回复
不可以的,Fp只对你打开的文件有效的! 对于多文件的读写,必须一个一个遍历打开进行读写的! 不要偷懒了,老老实实的一个一个的来吧!

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧