使用 POSIX IO 原语逐行读取文件
read a file line by line with POSIX IO primitives
我是新手,我正在尝试使用 POSIX IO 原语实现我自己的 readline()。
我写了代码:
int readline(int fd, char **line, size_t size)
{
char *ch = malloc(sizeof(char));
char buf[BUFSIZ];
int index = 0;
int nr;
if (NULL == line)
return -1;
do
{
nr = read(fd, ch, 1);
if (nr == -1)
{
perror("read()");
return -1;
} else
if (0 == nr)
break;
buf[index++] = (*ch);
} while ((*ch != '\n') && (index < BUFSIZ));
if ((index) && (buf[index-1] == '\r'))
{
index--;
}
buf[index++] = '\n';
buf[index] = 0; /* null-terminate */
printf("index = %d\n", index);
strncpy(*line, buf, size);
if ((buf[0] == '\n') || (buf[0] == '[=11=]') || (buf[0] == '\r'))
return 0;
return index;
}
int main(void)
{
int fd;
ssize_t nbytes;
char *line = malloc(BUFSIZ*sizeof(char));
fd = open("/etc/passwd", O_RDONLY);
while((nbytes = readline(fd, &line, sizeof(line))) > 0)
{
write(1, line, nbytes);
}
close(fd);
return 0;
}
但是每行只读取8个字符。我花了很多时间来修复代码,但一无所获。我也在这个网站上看了很多题目,大部分都是用同样的算法,但是只有我的代码不行!
问题是您使用 sizeof
运算符来获取分配内存的大小。 sizeof
运算符不会为您提供指针指向的大小,它会为您提供实际指针的大小。
在你的例子中,它是 8 个字节,等于 64 位,这是 64 位系统上的标准指针大小。
您需要跟踪自己分配的大小,在这种情况下,将 BUFSIZ
作为参数传递。
我是新手,我正在尝试使用 POSIX IO 原语实现我自己的 readline()。
我写了代码:
int readline(int fd, char **line, size_t size)
{
char *ch = malloc(sizeof(char));
char buf[BUFSIZ];
int index = 0;
int nr;
if (NULL == line)
return -1;
do
{
nr = read(fd, ch, 1);
if (nr == -1)
{
perror("read()");
return -1;
} else
if (0 == nr)
break;
buf[index++] = (*ch);
} while ((*ch != '\n') && (index < BUFSIZ));
if ((index) && (buf[index-1] == '\r'))
{
index--;
}
buf[index++] = '\n';
buf[index] = 0; /* null-terminate */
printf("index = %d\n", index);
strncpy(*line, buf, size);
if ((buf[0] == '\n') || (buf[0] == '[=11=]') || (buf[0] == '\r'))
return 0;
return index;
}
int main(void)
{
int fd;
ssize_t nbytes;
char *line = malloc(BUFSIZ*sizeof(char));
fd = open("/etc/passwd", O_RDONLY);
while((nbytes = readline(fd, &line, sizeof(line))) > 0)
{
write(1, line, nbytes);
}
close(fd);
return 0;
}
但是每行只读取8个字符。我花了很多时间来修复代码,但一无所获。我也在这个网站上看了很多题目,大部分都是用同样的算法,但是只有我的代码不行!
问题是您使用 sizeof
运算符来获取分配内存的大小。 sizeof
运算符不会为您提供指针指向的大小,它会为您提供实际指针的大小。
在你的例子中,它是 8 个字节,等于 64 位,这是 64 位系统上的标准指针大小。
您需要跟踪自己分配的大小,在这种情况下,将 BUFSIZ
作为参数传递。