我在从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)
谢谢。
答案 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);
}