c - 将文本文件读取到二维数组时出现段错误

标签 c text-files

我编写了一些代码来将文本文件的每一行读取到二维数组。

/* 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", 电话[i]); 所以我不明白为什么这里会出现段错误? malloc() 是否有任何错误?

最佳答案

我还没有编译或运行代码,但我认为问题出在你的行计数器中:

 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。您为 nLines 分配空间,但您可能会从文件中读取超过 nLines 的数据...此时,您向 **result 写入的数据多于分配的数据,并且会发生不好的事情.

关于c - 将文本文件读取到二维数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9454590/

相关文章:

C scanf 意外地使用 %i 扫描日期

c - 用可执行文件实现堆栈粉碎

C Linux 警告 : assignment makes integer from pointer without a cast

python - 如何按 x 行读取文本文件,但 x 未知?

java - 如何在 Java 中向现有文件追加文本?

c - 替换字符数组中字符或子字符串的标准函数?

c - 如何强制删除C中的文件?

c# - 存储数据的文本文件

excel - 为什么我的 vba 代码将逗号视为新行?

ios - 在iOS/OSX上读取带有Windows和Unix行尾的文件