仅从输入目录读取 .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);
}
所以我试图创建一个接收输入目录的函数,仅检查其“.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);
}