C如何从二进制文件读取字符串?

时间:2015-11-08 20:24:41

标签: c

我有一个函数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);
}

1 个答案:

答案 0 :(得分:0)

从二进制文件读取肯定可以通过支持它们的平台上的函数openreadmallocfree来执行,但要注意二进制文件可能包含'\0'个字节。

因此,您不能依赖于您使用的字符串函数,例如ft_strchrft_joinprintf等。这些函数处理C字符串并将在嵌入的'\0'字节上停止。您需要直接处理字节块,而不是C字符串。

此外,不建议将二进制文件作为行序列处理:行结束可以由运行时库进行转码:例如,在Windows上以文本模式读取文件时,CR LF对将转换为单个'\n'字节写入stdout时,文本模式是默认值,反之亦然。其他此类转码可能在其他平台上发生。可悲的是,并非每台计算机都是unix盒。

最后,即使没有发生此类转码,文件也可能不会以'\n'结尾,并且在输出中添加一个可能会损坏文件。