C: чтение файла в массив - PullRequest
1 голос
/ 04 мая 2009

У меня есть текстовый файл, и я хочу читать его построчно и помещать строки в массив.

Фрагмент кода выдает ошибку при компиляции:

FILE *f;
char line[LINE_SIZE];
char *lines;
int num_righe;

f = fopen("spese.dat", "r");

if(f == NULL) {
    f = fopen("spese.dat", "w");
}

while(fgets(line, LINE_SIZE, f)) {      
    num_righe++;
    lines = realloc(lines, (sizeof(char)*LINE_SIZE)*num_righe);
    strcpy(lines[num_righe-1], line);
}

fclose(f);

Ошибка:

spese.c:29: warning: assignment makes integer from pointer without a cast
spese.c:30: warning: incompatible implicit declaration of built-in function ‘strcpy’
spese.c:30: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast

Любая помощь? Спасибо

Ответы [ 4 ]

5 голосов
/ 04 мая 2009

Попробуйте:

FILE *f;
char line[LINE_SIZE];
char **lines = NULL;
int num_righe = 0;

f = fopen("spese.dat", "r");

if(f == NULL) {
        f = fopen("spese.dat", "w");
}

while(fgets(line, LINE_SIZE, f)) {              
        num_righe++;
        lines = (char**)realloc(lines, sizeof(char*)*num_righe);
        lines[num_righe-1] = strdup(line);
}

fclose(f);
2 голосов
/ 04 мая 2009

Я так понимаю, это фрагмент кода, следовательно, я думаю, что вы уже в том числе string.h

strcpy определяется как:

  char * strcpy ( char * destination, const char * source );

В

 strcpy(lines[num_righe-1], line);

строк [num_righe-1] это символ, а не символ *

Так и должно быть

strcpy(lines + (num_righe-1), line);

Как писал muntiful, похоже, что вы пытаетесь сделать строки массивом строк. Если это так, то ваше определение линий неверно.

Кроме того, не забывайте, вы должны проверить, что realloc не возвращает NULL.

lines = realloc(lines, (sizeof(char)*LINE_SIZE)*num_righe);

if (!lines) //MUST HANDLE NULL POINTER!!

/* string copy code here*/
1 голос
/ 04 мая 2009

Вместо этого вы можете использовать fscanf, чтобы делать то, что вы хотите.

fscanf(f, "%s\n", line[index]);
index++;
1 голос
/ 04 мая 2009

lines - это указатель на символ, то есть одну строку. Вы хотите, чтобы это был массив строк. Для этого должно быть char **lines;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...