繁体   English   中英

如何从输入文件在C中创建字符串的动态数组

[英]how to create a dynamic array of strings in C from an input file

一段时间未进行任何C编程,但是我有以下输出字符串的内容,但我想将其放入一个数组中,然后可以操作(在---------中的注释中)码)。 我想我需要声明数组的大小,但需要处理可变数量。 正在考虑做类似system('wc -l filename')事情,但这听起来确实很糟糕。 必须是更好的方法:

#include <stdio.h>

int main()
{
    char *inname = "test.txt";
    FILE *infile;
    char line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */
    char line_number;

    infile = fopen(inname, "r");
    if (!infile) {
        printf("Couldn't open file %s for reading.\n", inname);
        return 0;
    }
    printf("Opened file %s for reading.\n", inname);

    line_number = 0;
    while (fgets(line_buffer, sizeof(line_buffer), infile)) {
        ++line_number;
        /* note that the newline is in the buffer */
        // ---------------------
        // would like to put into an array of strings here rather than just printf'ing out out

         printf("%4d: %s", line_number, line_buffer);
    }
    printf("\nTotal number of lines = %d\n", line_number);
    return 0;
}

首先:

char *inname = "test.txt";

应该

const char *inname = "test.txt";

然后,您要分配一个足以存储所有行的数组。 由于您事先不知道行数,因此可以使用指数存储扩展:用尽数组时将其大小加倍。

示例代码(为清楚起见,省略了错误检查,请勿将其复制粘贴到生产代码中):

size_t n = 0;
size_t alloc_size = 4;
char buffer[LINE_MAX];

char **arr = malloc(alloc_size * sizeof arr[0]);

while (fgets(buffer, sizeof buffer, fp) != NULL) {
    if (++n > alloc_size) {
        alloc_size *= 2;
        arr = realloc(arr, alloc_size * sizeof arr[0]); // don't do this
    }

    arr[n - 1] = strdup(buffer);
}

不幸的是,C中没有动态数组(如果您考虑的是C ++中的vector)。 您可以使用列表,每次从文件中读取行时,只需在列表末尾添加新的列表条目即可。

自从C99被称为VLA(可变长度数组)以来,还存在“动态”数组。 您可以声明具有动态大小的数组(或者在程序运行时知道),但这将无济于事,因为您每次必须声明大小大于先前数组的新数组并将旧内容复制到新内容时-这将是非常低效的。

因此,总结起来可能很难找到比列表更好的东西。

您可以浏览整个文件(如果文件很大,则比较慢)并计算每条“新行”。 然后创建一个具有此计数大小的数组,然后倒回文件并读取每一行。

MFG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM