zoukankan      html  css  js  c++  java
  • Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下。注意是linux下的,不是C++中的。

    函数原型

      ssize_t getline(char **lineptr, size_t *n, FILE *stream);

    所需头文件

      #include <stdio.h>

    参数

      lineptr

        字符串,getline函数会给它分配一段空间,用来存储读取出来的行内容

      n

        整型数字,函数调用完后会把分配的空间大小信息记录在n中。这个参数有些鸡肋,在调用getline之前对它进行任何操作都没什么意义,它只会在调用结束后记录lineptr    空间的大小。

      stream

        要读取文件的文件流

    返回值

      成功的话返回读取到行内容的大小,失败的话返回-1。

    那废话不多说,直接上测试代码

    #include <stdio.h>
    
    int main()
    {
        FILE *fd;
        char *lineptr = NULL;      //一般对其赋值为空
        size_t n = 121;         //为了测试将其初值赋为121,其实没什么意义,后面的测试结果可以看出
        int num;             //记录getline的返回值
        fd = fopen("list","r");  
    
        if(fd == NULL)          //检查打开文件是否成功
        {
            perror("open list");
            return 0;
        }
    
        while((num = getline(&lineptr,&n,fd)) != -1)    //成功读取的话进入循环
            printf("n = %d,num = %d,this line is %s",n,num,lineptr);
        
      
    
        return 0;
    }

    在给出执行结果前,我们先看看list文件中的内容

    这里为了测试,丧心病狂的给第一行输了这么多,可读性什么的先到一边去吧~~

    测试结果:

    结果分析:

      1、可以看到,除了第一行,其余几行的n值都是120。这是因为,linux开始会给lineptr分配一个大小为120的空间,如果够就是这么多,n就等于120了。如果不够,linux会根据这一行的大小重新分配。所以嘛,说n鸡肋是有原因的~

      2、忽略第一行,看别的。a  r  m  3,貌似只有4个字符嘛,为什么num是5?回头看我们的测试代码中的打印函数

      printf("n = %d,num = %d,this line is %s",n,num,lineptr);

      注意,这里在%s后面并没有加上“ ”换行符,为什么测试结果却出现了换行?相信你们已经猜到了,这一行的内容不仅有arm3这些字符,还有最后面的一个换行符,所以num比我们数到的多了1,就是因为我们没有算上这个看不到的换行符。

      3、使用完后,为了避免空间浪费,我们要把分配出的空间free掉

      

    if(lineptr != NULL)
    {
        free(lineptr);
    }

      4、关于自动换行,我猜想有一个行指针,每次调用完getline后会自动增加,直到读取完所有的行。不过接触不到内核代码也说不准,暂且先这么认为吧。如果有知道的请不吝赐教。

      

    如果有疑问或错误,欢迎指出。

  • 相关阅读:
    迭代器
    闭包函数与装饰器
    pyhton的函数
    文件处理
    Python2和Python3编码的区别
    hdu5080:几何+polya计数(鞍山区域赛K题)
    hdu1695:数论+容斥
    HDU3564 --- Another LIS (线段树维护最值问题)
    hdu1521:排列组合---指数型母函数
    poj1014:母函数+优化
  • 原文地址:https://www.cnblogs.com/51qianrushi/p/4357224.html
Copyright © 2011-2022 走看看