http://sjlovechina.blog.163.com/blog/static/12336859820113862918589/
 出于某些原因(至于什么原因,不解释),需要用到从命令行读取一行字符串(包含空格的),网上查了一下貌似C标准库里没什么好用的函数可供使用(貌似fgets稍微好一点,可本人对此不满意,横了心要自己写个),于是乎无聊写了自己的readline(其实是个宏定义函数,是freadline(stdin))和freadline函数。哈哈,结果拓展了当初的需求,变得也能读取文件里的一行字符串了。(毕竟在UNIX中,几乎一切都可以看作文件,写成读取文件的,更容易扩展嘛,(*^__^*) 嘻嘻……)
Linux下存在readline函数,不过不太好用,貌似在编译时要链接两个库。就算链接了,编译时也提示找不到库,至少我没怎么找到相关资料。man readline的结果是出现很多鸟语,虽然我鸟语基础还不错,可是看到大段大段的鸟语,着实没耐心看下去,有空再看吧!
PS:很喜欢UNIX的设计思想:简单即是美,一切皆是文件!即著名的KISS(Keep It Simple, Stupid)

/*freadline.h*/
#ifndef _FREADLINE_H
#define _FREADLINE_H

#include <stdio.h>

/*宏定义函数*/
/*readline之后的左括号'('必须紧跟readline,之间不能有空格,否则就定义了一个对象宏,它将被替换为以'('开始的字符串*/
/*在调用函数宏时,readline与(之间可以有空格*/
#define readline() freadline(stdin)


/*保证_MAXLEN足够大,取这样的名字是为了防止被用户重定义*/
#define _MAXLEN 512

/*数组a_line用来存储读取的一行字符串*/
char a_line[_MAXLEN];

/*函数freadline的参数stream是一个文件描述符,返回值为一个指向char类型的指针*/
char *freadline(FILE *stream);

#endif
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*freadline.c*/
#include "freadline.h"

char *freadline(FILE *stream)
{    
    int count = 0;
    
    /* 数组a_line最多只能存511个“有用”字符,此时最后一个存储单元存储了‘\0’*/
    /*如果一行超过511个字符,则其后字符都不会被读取*/
    while((count < _MAXLEN) && ((a_line[count++] = getc(stream)) != '\n'));
    
    /*读完一行字符串后在字符串后加‘\0’,否则输出的字符串可能比读入的字符串多一些字符*/
    a_line[count - 1] = '\0';

    return a_line;
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*test.c*/
#include <stdio.h>
#include "freadline.h"

int main()
{
    char *str;
    FILE *fp;
    
    fp = fopen("test.c", "r");
    if(fp)
    {
str = freadline(fp);    /*从文件读取一行*/
        fclose(fp);
printf("%s\n", str);
    } 

    str = readline();    /*从命令行读取一行*/
    printf("%s\n", str);

    return 0;
}

编译命令:gcc -Wall -o test freadline.c test.c
运行结果:运行程序后,第一行是读取test.c的第一行,第二行是自己输入的,第三行是读取刚输入的,即读取第二行。
readline及freadline函数 - Galaxy - ONE PIECE
 

readline及freadline函数  

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐