欢迎光临散文网 会员登陆 & 注册

LinuxC函数Popen与fgets,feof配合使用碰到的问题

2022-09-25 14:02 作者:飞扬的青  | 我要投稿

一、函数定义

二、需要包含下列头文件

三、函数说明

popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。

  • 如果 type 为 r,那么调用进程读进 command 的标准输出。

  • 如果 type 为 w,那么调用进程写到 command 的标准输入。

四、具体使用

popen会将pwd的执行结果读取到文件指针fp中,fgets将指针中的结果传到字符串数组buffer中;

五、使用中的问题

四中程序的执行结果如下:

执行结果

可以看出将pwd指令执行的结果打印了两次,下面分析原因:

1、当文件指针为结束符时,feof执行结果为非0,循环才会结束,而使用fgets去读popen执行结果fp中的内容时,碰到第一个换行符\n,fgets会结束本次读操作,此时fp还未到结束符EOF处,所以会继续执行循环中的内容,在第二次读取到EOF时就会结束循环,而buffer中还是之前的内容;

2、fgets在读取文件指针时会将换行符\n也读取进去,修改代码如下

修改后执行结果:

六、其他注意事项

feof函数:

feof判断文件结束是通过读取函数fread/fscanf等返回错误来识别的,故而判断文件是否结束应该是在读取函数之后进行判断。比如,在while循环读取一个文件时,如果是在读取函数之前进行判断,则如果文件最后一行是空白行,可能会造成内存错误。

fgets函数:

1、从流中读入 n-1 个字符放入 s 为起始地址的空间内。如果在未读满 n-1 个字符之时,已读到一个换行符(' ')或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符(' ')。因此,确切地说,调用 fgets() 函数时,最多只能读入 n-1 个字符。读入结束后,系统将自动在最后加 '',并以 s 作为函数值返回。

2、每次调用,fgets都会把缓冲区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有LINE_SIZE个字符(包括换行符),要想把这行读入缓冲区,请把参数n设为LINE_SIZE+1

3、不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。

4、给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。

LinuxC函数Popen与fgets,feof配合使用碰到的问题的评论 (共 条)

分享到微博请遵守国家法律