readline及freadline函数
http://sjlovechina.blog.163.com/blog/static/12336859820113862918589/ 出于某些原因(至于什么原因,不解释),需要用到从命令行读取一行字符串(包含空格的),网上查了一下貌似C标准库里没什么好用的函数可供使用(貌似fgets稍微好一点,可本人对此不满意,横了心要自己写个),于是乎无聊写了自己的readline(其实是个宏定义函
·
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函数
更多推荐



所有评论(0)