在读取多个文件时,我在代码的某个部分方面遇到了麻烦。这是其中的大部分:
char *a;
int ch;
char *line = NULL;
char *prev_line[999];
size_t len = 0;
size_t read;
if (argc > 1)
{
int i = 1;
FILE *fp;
while (i < argc)
{
a = malloc (MAX_NAME_SZ * sizeof (char));
fp = fopen (argv[i], "r");
if (fp == NULL)
{
/*Error statement in case an file doesn't exist */
}
else
{
while ((read = getline(&line, &len, fp)) != -1) {
if (strncmp(line, prev_line, read) != 0) {
strncat(a, line, read);
strncpy(prev_line, line, read);
}
}
free(line);
fclose (fp);
changeCase (a);
printf ("n");
}
i++;
}
}
else
{
a = malloc (MAX_NAME_SZ * sizeof (char));
fgets (a, MAX_NAME_SZ, stdin);
changeCase (a);
printf ("n");
}
}
,但我的问题包括这部分。
while ((read = getline(&line, &len, fp)) != -1) {
if (strncmp(line, prev_line, read) != 0) {
strncat(a, line, read);
strncpy(prev_line, line, read);
}
}
free(line);
该代码的这一部分仅以上一行独有的行读取。但是,当我有多个参数并且此代码经过两次时,我会遇到双免费或损坏错误,我认为这是因为免费(线(完成了两次。
代码中的其他地方我应该移动它,或者可以用?
根据getline()
文档:
如果 *linePtr为null,则getline((将分配一个用于存储该行的缓冲区,该缓冲区应由用户程序释放。
在您的情况下, line
仅对第一个文件而言是无效的。对getline()
的调用设置line
,以指向释放的东西。
下一次围绕line
的值不再为空,而是指向不应写入的释放位置,然后在以前被释放的相同价值上再次调用免费位置。
释放后将line
设置回NULL
应该解决您的问题。
free(line);
line = NULL;
这应该导致getline()
分配每个正在读取的文件的新内存。