使用netbeans c从txt文件中读取文件地址

时间:2010-06-17 18:27:57

标签: c arrays fread

我在从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”,“/家/..."

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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

或在堆栈上:

const char vectorparch[50*50];

不要忘记释放malloc - 内存。

编辑:

仔细观察您的代码,我认为您甚至不需要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按定义。

答案 1 :(得分: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);
}