ssize_t mygetline(char **lineptr, size_t *n, FILE *stream)
lineptr是存储字符的指针的地址,*lineptr本身就自带空间,n是代表lineptr开辟的存储字节数大小,如果不足以读取一行,getline会再次开辟空间,stream是要读的文件的文件流。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 32
#define SPACE 64
ssize_t mygetline(char **lineptr, size_t *n, FILE *stream);
int main(int argc, char *argv[])
{
FILE *fp = NULL;
char *lineptr = NULL;
size_t n = 0;
int cnt;
if(argc < 2)
return -1;
fp = fopen(argv[1], "r");
if(NULL == fp)
return -1;
while(1)
{
cnt = mygetlen(&lineptr, &n, fp);
if(cnt == -1)
break;
else
fputs(lineptr, stdout);
}
free(lineptr);
lineptr = NULL;
fclose(fp)
return 0;
}
ssize_t mygetline(char **lineptr, size_t *n, FILE *stream)
{
int i = 0;//代表*lineptr中存储了多少元素。
char buf[BUFSIZE] = {};
char *p = NULL;
int buf_cnt;
while(1)
{
p = fgets(buf, BUFSIZE, stream);
if(NULL == p)
return -1;
buf_cnt = strlen(buf);
if(buf_cnt + i >= *n)
{
*n += SPACE;
*lineptr = realloc(*lineptr, *n);
}
strncpy((*lineptr) + i, buf, buf_cnt);
i += buf_cnt;
if((*lineptr)[i - 1] == '\n')
{
(*lineptr)[i] = '\0';
break;
}
}
if(feof(stream) || ferror(stream))
return -1;
return i;
}