仿标库函数获取一行字符个数getline
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#define STEP_SIZE 120
size_t my_getline(char** line,size_t* n,FILE* stream)
{
size_t res = 0;
char* buf = *line;
size_t count = 0;
if(stream == NULL)
{
fprintf(stderr,"传入文件流无效\n");
return -1;
}
if(*n == 0 || buf == NULL)
{
*line = malloc(STEP_SIZE);
memset(*line, 0, STEP_SIZE);
*n = STEP_SIZE;
buf = *line;
}
while((res = fgetc(stream)) != '\n')
{
if(res == EOF)
return -1;
if(count < *n - 2)
{
*(buf + count) = res;
}
else
{
*n = *n + STEP_SIZE;
buf = realloc(buf,*n);
*(buf + count) = res;
}
count++;
}
*(buf + count) = '\0';
*(buf + count++) = '\n';
return count;
}
int main(int argc,char* argv[])
{
FILE* fp;
char* buf = NULL;
size_t n = 0;
size_t l = 0;
if(argc < 2)
{
fprintf(stderr,"请使用命令行参数传入文件路径\n");
exit(1);
}
fp = fopen(argv[1],"r");
if(fp == NULL)
{
perror("fopen:");
exit(1);
}
while( -1 != (l = my_getline(&buf,&n,fp)))
{
printf("size:%zu\n",n);
printf("line:%zu\n",l);
}
free(buf);
buf = NULL;
fclose(fp);
}