仅从输入目录读取 .txt 文件,然后将所有内容放入 C 中的一个数组中

Reading only .txt files from an input directory, then getc all contents into one array in C

所以我试图创建一个接收输入目录的函数,仅检查其“.txt”文件,然后将所有内容存储到一个字符数组中(此处为动态分配)。当我对每个文件中的每个字符使用 getc() 时,一次一个,我不仅一次存储每个字符,而且我还希望它们一次 printf() 一个,只是为了查看是否所有文件正在被正确阅读。请注意,此处 else 循环中的所有内容仅在我制作的另一个程序中读取单个输入文件时 100% 正确工作。

这是alphabetcount.c,就是函数...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include<unistd.h> 
#include <stdbool.h>
#include <dirent.h>
#include "count.h"

void alphabetlettercount( char *path, char *filetowrite, long alphabetfreq[] )
{
    DIR *dir;
    FILE *entry_file;
    struct dirent *in_file;

    int c, i;
    int filled_elements = 0;

    char *temp_arrayPointer;
    char *perm_arrayPointer;

    perm_arrayPointer = ( char* ) calloc ( 1, sizeof( char ) );

    dir = opendir( path );

    if( dir == NULL )
    {
        printf( "Unable to read directory!" );
        exit( 1 );
    }

    while( ( in_file = readdir( dir ) ) != NULL )
    {

        if ( !strcmp ( in_file->d_name, "." ) || !strcmp ( in_file->d_name, ".." ) || strstr( ( in_file->d_name ), ".txt" ) )
        {

        }


       else
       {

            printf( "%s\n", in_file->d_name );

            entry_file = fopen( in_file->d_name, "r" );

            if ( entry_file != NULL )
            {

                while ( ( c = getc( entry_file ) ) != EOF )
                {
                        *( perm_arrayPointer + filled_elements ) = c;

                        printf( "%c", ( *( perm_arrayPointer + filled_elements ) ) );

                        filled_elements++;        

                        temp_arrayPointer = ( char* ) realloc ( perm_arrayPointer, ( ( filled_elements + 1 ) * sizeof( char ) ) );

                        if ( temp_arrayPointer != NULL )
                        {
                            perm_arrayPointer = temp_arrayPointer;
                        }
            }

        }

        fclose( entry_file );    
    }

    closedir( dir );    
}

这是测试alphabetcount.c,或者只是 main()...

(注意:alphabetlettercount() 原型存在于两个 .c 文件的 count.h #include 文件中)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include<unistd.h> 
#include <stdbool.h>
#include <dirent.h>
#include "count.h"

int main()
{

      char *path = "../data";           // the data *.txt files are under this folder
      
      alphabetlettercount(path);  // process the data files

}

这个输出是...

.
.
..
..

...if " printf("%s\n", in_file->d_name ); " 被放置在 "If" 循环中,但是如果放在“else”循环中,我的输出是...

test2.txt 
Segmentation Fault

关于我做错了什么有什么建议吗?我认为这与 fopen() 使用不当有关?感谢并抱歉阅读了这么长时间!

我已经更改了你的函数 alphabetlettercount 以匹配提供的 main 函数

我已经通过使用continue简化了你的else,这避免了太大的深度并便于阅读。

我已将变量移动到专用范围内。 我试图保持你的风格,但恕我直言,有些台词很长。

你不应该转换 calloc(或 malloc)return。

你的代码的主要问题是 fclose 的位置和你的测试只得到 .txt 文件(我刚刚添加了缺失的 !,请注意 foo.txt.bar 将被阅读)

做这么多的realloc不是一个好的做法,尝试分配一个1k的缓冲区,每次需要时加倍这个大小会更好

static void alphabetlettercount(const char *path)
{
    DIR *dir;
    struct dirent *in_file;

    int filled_elements = 0;

    char *perm_arrayPointer;

    perm_arrayPointer = calloc ( 1, sizeof( char ) );

    dir = opendir( path );

    if( dir == NULL )
    {
        printf( "Unable to read directory!" );
        exit( 1 );
    }

    while( ( in_file = readdir( dir ) ) != NULL )
    {
        FILE *entry_file;
        int c;
        char filepath[256];
        if ( !strcmp ( in_file->d_name, "." ) || !strcmp ( in_file->d_name, ".." ) || !strstr( ( in_file->d_name ), ".txt" ) )
        {
            continue;
        }

        printf( "%s\n", in_file->d_name );
        snprintf(filepath, sizeof(filepath), "%s/%s", path, in_file->d_name );
        entry_file = fopen( filepath, "r" );
        if ( entry_file == NULL ) {
            printf ("Error opening file: %s\n",strerror(errno));
            continue;
        }

        while ( ( c = getc( entry_file ) ) != EOF )
        {
            char *temp_arrayPointer;
            *( perm_arrayPointer + filled_elements ) = c;

            printf( "%c", ( *( perm_arrayPointer + filled_elements ) ) );

            filled_elements++;

            temp_arrayPointer = realloc ( perm_arrayPointer, ( ( filled_elements + 1 ) * sizeof( char ) ) );

            if ( temp_arrayPointer != NULL )
            {
                perm_arrayPointer = temp_arrayPointer;
            }
        }
        putchar('\n');
        fclose( entry_file );
    }

    closedir( dir );
    free(perm_arrayPointer);
}