Linux系统编程5标准IO - fgets和fputs

学习自李慧琴老师


实验1:fgets 正常结束情况说明
实验2:以字符串拷贝的方式实现cp, fgets(),fputs()


1 fgets说明

/*
读取文件后的存储地址
读取大小
源文件
*/
char *fgets(char *s, int size, FILE *stream);

返回值:
fgets() returns s on success, and NULL on error or when end of file occurs while no characters have been read.
成功返回s地址,失败或者读完 返回空指针。

注意区分 fget() 返回值 成功为字符整形值,失败为 EOF

两种可能造成该函数的正常结束

情况1,读到了 size-1 个有效字节,为什么只读取SIZE-1个字节,因为读取的是一个字符串。所以最后剩下一个字节位是要存 ‘\0’ 的。
情况2,遇到 ‘\n’换行符, '\n’表示当前字符串的结束

实验1:fgets 正常结束情况说明

#define SIZE 5
char buf[SIZE];
char *fgets(buf, SIZE, stream);

情况1,如果文件中的内容是 abcdef,那么第一次读取的时候,那5个字节的空间中存储的分别是 a b c d \0,读完后当前文件的当前位置指针是在e这个位置处。

情况2,如果文件中的内容是 ab, 对该文件进行读取的话,读完ab 之后, 其实后面还有一个字符‘\n’,也会被读取。 所以对该文件读取之后,buf 中存储的内容就是 a b \n \0,其中\0是自动补的。

注意:当我们vim 打开一个空文档时候,只要进入编辑模式,即使没有输入,但是其实该空文档也是有一个字符的,该字符就是第一行默认的‘\n’换行符。即使是文件最后一行的内容,结尾也有 ‘\n’换行符。

情况3:擦边球情况
如果文件中的内容是 abcd,如果用上面fgets()读取,需要读几次才能读取完该文件 ,需要读两次。
第一次 -> a b c d ‘\0’,读到了 SIZE-1个字符
第二次 -> ‘\n’ ‘\0’


2 fputs说明

int fputs(const char *s, FILE *stream);

DESCRIPTION
fputs() writes the string s to stream, without its terminating null byte (’\0’).

实验2 以字符串拷贝的方式实现cp, fgets(),fputs()

#include<stdio.h>
#include<stdlib.h>

#define BUFSIZE 1024

int main(int argc,char *argv[])
//int main(int argc,char **argv)
{
	FILE *fps,*fpd;
	char buf[BUFSIZE];

	if(argc < 3)
	{
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);
	}

	fps = fopen(argv[1],"r");
	if(fps == NULL)
	{
		perror("fopen()");
		exit(1);
	}

	fpd = fopen(argv[2],"w");
	if(fpd == NULL)
	{
		fclose(fps);
		perror("fopen()");
		exit(1);
	}

	while(fgets(buf,BUFSIZE,fps) != NULL)
	{
		fputs(buf,fpd);
	}
	
	fclose(fpd);
	fclose(fps);
}


mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ 
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ 
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ gcc mycpy_fgets.c 
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ ll
total 28
drwxrwxr-x 2 mhr mhr 4096 Apr 19 06:55 ./
drwxrwxr-x 4 mhr mhr 4096 Apr 19 06:45 ../
-rwxrwxr-x 1 mhr mhr 9024 Apr 19 06:55 a.out*
-rw-rw-r-- 1 mhr mhr  531 Apr 19 06:55 mycpy_fgets.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr    0 Apr 19 06:45 test2
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ ./a.out test1 test2
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ ll
total 32
drwxrwxr-x 2 mhr mhr 4096 Apr 19 06:55 ./
drwxrwxr-x 4 mhr mhr 4096 Apr 19 06:45 ../
-rwxrwxr-x 1 mhr mhr 9024 Apr 19 06:55 a.out*
-rw-rw-r-- 1 mhr mhr  531 Apr 19 06:55 mycpy_fgets.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr   11 Apr 19 06:55 test2
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值