Считать адрес файла из текстового файла, используя netbeans c - PullRequest
0 голосов
/ 17 июня 2010

У меня проблемы с чтением адреса файла из текстового файла.Информация кажется поврежденной, когда я смотрю ее в отладчике.Код

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/..."

Функция пропаганда объявлена ​​пустым пропагандой (const char * arch1)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

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];

Не забудьте освободить 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 по определению.

0 голосов
/ 17 июня 2010

Это не удивительно. Это:

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);
}
...