我要做的就是将文件的各行读入2d char数组中。我已经计算了最长行中的行数和字符数(使用功能lineCount())。在我的第一个案例中,它是500行,最多50个字符。第二种情况是50,000行,最多30个字符。这是我的main()

int main(int argc, char** argv)
{
    char fileName[] = "C:\\valid_50K.txt";

    int p[2] = { 0, 0 };
    lineCount(&fileName, &p);

    uint8_t** lines = (uint8_t**)malloc(sizeof(uint8_t*) * p[0]);
    for (int lnVar = 0; lnVar < p[0]; lnVar++)
    {
        lines[lnVar] = (uint8_t*)malloc(p[1] + 1);
    }

    readLines(&fileName, p[1], lines);
}


这是readLines()

void readLines(char* fileName, int numChars, uint8_t** out)
{
    FILE *fptr = NULL;
    int i = 0;

    fptr = fopen(fileName, "r");

    while (fgets(out[i], numChars + 1, fptr))
    {
        out[i][strlen(out[i]) - 1] = '\0';
        i++;
    }

    fclose(fptr);
}


它适用于500行,但是使用50K时,在Unhandled exception at 0x00007FFAAD21BC78 (ucrtbase.dll) in test.exe: An invalid parameter was passed to a function that considers invalid parameters fatal行上出现错误out[i][strlen(out[i]) - 1] = '\0';。整个文件只有1MB,只有ASCII字符,所以我不明白问题是什么。我正在使用Visual Studio 2017。

最佳答案

整个文件只有1MB,
  它适用于500条线路,但适用于50K ...


考虑文件49,999行的'\n'和1行长度的(1MB-49,999)在p[]中将返回{50000,大约1MB}。然后,代码将尝试分配50000 * about 1MB个字节或大约50 GB。

检查malloc()的返回值是否为NULL



如果在一行中读取的第一个字符为空字符,则out[i][strlen(out[i]) - 1] = '\0';是未定义的行为。

当一行不包含结尾的'\n'时,这在功能上是有问题的。

建议:

out[i][strcspn(out[i], "\n")] = '\0';

关于c - 将文件读入2d char数组可工作500行,但不能50,000行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57935047/

10-13 01:16