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

使用netbeans c从txt文件读取文件地址,c,arrays,fread,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

我在从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);
文件*parch;
常量字符*vectorparch[50]//具有50个文件路径的数组
parch=fopen(“/home/irmay/NetBeansProjects/neurona/customers/customers.txt”,“r”);

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

for ( i = 0; i < 50; i++ )
{
    if (( vectorparch[i] = malloc( 50 )) == NULL ) { /* handle error */ }
}
不要忘记释放
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
}
char vectorparch[50][50]; // 50 arrays, 50 characters apiece.

for (j=0; j<50; j++) {
    fgets(vectorparch[j], 50, parch);
    propagar(vectorparch[j]);
}
intj;
文件*f;
char buffer[50];//用于所有读取的单个缓冲区
如果((f=fopen(“filename”,“r”))==NULL){/*handleerror*/exit(1);}
对于(j=0;j<50;j++)
{
大小_t sz=fread(缓冲区,1,50,f);
如果(sz==0 | | feof(f)| | feror(f)){/*句柄错误*/break;}
propagar(buffer,sz)//注意添加的buffer size参数
}

另一个注释:
sizeof(char)=1

这并不奇怪。这是:

const char * vectorparch[50]; //array with 50 file paths
…定义了一个包含50个指针的数组,但没有任何空间供这些指针指向,因此您没有任何空间供单个文件名使用。根据您对
fread
的调用:

fread ( vectorparch, sizeof ( char ), 50, parch );
您将其中的每一个视为指向一个50字节的数组。这就留下了另一个小问题:除非您的路径都正好有50字节长(似乎不太可能)
fread
不会做正确的事情——不管路径的长度如何,它都会读取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
}
char vectorparch[50][50]; // 50 arrays, 50 characters apiece.

for (j=0; j<50; j++) {
    fgets(vectorparch[j], 50, parch);
    propagar(vectorparch[j]);
}
charvectorparch[50][50];//50个数组,每个数组50个字符。
对于(j=0;j