Abh*_*ogi 2 c gcc file-handling
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *readLine(FILE *inFile) //Simply reads line in a text file till "\n"
{
char *line = realloc(NULL, 1);
char c;
int i=0;
while (!feof(inFile))
{
c = fgetc(inFile);
if (ferror(inFile)) printf("Error reading");
if (c == 10)
{
realloc(line,i+1);
line[i]= 10;
break;
}
realloc(line, i+1);
line[i++] = c;
}
return line;
}
int main(int argc,char **argv)
{
FILE *inFile;
inFile = fopen("testFile","r");
printf("%s",readLine(inFile));
printf("%s",readLine(inFile));
printf("%s",readLine(inFile));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果testFile的内容是: -
abc
def
ghi
Run Code Online (Sandbox Code Playgroud)
三个printf语句应该显示"abc"三次..但输出是: -
abc
def
ghi
Run Code Online (Sandbox Code Playgroud)
我知道我在某个地方的概念是错的.请帮忙.
用法realloc()不正确.
realloc(line,i+1); // wrong
// OK
void *new_line = realloc(line,i+1);
if (!new_line)
{
free(line);
return NULL;
}
line = new_line;
Run Code Online (Sandbox Code Playgroud)
因为line是按值传递的,所以它没有改变.实际重新分配的内存在返回值中.因此 编辑:刚才意识到即使这是一个错误,它也不会导致重复的行.其他要点仍然有效.line,一遍又一遍地保持不变,你一遍又一遍地看到同一条线.
更糟糕的是:
line值在重新分配后可能会变得无效,如果它在堆的不同部分重新分配.