Ошибка сегментации при чтении текстового файла в 2d массив - PullRequest
0 голосов
/ 26 февраля 2012

Я написал код для чтения каждой строки текстового файла в 2d массив.

/* FileProcess.c library */
#define LINE_SIZE 128 /* Max line's length = 256 characters */
extern ulong
File_ReadLine (FILE *fptr,
               char **result)
{
  char buff_line[LINE_SIZE], *p; 
  ulong nLines = 0UL;

  /* Check if fptr is readable */
  if (fptr == NULL) {
    printf("File not found.\n");
    return -1;
  }

 /*get number of lines; from http://stackoverflow.com/a/3837983 */
 while (fgets(buff_line, LINE_SIZE, fptr))
    if (!(strlen(buff_line) == LINE_SIZE-1 && buff_line[LINE_SIZE-2] != '\n'))
      nLines++;

  /* Allocating memory for result */
  result = malloc(nLines * sizeof(char *)); //

  /* Pointer return to begin of file */
  rewind(fptr);

  /* Getting lines */
  int i = 0;
  while (!feof(fptr)) {
    /* Get current line to buff_line */
    fgets(buff_line, LINE_SIZE, fptr);
    /* Replace '\n' at the end of line */
    char *c = strchr(buff_line, '\n');
    if (c != NULL)
      *c = '\0';

    /* Handle '\n' at the end of file */
    if (feof(fptr))
      break;
    /* Memory allocate for p */
     result[i] = malloc (LINE_SIZE * sizeof(char));

    /* Copy buff_line to p */
    strcpy(result[i], buff_line);
    i++;
  }
  return (nLines);
}

основная программа:

int main () 
{
  char **Phone;
  FILE *fptr;
  fptr = fopen("phone.na.txt", "r");
  ulong nLines = File_ReadLine(fptr, Phone);
  printf("%ld\n", nLines);

  int i;  
  for (i = 0; i < nLines; i++) {
    printf("%s", Phone[i]);
  }

fclose(fptr);
return 1;
}

Использование gdb, строка за строкой, ошибка сегментации возврата программы после printf ("% s", Phone [i]); Так что я не могу понять, почему здесь ошибка сегментации? Есть ли ошибки с malloc ()?

1 Ответ

0 голосов
/ 26 февраля 2012

Я не скомпилировал и не запустил код, но я думаю, что проблема в вашем счетчике строк:

 while (fgets(buff_line, LINE_SIZE, fptr))
    if (!(strlen(buff_line) == LINE_SIZE-1 && buff_line[LINE_SIZE-2] != '\n'))
      nLines++;

То, что вы здесь говорите, если «длина строки buff_line не равнаLINE_SIZE -1 и символ в buff_line [LINE_SIZE-1] не равен '\ n' ", инкремент nLines.

Итак ... всякий раз, когда вы читаете строку из вашего текстового файла, которая заканчивается на '\ n ', и эта строка длиной 127 символов, вы не собираетесь увеличивать nLines.Вы используете Malloc пробелы для nLines, но вы, вероятно, будете читать больше, чем nLines данных из вашего файла ... в этот момент вы записываете в ** результат больше, чем вы выделили, и произойдут плохие вещи.

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