0

有一段时间没有做过任何 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;
}
4

3 回答 3

2

首先:

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);
}
于 2013-11-09T20:35:01.473 回答
1

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

自 C99 以来还有一个称为 VLA(可变长度数组)的“动态”数组。您可以声明具有动态大小的数组(或者在程序运行时知道),但这不会帮助您解决问题,因为您每次都必须声明大小大于前一个的新数组并将旧的内容复制到新的 -这将是非常低效的。

所以总结起来可能很难找到比列表更好的东西。

于 2013-11-09T20:36:12.810 回答
1

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

制造

于 2013-11-09T20:49:11.810 回答