代码之家  ›  专栏  ›  技术社区  ›  jahmax

纯c中的文本文件到字符串数组?

  •  2
  • jahmax  · 技术社区  · 14 年前

    我怎样才能做到这一点?

    3 回复  |  直到 14 年前
        1
  •  1
  •   bjg    14 年前

    我建议您将文件读入一个指向字符串的指针数组,这样您就可以按照指定的方式索引和删除行。这种方法需要考虑效率权衡,即是提前计算行数,还是在读取每行时分配/扩展数组。我会选择前者。

    1. 读取文件,计算您看到的行终止符的数量(以太) \n \r\n )
    2. 分配一个这样大小的char*数组
    3. 使用,逐行重新读取文件 malloc()

    对于您的操作:

    • 索引只是 array[N]
    • 删除只是释放索引的缓冲区 设置 数组[N] 进入 NULL

    更新:

    更有效的方法是 @马克·范肯彭 malloc() 一次遍历每一行,也就是说,将文件slurp到一个缓冲区中,并用 '\0'

    char *filebuf 行数是 int num_lines 然后可以分配索引数组,如下所示:

    char *lines[] = (char **)malloc(num_lines + 1); // Allocates array of pointers to strings
    lines[num_lines] = NULL; // Terminate the array as another way to stop you running off the end
    
    char *p = filebuf; // I'm assuming the first char of the file is the start of the first line
    int n;
    for (n = 0; n < num_lines; n++) {
      lines[i] = p;
      while (*p++ != '\0') ; // Seek to the end of this line
      if (n < num_lines - 1) {
        while (*p++ == '\0')  ; // Seek to the start the next line (if there is one)
      }
    }
    

    lines[n] 无效的 . 有 免费()

        2
  •  2
  •   R.. GitHub STOP HELPING ICE    14 年前

    1. 使用 fseek , ftell , fseek公司
    2. malloc 足够容纳整个文件的缓冲区加上空终止。
    3. 使用 fread 将整个文件读入缓冲区,然后在结尾处写入一个0字节。
    4. 逐字节遍历缓冲区并计算换行数。
    5. 使用 分配那个数字+1 char *
    6. 再次遍历缓冲区,将第一个指针指定给指向缓冲区开头的指针,并将连续的指针指定给换行后的字节。在此过程中,将换行字节本身替换为0(null)字节。

    一个优化:如果您不需要随机访问这些行(通过行号索引它们),那么去掉指针数组,只需将所有新行替换为0字节即可。那么 s+=strlen(s)+1;

    无论哪种方式,这种方法都非常有效(没有内存碎片),但有几个缺点:

    • 不能单独释放行;您只能在完成后释放整个缓冲区。
    • 你必须改写换行。有些人喜欢把它们保存在记忆结构中。
        3
  •  1
  •   Marc van Kempen    14 年前

    实现这一点有两种稍微不同的方法,一种是内存友好型,另一种是cpu友好型。

    1. 打开文件并获取其大小(使用fstat()和friends)==>大小
    2. 分配该大小的缓冲区==>char buf[大小];
    3. 分配数组:char*lines[N]
    4. 再次扫描缓冲区,并将线[0]指向&buf[0],扫描第一个'\n'或'\r',并将其设置为'\0'(分隔字符串),将第[1]行设置为其后不是'\n'或'\r'的第一个字符,等等。

    II cpu友好型

    1. 打开文件,开始使用fgets()读取行,并在执行过程中对每行进行malloc'ing。
    2. 遍历链表,并将指向每个元素的指针指定给对应的数组元素
    3. 释放链表(不是它的元素!)