
- 外文名
- fgets
- 函数使用
- 键盘输入fgets(buf,n,stdin)
- 头文件
- stdio.h
- 中文名
- fgets
- 功 能
- 读取数据
- 长 度
- n-1个字符的字符串
-
2022-03-22 22:12:36
今天在使用fgets读文件配置的时候,使用fgetes读取
br=br-lan
使用fgets读取一行并进行分割得到
ifname=br-lan
, 但是由于fgets
在读取行的时候也会把换行符\n
读取,导致读取到的ifname=br-lan\n\0
.这个时候,如果使用ifname
拼接文件路径,如/sys/class/net/%s/beidge
的时候,就会出现错误,使用stat
判断文件是否存在就会出错。原因就是带有换行符导致文件路径出现问题。
正确的解决方法是把换行符换成\0
之后再进行字符串的处理。//br=br-lan char *key = fgets(line, MAX_LINE, fp); char *p = strchr(line, '='); char *value = p + 1; *p = '\0'; vlaue[strlen(vlaue) - 1] = '\0'; // 这样处理之后就是不带换行符的
使用
char *fgets(char *s, int size, FILE *stream);
注意点:- 最多读取
size-1
个字符,会在最后添加\0
。 - 遇到
EOF
或者换行符停止读取。 - 如果读取遇到换行符,则换行符也会被读取到
s
中,并且也会在最后添加\0
。 - 成功返回
s
, 失败或者遇到文件结尾返回NULL
,并设置errno
。
更多相关内容 - 最多读取
-
C语言文件操作中 fgets与fputs 函数详解
2021-01-01 13:58:33C语言文件操作中 fgets、fputs 函数详解 先给出api fgets 语法: #include char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num – 1]个字符并且把它们转储到str(字符串)中.... -
C语言中fgets和fscanf区别详解
2020-08-29 00:10:02主要介绍了C语言中fgets和fscanf区别详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下 -
c语言中的fgets与fputs函数.docx
2020-08-24 13:35:09fgets函数详解 ? fgets函数详解 fgets函数 从流中读一行或指定个字符? 原型是char *fgets(char *s, int n, FILE *stream? 从流中读取n-1个字符除非读完一行参数s是来接收字符串如果成功则返回s的指针否则返回NULL? ... -
C语言中输入函数(scanf()、fgets()和gets())的区别详解
2021-01-01 05:30:29大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets()。他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输入多个数据域。 scanf函数是一个标准... -
详解C语言gets()函数与它的替代者fgets()函数
2020-12-31 06:01:31在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回。如果要读取一行字符串,比如: I love BIT 这种情况,scanf()就无能为力了。... -
fgets
2016-03-24 17:38:58来说一说fgets(..)函数。 原型 char * fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针,指向存储读入数据的缓冲区的地址。 n: 从流中读入n-1个字符 stream : 指向读取的流。 返回值...来说一说fgets(..)函数。原型 char * fgets(char * s, int n,FILE *stream);
参数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。
返回值:
1. 当n<=0 时返回NULL,即空指针。
2. 当n=1 时,返回空串"".
3. 如果读入成功,则返回缓冲区的地址。
4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.
看看这个函数的官方说明:
/***
*char *fgets(string, count, stream) - input string from a stream
*
*Purpose:
* get a string, up to count-1 chars or '\n', whichever comes first,
* append '\0' and put the whole thing into string. the '\n' IS included
* in the string. if count<=1 no input is requested. if EOF is found
* immediately, return NULL. if EOF found after chars read, let EOF
* finish the string as '\n' would.
*
*Entry:
* char *string - pointer to place to store string
* int count - max characters to place at string (include \0)
* FILE *stream - stream to read from
*
*Exit:
* returns string with text read from file in it.
* if count <= 0 return NULL
* if count == 1 put null string in string
* returns NULL if error or end-of-file found immediately
*
*Exceptions:
*
*******************************************************************************/标准库中fgets(...)的实现:
/****************************************************
char *fgets(char *s, int n, FILE *stream)
{
register int c;
register char *cs;
cs=s;
while(--n>0 &&(c = getc(stream))!=EOF)
if ((*cs++= c) =='\n')
break;
*cs ='\0';
return (c == EOF && cs == s) ?NULL :s ;
}
/********************************************************
在用fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。
example:
char s[100]; //可以。
char *s; //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。
所以,如果要用指针,则 char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100]; 如果为分配内存空间,编译时不会检查出问题,但运行时会出现未知错误。。
fgets(...)读入文本行时的两种情况。
1。 如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。
example:
123abc
fgets(s,10,fp);
此时,读入七个字符,123abc\n,实际上还有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。
2. 如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.
example:
123abc
char s[5];
fgets(s,5,fp);
这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.
fgets(...)读入整个文件内容
通常用while()循环来使fges()读入文本全部内容,并按行读入。
char s[1024];
while((fgets(s,1024,fp))!=NULL)
{
printf(s);
}
当然如果n小于每行的字符个数,也可以读,只不过读的次数要多。
假设一行为 : 123456789
char s[2];
int num=0;
while((fgets(s,2,fp))!=NULL)
{
printf(s);
n++;
}
每次读入一个字符, 最后也会读完一行,num=10,读了十次,所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要是文本流没关闭。
读入空行的情况:
第一行 abcdef123
第二行
第三行 helloworld
其中第二行为空,fget(..)会把第二行也读入,因为并未到文件结尾。
有时我们并不需要空行,可以这样做。
while((fgets(s,n,fp))!=NULL)
{
if(strlen(s)!=1) //注意这儿是1不是0,因为尽管是空行,它也会读入换行符,strlen(s)=1;
printf(s);
}
fgets(...)从标准设备读数据。
用fgets(...)还也读入标准输入设备(一般为键盘)的信息
原型 : fgets(s,n,stdin);
假设在控制台下,我们可以用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,因为不会像gets()有溢出的可能。。
比如 :输入 abc
fgets(s,n,stdin)也会读入n-1个字符。但是只是从stdin流读入。。。
-
fgets函数用法
2013-03-20 19:09:38详细描述了fgets函数的用法,该函数可读取文件中的字符串,可供C/CPP开发人员参考。 -
gets和fgets函数及其区别,C语言gets和fgets函数详解
2021-05-21 07:27:17这次我输入了zhang和回车换行,fgets函数依然是读取5个字符(len-1个),这时fgets()读入zhang,已经是五个字符了,所以回车换行并不会读入,最后fgets()添加字符串结束标志'\0',所以我们看到输出时,press any......每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的“互联网蠕虫”,它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一。很显然,对蠕虫病毒的实现来说, gets 函数的功劳不可小视。不仅如此,GCC 也不推荐使用gets和puts函数。
那么,究竟是什么原因导致 gets 函数这么不招人待见呢?
正确的语句是d (int)k%m28. 不能进行++和--运算的数据类型为d 指针b)整型c) 长整型d) 常量 name:29. putchar函数可以向终端输出一个d 整型变量表达式b)实型变量值 字符串d)字符或字符型变量值 30. printf函数中用到格式符%5s,其中数字5表示输出的字 符串占用5列。gets函数功能:从键盘上输入字符,直至接受到换行符或eof时停止,并将读取的结果存放在buffer指针所指向的字符数组中。这次我输入了zhang和回车换行,fgets函数依然是读取5个字符(len-1个),这时fgets()读入zhang,已经是五个字符了,所以回车换行并不会读入,最后fgets()添加字符串结束标志'\0',所以我们看到输出时,press any...并没有换行输出,而是和zhang在同一行。
该函数为在栈中分配size个字节的内存空间, 函数返回时会自动释放该空间. 成功返回指针, 失败返回null.。定义目录结构信息结构体dirent对象指针pdirent,之后通过一个while循环,该循环内通过调用readdir函数,以读取打开的目录对应的操作返回结果判断为条件。首先,next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针,或者说next是一个指向函数的指针,该函数返回另一个指针,该指针指向一个只读的指向char的指针。
如果函数的调用者提供了一个指向堆栈的指针,并且 gets 函数读入的字符数量超过了缓冲区的空间(即发生溢出),gets 函数会将多出来的字符继续写入堆栈中,这样就覆盖了堆栈中原来的内容,破坏一个或多个不相关变量的值。如下面的示例代码所示:
int main(void)
{
char buffer[11];
gets(buffer);
printf("输出: %s\n",buffer);
return 0;
}示例代码的运行结果为:
aaa
输出: aaa
根据运行结果,当用户在键盘上输入的字符个数大于缓冲区 buffer 的最大界限时,gets 函数也不会对其进行任何检查,因此我们可以将恶意代码多出来的数据写入堆栈。由此可见,gets 函数是极其不安全的,可能成为病毒的入口,因为 gets 函数没有限制输入的字符串长度。所以我们应该使用 fgets 函数来替换 gets 函数,实际上这也是大多程序员所推荐的做法。
相对于 gets 函数,fgets 函数最大的改进就是能够读取指定大小的数据,从而避免 gets 函数从 stdin 接收字符串而不检查它所复制的缓冲区空间大小导致的缓存溢出问题。当然,fgets 函数主要是为文件 I/O 而设计的(注意,不能用 fgets 函数读取二进制文件,因为 fgets 函数会把二进制文件当成文本文件来处理,这势必会产生乱码等不必要的麻烦)。其中,fgets 函数的原型如下:
fgets函数功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,知道读完n-1个字符,或者读完一行。函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上null作为字符串结束。空语句和复合语句27413.3.2控制语句27513.3.3跳转语句27613.3.4关于分号的说明276习题13276第14单元函数28014.1函数参数28014.1.1现代c语言函数参数不能空28014.1.2c语言函数调用中的值结合28014.1.3指针类型参数28214.2函数定义与函数声明28914.2.1函数定义28914.2.2函数声明29014.3内联函数29114.3.1内联函数的概念29114.3.2c99的内联函数定义29114.3.3gcc的内联函数定义29214.3.4内联函数的限制292习题14292第15单元输入/输出29715.1格式化输出函数printf29715.1.1printf格式参数结构29715.1.2printf基本格式符29715.1.3长度修饰符29815.1.4域宽与精度说明29915.1.5前缀修饰符29915.2格式化输入函数scanf30115.2.1scanf指针参数30115.2.2scanf格式参数结构30215.2.3数值数据的输入控制30415.2.4scanf与输入缓冲区30515.2.5字符型数据的输入控制30615.2.6scanf的停止与返回30915.3c语言的文件操作31015.3.1文件及其分类31015.3.2file类型及其指针31215.3.3c语言文件操作的一般过程31315.3.4文件操作程序示例316习题15318附录324附录ac语言关键字324附录bc语言运算符的优先级和结合方向324附录c编译预处理命令325c.1宏定义325c.2文件包含326c.3条件编译326附录dc标准库头文件326附录ec语言常用标准库函数327e.1数学函数327e.2字符函数和字符串函数328e.3输入/输出函数329e.4动态内存分配函数331e.5退出程序函数331e.6数值转换函数331e.7时间和日期函数332参考文献333。
与 gets 函数不同的是,如果 fgets 函数读到换行符,就会把它存储到字符串中,而不是像 gets 函数那样丢弃它。即给定参数 n,fgets 函数只能读取 n-1 个字符(包括换行符)。如果有一行超过 n-1 个字符,那么 fgets 函数将返回一个不完整的行(只读取该行的前 n-1 个字符)。但是,缓冲区总是以 null('\0') 字符结尾,对 fgets 函数的下一次调用会继续读取该行fgets读取一行。
字符数组中一个元素只能存放一个字符,如 char a:表示定义了一个一维字符数组a,可存放5个字符,或存放最大长度为4的1个字符串(最后一个字符是字符串结束符‘\0’)。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。这里情况比较复杂的是scanf()函数,如果是scanf("%d",&a),它会忽略输入的空白符(换行,制表,空格)直到遇见非空白字符,再将其转换成整型存储在a中,注意,由于i/o缓冲,用来刷新输入缓冲的换行符还在等待被输入接受,此时能用getchar()捕获,但是在非空字符前面被忽略的空白符却因为被scanf()丢弃,已经不存在了。
最后,它还需要第 3 个参数来说明读取哪个文件。如果是从键盘上读入数据,可以使用 stdin 作为该参数,如下面的代码所示:
int main(void)
{
char buffer[11];
fgets(buffer,11,stdin);
printf("输出: %s\n",buffer);
return 0;
}对于上面的示例代码,如果输入的字符串小于或等于 10 个字符,那么程序将完整地输出结果;如果输入的字符串大于 10 个字符,那么程序将截断输入的字符串,最后只输出前 10 个字符。示例代码运行结果为:
aaaaaaaaaaaaaaaa
输出: aaaaaaaaaa
除此之外,C99 还提供了 fgets 函数的宽字符版本 fgetws 函数,其函数的一般原型如下面的代码所示:
该函数的功能与 fgets 函数一样。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-101477-1.html
-
linux fgets 阻塞
2021-01-14 15:43:20当前位置:我的异常网» 热门搜索»linux fgets 阻塞linux fgets 阻塞www.myexceptions.net网友分享于:2013-09-23搜索量:159次场景:linux下fgets(.stdin)不阻塞?解决方案linux下fgets(..,..,stdin)不阻塞??我...当前位置:我的异常网» 热门搜索 » linux fgets 阻塞
linux fgets 阻塞
www.myexceptions.net 网友分享于:2013-09-23 搜索量:159次
场景:linux下fgets(.stdin)不阻塞?解决方案
linux下fgets(..,..,stdin)不阻塞??
我编写了一个修改文档的程序,但是不知道为什么用fgets(buf,1024,stdin)的时候就不阻塞,我是分为两个函数写的,两个函数分别工作的时候就正常,两个函数合起来工作的时候就会这样,求救!!
函数如下:
find函数寻找对应项,modify函数修改对应项。
#include
extern int modify(FILE *fp);
int main()
{
FILE *fp;
if(fp=fopen( "./t.txt ", "r+ ")==NULL)
{
printf( "there is no such file ");
return -1;
}
find(fp);
modify(fp);
fclose(fp);
return 0;
}
int find(FILE *fp)
{
char *t;
char *idata;
char *namebuf,*buf2,*addr,*tempbuf;
char *searchname;
char *tsearchname,*tnamebuf;
long count;
long offsize;
offsize=0;
fseek(fp,0,SEEK_SET);
searchname=(unsigned char *)malloc(1024);
idata=(unsigned char *)malloc(1024);
tsearchname=(unsigned char *)malloc(1024);
tsearchname=searchname;
while((*searchname=(unsigned char)fgetc(stdin))!= ': ')
{
searchname++;
}
namebuf=(unsigned char *)malloc(1024);
tempbuf=(unsigned char *)malloc(1024);
tnamebuf=(unsigned char *)malloc(1024);
namebuf=tnamebuf;
while((t=fgets(tempbuf,1024,fp))!=NULL)
{
fseek(fp,offsize,SEEK_SET);
while((*tnamebuf=(unsigned char)fgetc(fp))!= ': ')
{
tnamebuf++;
printf( "the number is:%s\n ",namebuf);
}
printf( "namebuf:%s\nsearchname:%s\n ",namebuf,tsearchname);
int a=0;
if((a=strcmp(namebuf,tsearchname))==0)
break;
printf( "strcmp is:%d\n ",a);
tnamebuf=namebuf;
fgets(tempbuf,1024,fp);
offsize=ftell(fp);
printf( "%s\n ",tempbuf);
}
if(t==NULL)
{
printf( "can 't find the number\n ");
return 1;
}
else
{
printf( "the number %s is found\n ",namebuf);
printf( "end here\n ");
}
printf( "enter your data **:**\n ");
printf( "yeye\n ");
return 0;
}
int modify(FILE *fp)
{
char *pointbuftemp;
char *buf,*buf2,*buftemp;
int rest;
long current,next,nextnext,departure;
buf=(unsigned char *)malloc(1024);
buftemp=(unsigned char *)malloc(1024);
buf2=buf;
current=ftell(fp);
rest=1024;
fgets(buf,rest,fp);
next=ftell(fp);
departure=0;
while(fgets(buf,rest,fp)!=NULL)
{
nextnext=ftell(fp);
departure=nextnext-next;
next=ftell(fp);
rest-=departure;
buf+=departure;
}
fseek(fp,current,SEEK_SET);
fgets(buftemp,1024,stdin);
fputs(buftemp,fp);
fputs(buf2,fp);
printf( "fflush?\n ");
return 0;
}
请问这是什么原因,应该怎么办呢?谢谢!!
------解决方案--------------------
设这样的
*searchname=(unsigned char)fgetc(stdin)!= ': '
读完以后,缓冲区里的\n号没读取出来.在modify内再用fgets(buftmp,1024,stdin)读时就会把这个 '\n '读走.
这样改一下就可以了:
while((*searchname=(unsigned char)fgetc(stdin))!= ': ')
{
searchname++;
}
fgetc(stdin); //添加一句.
不过说实话,楼主的程序有很多地方都是冗余的.
你的malloc分配的空间,好象都没free吧.
文章评论
-
fgets函数及其用法,C语言fgets函数详解
2021-05-23 11:51:35fgets函数及其用法,C语言fgets函数详解虽然用 gets() 时有空格也可以直接输入,但是 gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,... -
C语言fgets返回值 C语言fgets读取头文件出现问题
2021-05-21 14:36:24c语言中fgets函数的返回值,什么情况下返回空指针。c语言中fgets函数的返回值,什么情况下返回空指针。如题fgets 是系统输入函数,从文件流读入一行字符串,含空格键等,函数原型是: char * fgets ( char * str, ... -
标准I/O库函数:fgets与gets比较分析
2021-01-19 22:46:37函数名:fgets 功能:从流中读取一个字符串 用法:char *fgets(char *string,int n,FILE *stream); 形参注释: *string:结果数据的首地址;n-1:读入数据块的长度,其默认值为1k,即1024;stream文件... -
标准IO fgets的使用
2022-03-02 10:42:55所以偷懒直接使用了fgets来使用。 使用过程中,发现fgets在读取行内容的过程中,会将末尾的换行符 '\n'也读进来。 测试代码如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h&... -
fgets和fputs函数
2022-04-20 21:37:39将下面的内容复制到 D:\\demo.txt:读字符串函数 fgets fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的用法为: char *fgets ( char *str, int n, FILE *fp ); str 为字符数组,n 为... -
fgets 函数用法
2019-07-22 16:40:35来说一说fgets(..)函数。 原型 char * fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针,指向存储读入数据的缓冲区的地址。 n: 从流中读入n-1个字符 stream : 指向读取的流。 返回值: 1... -
C语言fgets函数用法
2022-04-29 13:50:45fgets() 的原型为: include <stdio.h> char *fgets(char *s, int size, FILE *stream); 有三个参数。它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针... -
fgets函数 linux中fgets函数怎么用
2021-05-12 00:09:33fgets函数——linux中fgets函数如何理解fgets函数是从输入流中读取一个字符串,它是遇到换行符,或者传输了限定的字符数量,或者遇到EOF文件尾就停止(它会把换行符也加到接收字符串里面)。fgets函数的原型是:c... -
C/C++语言文件操作之fgets
2019-07-31 12:35:34来说一说fgets(..)函数。 原型 char * fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针,指向存储读入数据的缓冲... -
linux fgets阻塞,linux下fgets(..,..,stdin)不阻塞??
2021-05-18 05:18:23我编写了一个修改文档的程序,但是不知道为什么用fgets(buf,1024,stdin)的时候就不阻塞,我是分为两个函数写的,两个函数分别工作的时候就正常,两个函数合起来工作的时候就会这样,求救!!函数如下:find函数寻找... -
关于fgets()函数的使用方法
2022-03-18 19:58:56在读取字符串时,scanf()和转换说明符%s只能读取一个单词。gets()函数简单易用,它读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符,...如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第 -
C语言 文件读写 fgets 函数 - C语言零基础入门教程
2021-10-19 14:24:03一.fgets 函数简介 二.fgets 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fgets 函数简介 fgets 函数功能为从指定的流中读取数据,每次读取一行。其原型为: #... -
fgets和read区别
2021-06-25 00:05:34char string[20]; int main() { write(1, ">... fgets(string, sizeof string, stdin); printf("%s\n", string); printf("sizeof: %ld \n", sizeof string); for (int i = 0; i < sizeof string; i -
EDA/PLD中的标准I/O库函数:fgets与gets比较分析
2020-11-08 21:10:15函数名:fgets 功能:从流中读取一个字符串 用法:char *fgets(char *string,int n,FILE *stream); 形参注释: *string:结果数据的首地址;n-1:一次读入数据块的长度,其默认值为1k,即1024;stream...