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

C如何从二进制文件读入字符串?,c,C,我有下面的函数,它从文件中读取一行并将其保存到字符串中,而不管BUFF_大小的长度。我想通过使它能够读取二进制文件来扩展它的使用。是否可以仅使用以下函数来完成此操作: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);

我有下面的函数,它从文件中读取一行并将其保存到字符串中,而不管BUFF_大小的长度。我想通过使它能够读取二进制文件来扩展它的使用。是否可以仅使用以下函数来完成此操作: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);
}
static int read\u to\u stock(int const fd,char**stock){
字符*浅黄色;
int ret;
如果(fd<0 | | BUFF|U大小<0)
返回(-1);
如果(!(buff=(char*)malloc(sizeof(*buff)*(buff_SIZE+1)))
返回(-1);
ret=读取(fd、buff、buff\U大小);
如果(ret>0)
{
buff[ret]='\0';
*stock=ft_strjoin(*stock,buff);//连接两个字符串
}
免费(buff);
返回(ret);
}
int get_下一行(int const fd,字符**行){
静态字符*stock=NULL;
char*bn;
int ret;
如果(!stock&&(stock=(char*)malloc(sizeof(*stock)))==NULL)
返回(-1);
bn=ft_strchr(stock,\n');//在字符串“stock”中搜索字符“\n”,并返回指向该字符的指针。
while(bn==NULL)
{
ret=读取库存(fd和库存);
如果(ret==0)
返回(0);
如果(ret<0)
返回(-1);
其他的
bn=ft_strchr(stock,\n');//在字符串“stock”中搜索字符“\n”,并返回指向该字符的指针。
}
*line=ft_strsub(stock,0,ft_strlen(stock)-ft_strlen(bn));//子字符串的一部分(string_from,start_index,length)
如果(!*行)
返回(-1);
stock=ft_strdup(bn+1);//复制一个字符串
申报表(1);
}
内部主(空){
int-fd;
字符*行;
fd=打开(“文件1”,仅限Ordu);
while(获取下一行(fd和行)>0)
{
printf(“%s\n”,第行);
}
关闭(fd);
返回(0);
}

在支持二进制文件的平台上,可以通过函数
打开
读取
malloc
免费
读取二进制文件,但请注意,二进制文件可能包含
'\0'
字节

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

此外,不建议将二进制文件作为行序列处理:运行库可能会对行结尾进行转码:例如,在Windows上以文本模式读取文件时,CR LF对将转换为单个
'\n'
字节,而在写入
标准输出时,将转换为单个
字节,其中文本模式为默认模式。其他此类转码可能发生在其他平台上。遗憾的是,并非每台计算机都是unix机箱


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

您应该注意缩进:您的代码很难读取。不管是什么,读取二进制文件或文本文件并没有什么不同(当然,这取决于它,但这里并不复杂)。您是否发现代码有任何问题?如果不是,你需要SO用户提供什么帮助?这是我在这里的第一篇文章。请跟我谈谈。谢谢。代码运行得很好,但是我需要像上面描述的那样扩展函数get_next_line的功能。您的问题是关于读取文本或二进制文件之间的区别。但您的代码要复杂得多,似乎来自其他项目。所以你应该简化/澄清你的需求。