侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

getline函数用法详解

noerror
2022-11-09 / 0 评论 / 0 点赞 / 129 阅读 / 655 字 / 正在检测是否收录...

getline函数用法详解

getline函数简介

  • 头文件包含
#include <stdio.h>
  • 函数定义
ssize_t getline(char ** lineptr , size_t * n , FILE * stream );
ssize_t getdelim(char ** lineptr , size_t * n , int  delim \

getline函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘getline’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <stdio.h>

getline函数详细描述

getline ()从stream读取整行,将包含文本的缓冲区的地址存储到"*lineptr" 中。缓冲区以空结尾,如果找到换行符,则包含换行符。
如果在调用之前"*lineptr"被设置为NULL,PPP1被设置为0,那么getline ()将分配一个缓冲区来存储该行。即使getline ()失败,用户程序也应该释放这个缓冲区。
或者,在调用getline ()之前,"*lineptr"可以包含一个指向malloc (3)-allocated缓冲区的指针,大小为"*n"字节。如果缓冲区不够大,无法容纳该行,getline ()会根据需要调整它的大小,realloc (3)会根据需要更新"*lineptr"和"*n"。
在这两种情况下,在成功调用时,"*lineptr"和"*n"将被更新,以分别反映缓冲区地址和分配的大小。
getdelim ()的工作方式类似于getline (),只是可以将换行符以外的行分隔符指定为delimiter参数。与getline ()一样,如果在到达文件结尾之前输入中没有分隔符,则不会添加分隔符。

getline函数返回值

成功后,getline ()和getdelim ()返回读取的字符数,包括分隔符字符,但不包括终止的空字节(\(aq\e0\(aq))。该值可用于处理读取行中嵌入的空字节。
这两个函数都在读取行失败时返回-1(包括文件结尾条件)。如果出现错误,errno被设置为指示原因。

getline函数错误码

  • EINVAL 错误参数。RI(n或lineptr为空,或stream无效)。
  • ENOMEM 分配或重新分配行缓冲区失败。

getline函数使用举例

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
   FILE *stream;
   char *line = NULL;
   size_t len = 0;
   ssize_t nread;

   if (argc != 2) {
       fprintf(stderr, "Usage: %s <file>\en", argv[0]);
       exit(EXIT_FAILURE);
   }

   stream = fopen(argv[1], "r");
   if (stream == NULL) {
       perror("fopen");
       exit(EXIT_FAILURE);
   }

   while ((nread = getline(&line, &len, stream)) != \-1) {
       printf("Retrieved line of length %zd:\en", nread);
       fwrite(line, nread, 1, stdout);
   }

   free(line);
   fclose(stream);
   exit(EXIT_SUCCESS);
}
0

评论区