0

我在从 txt 文件中读取文件地址时遇到问题。当我在调试器中观看时,信息似乎已损坏。代码是

FILE *parch;
const char * vectorparch[50]; //array with 50 file paths
parch = fopen("/home/irmay/NetBeansProjects/neurona/patrones/patrones.txt", "r");
for(j=0;j<50;j++){
     fread ( vectorparch, sizeof ( char ), 50, parch );
     propagar(vectorparch[j]);      
 }
 fclose(parch);

带有路径的文件有 50 个字符串,如下所示:"/home/irmay/NetBeansProjects/neurona/patrones/10_0.txt","/home/..."

函数 propagar 被声明为 void propagar (const char * arch1)

谢谢你。

4

2 回答 2

2

const char * vectorparch[50];创建由 50 个指针组成的本地数组,这些指针指向……无处。更确切地说,数组中的值是堆栈中的任何值。您需要为这 50 个字符串中的每一个显式分配空间,malloc(3)例如:

for ( i = 0; i < 50; i++ )
{
    if (( vectorparch[i] = malloc( 50 )) == NULL ) { /* handle error */ }
}

或在堆栈上,如:

const char vectorparch[50*50];

不要忘记 deallocate malloc-ed 内存。

编辑:

仔细查看您的代码,我认为您甚至不需要 50×50 的空间。使用单个字符缓冲区应该没问题。像这样的东西:

int j;
FILE* f;
char  buffer[50]; // single buffer for all reads

if (( f = fopen( "filename", "r" )) == NULL ) { /* handle error */ exit( 1 ); }

for ( j = 0; j < 50; j++ )
{
    size_t sz = fread( buffer, 1, 50, f );
    if ( sz == 0 || feof( f ) || ferror( f )) { /* handle error */ break; }
    propagar( buffer, sz ) // NOTE the added buffer size parameter
}

另一个注意事项:sizeof( char ) = 1根据定义。

于 2010-06-17T18:41:10.783 回答
0

这并不奇怪。这个:

const char * vectorparch[50]; //array with 50 file paths

...定义了一个由 50 个指针组成的数组,但没有任何空间用于指向 AT 的任何指针,因此您没有任何空间用于单个文件名。根据您的来电fread

fread ( vectorparch, sizeof ( char ), 50, parch );

您将每个 视为指向 50 个字节的数组。这留下了另一个小问题:除非你的路径都是 50 字节长(似乎不太可能),fread否则它不会做正确的事情——不管路径的长度如何,它都会读取 50 个字节。我猜你的文件更有可能每行有一个路径,但路径不一定都是相同的长度。在这种情况下,我会做这样的事情:

char vectorparch[50][50]; // 50 arrays, 50 characters apiece.

for (j=0; j<50; j++) {
    fgets(vectorparch[j], 50, parch);
    propagar(vectorparch[j]);
}

不过,这可能不是您想要的——您似乎在读入每个文件路径时都在处理它。如果是这种情况,您可能想要更多类似的东西:

char vectorparch[50]; // one array of 50 characters.
for (j=0; j<50; j++) {
    fgets(vectorparch, 50, parch);
    propagar(vectorparch);
}
于 2010-06-17T18:43:16.170 回答