对于分配,我正在重新创建getline函数(名为check),该函数检查换行符,如果仍在读取文件,则返回1,当文件读取完成时,返回0。我已经能够打印出文本文件的第一行。我该如何循环执行我的函数(检查),使其读取到文件末尾。而不只是一行。
这是我的检查功能
int check(int fd, char **line)
{
static char buff[32];
read(fd,buff,32);
int i =0;
int cnt = 0;
while(buff[cnt] != '\n' && buff[cnt] != '\0')
cnt ++;
char * arr = (char*) malloc(sizeof(char)*cnt);
while(buff[i] != '\n' && buff[i] != '\0')
{
arr[i] = buff[i];
i++;
}
arr[i] = '\0';
*line = strdup(arr);
if(arr[i] == '\0')
return 1;
return 0;
}
我的主要功能是从终端读取:
int main(int argc,char **argv)
{
int fd;
char *sen;
char *line;
fd = open(argv[argc-1],O_RDONLY);
if (check(fd,&line)==1)
printf("%s",line);
return (0);
}
我看过类似的东西:
while(read> 0)
但是我不知道该如何应用
代码应使用read()
的返回值,而不是不能在32内结束的循环。
ssize_t cnt = read(fd,buff,32);
//int cnt = 0;
//while(buff[cnt] != '\n' && buff[cnt] != '\0')
// cnt ++;
我见过类似的内容:
while(read>0)
,但我不知道如何应用此内容
read(fd,buff,32);
尝试读取32个字符,即使line短得多。
相反,代码可以读到直到
最直接的方法是使用fget()
,但我们可以假定不允许这样做。
一种效率低下但又说明性的方法一次只能读取一个字符。
int check(int fd, char **line) {
int ch;
size_t count = 0;
char *dest = NULL;
while ((ch = getchar()) != EOF) {
// append `ch` to `dest` in an ever increasing allocation location
char *s = realloc(dest, size + 2);
if (s == NULL) {
// Handle out of memory, left for OP to code
}
dest[size++] = ch;
if (ch == '\n') break;
}
if (size == 0) {
// Nothing read
return 0;
}
dest[size] = '\0'; //append null character to form string
return dest
}