我目前正在学习c编程,我有一个名为get_next_line的作业。
这是我的函数原型:
int get_next_line(const int fd, char **line);
根据作业,这是它应该做的事情:
"Write a function that returns a line read from a file descriptor."
"What we call a “line” is a succession of characters that end with ’\n’` (ascii code 0x0a) or with End Of File (EOF)."
"Calling your function get_next_line in a loop will then allow you to read the text available on a file descriptor one line at a time until the end of the text, no matter the size of either the text or one of its lines."
我理解它的方式,如果你的函数被调用一次,你返回一行。如果在循环内调用函数,则返回x行。请注意,原型没有参数表明函数循环了多少次。所以我的问题是,我的函数如何知道读取x行还是只读一行?
测试文件包含3行5个零。 我已经尝试使用2 while循环来读取文件中的所有行,但是使用循环测试我的函数将毫无意义,然后没有?因为它不是返回x行而是返回所有行x次。
我试过搜索Google。我花了无数个小时试图解决这个问题。但是我被困住了,需要一些帮助!我不确定我是否会错过一些明显的情况。
但是,我们只允许使用while循环。我们只允许使用read,malloc和free。每个c文件只允许5个函数,每个函数只允许25行。对于此分配,仅允许1 c文件。我们不允许使用printf,但我将其用于测试。我们可以使用由重新制作的函数组成的自定义库,例如:
memchr, putstr, strjoin, strsplit, memcmp, putstr_fd, strlcat, strstr, atoi, memcpy, strcat, strlen, bzero, memdel, strchr, strmap, isalnum, memmove, strclr, strmapi, isalpha, memset, strcmp, strncat, isascii, putchar, strcpy, strncmp, isdigit, strdel, strncpy, strnequ, isprint, putendl, strdup, strnew, itoa, strequ, strnstr, toupper, memalloc, putnbr, striter, tolower, memccpy, striteri, strrchr, strtrim, strsub.
所以,下面是我的代码。如果有人能给我指导,我会很感激。
static void ft_doread(const int fd, char **line, char *buff, int x, int y)
{
if (buff[y] != '\n')
{
read(fd, (void *)buff, BUFF_SIZE);
line[x][y] = buff[y];
y++;
}
}
int get_next_line(const int fd, char **line)
{
int x;
int y;
char *buff;
buff = (char *)malloc(BUFF_SIZE);
x = 0;
y = 0;
ft_doread(fd, line, buff, x, y);
return (0);
}
int main(void)
{
char *str;
int fd;
int lines;
str = (char *)malloc(BUFF_SIZE);
fd = open("./test.txt", O_RDONLY);
get_next_line(fd, &str);
printf("%s", str);
return (0);
}
答案 0 :(得分:0)
我认为这意味着循环的每次迭代中的调用将返回一个连续的行,因此如果在循环内调用X次,它将一次产生X行一个。因此,该功能只需要跟踪它在文件中的位置(除非你强行改变位置或关闭并重新打开文件,否则你将会这样做。)