我要做的就是将文件的各行读入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/