我有一个函数bellow从文件读取一行并将其保存到字符串中,无论BUFF_SIZE长度如何。我想通过使它能够读取二进制文件来扩展其用法。是否可以通过仅使用函数来执行此操作:open / read / malloc / free?
static int read_to_stock(int const fd, char **stock){
char *buff;
int ret;
if (fd < 0 || BUFF_SIZE < 0)
return (-1);
if (!(buff = (char *)malloc(sizeof(*buff) * (BUFF_SIZE + 1))))
return (-1);
ret = read(fd, buff, BUFF_SIZE);
if (ret > 0)
{
buff[ret] = '\0';
*stock = ft_strjoin(*stock, buff); //joins two strings
}
free(buff);
return (ret);
}
int get_next_line(int const fd, char ** line){
static char *stock = NULL;
char *bn;
int ret;
if (!stock && (stock = (char *)malloc(sizeof(*stock))) == NULL)
return (-1);
bn = ft_strchr(stock, '\n'); //search in string 'stock' for char '\n' and returns a pointer to it.
while (bn == NULL)
{
ret = read_to_stock(fd, &stock);
if (ret == 0)
return (0);
if (ret < 0)
return (-1);
else
bn = ft_strchr(stock, '\n'); //search in string 'stock' for char '\n' and returns a pointer to it.
}
*line = ft_strsub(stock, 0, ft_strlen(stock) - ft_strlen(bn)); //subs-tracts a part of a string(string_from, starting_index, length)
if (!*line)
return (-1);
stock = ft_strdup(bn + 1); //duplicate a string
return (1);
}
int main(void){
int fd;
char *line;
fd = open("file1", O_RDONLY);
while (get_next_line(fd, &line) > 0)
{
printf("%s\n", line);
}
close(fd);
return (0);
}
答案 0 :(得分:0)
从二进制文件读取肯定可以通过支持它们的平台上的函数open
,read
,malloc
,free
来执行,但要注意二进制文件可能包含'\0'
个字节。
因此,您不能依赖于您使用的字符串函数,例如ft_strchr
,ft_join
,printf
等。这些函数处理C字符串并将在嵌入的'\0'
字节上停止。您需要直接处理字节块,而不是C字符串。
此外,不建议将二进制文件作为行序列处理:行结束可以由运行时库进行转码:例如,在Windows上以文本模式读取文件时,CR LF对将转换为单个'\n'
字节写入stdout
时,文本模式是默认值,反之亦然。其他此类转码可能在其他平台上发生。可悲的是,并非每台计算机都是unix盒。
最后,即使没有发生此类转码,文件也可能不会以'\n'
结尾,并且在输出中添加一个可能会损坏文件。