Linux系统编程4标准IO - fgetc和fputc

学习自李慧琴老师


实验1 以字符拷贝的方式,fgetc,fputc 实现 cp 命令,mycpy,格式是 ./mycpy srcfile destfile

实验2 利用 fgetc()查看一个文件中有多少个有效字符


1 字符的输入 fgetc, getc, getchar

字符的输入:fgetc, getc, getchar

NAME
fgetc, getc, getchar, - input of characters ,字符的输入

SYNOPSIS
#include <stdio.h>

   int fgetc(FILE *stream); //以整型来接收读到的字符
   int getc(FILE *stream);  //以整型来接收读到的字符
   int getchar(void);

DESCRIPTION

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

从任何成功打开的流中获取内容,包括标准输入以及已经存在的文件中。fgetc()会被定义成函数来使用,以整型来接收读到的字符


getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.
从任何成功打开的流中获取内容,包括标准输入以及已经存在的文件中。getc()会被定义成宏使用


getchar() is equivalent to getc(stdin).
从标准输入读入一个字符(函数参数是标准输入,即终端)


返回值

fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.

返回 以整型来接收读到的字符,读到文件尾端或者读取失败则返回 EOF

注意:函数和宏的区别:
内核链表通篇都是宏来实现的,除了inline内联函数就是宏,没有用函数,这样做的目的是节约时间,宏不占用调用时间,只占用编译时间。函数的调动 只占用调用时间,不占用编译时间。内核这样的实现是为了节约时间,在对时间要求非常高的情况,如汽车的安全气囊,是不允许气囊晚一点点时间弹出来的。

2 字符的输出:fputc,fputc,putchar

NAME
fputc, putc, putchar - output of characters,字符的输出

SYNOPSIS
#include <stdio.h>

   int fputc(int c, FILE *stream);
   int putc(int c, FILE *stream);
   int putchar(int c);

DESCRIPTION

fputc() writes the character c, cast to an unsigned char, to stream.
将指定输出项 输出到一个指定流上,包括标准输出流,标准出错流,以及任何一个已经成功打开的流(文件),将转换为无符号字符的字符C写入流


putc() is equivalent to fputc() except that it may be implemented as a macro which evaluates stream more than once.

将指定输出项 输出到一个指定流上,包括标准输出流,以及任何一个已经成功打开的流(文件),它可以作为一个宏来实现


putchar© is equivalent to putc(c, stdout).
把指定的字符输出到标准输出(即终端)


实验1 以字符拷贝的方式,fgetc,fputc 实现 cp 命令,mycpy,格式是 ./mycpy srcfile destfile

利用命令行传参:

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

int main(int argc,char *argv[])
//int main(int argc,char **argv)
{
	FILE *fps=NULL;
FILE *fpd=NULL;
	int ch=0;

//检查命令行参数
	if(argc < 3)
	{
//向标准错误报错
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);//结束
	}

/* 以只读的形式打开流
原因1:保证流必须存在,
原因2:不允许改变流 srcfile的内容
*/
	fps = fopen(argv[1],"r");//这里的argv[1] 即命令行参数中的源文件 srcfile
	if(fps == NULL)
	{
		perror("fopen()");
		exit(1);
	}

	fpd = fopen(argv[2],"w");
	if(fpd == NULL)
	{	
 fclose(fps);//避免内存泄漏
		perror("fopen()");
		exit(1);
	}

	while(1)
	{
		ch = fgetc(fps);
//如果读到文件尾端或者读取失败,退出
		if(ch == EOF)
			break;
 //将读到的字符写入目标流
		fputc(ch,fpd);
	}

//先关闭 目的文件,再关闭源文件
	fclose(fpd);
	fclose(fps);
}

mhr@ubuntu:~/work/linux/stdio/mycpy$ gcc mycpy.c 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ll
total 28
drwxrwxr-x 2 mhr mhr 4096 Apr 19 03:36 ./
drwxrwxr-x 3 mhr mhr 4096 Apr 19 03:32 ../
-rwxrwxr-x 1 mhr mhr 8864 Apr 19 03:36 a.out*
-rw-rw-r-- 1 mhr mhr  407 Apr 19 03:34 mycpy.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr    0 Apr 19 03:33 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out test1 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ ll
total 32
drwxrwxr-x 2 mhr mhr 4096 Apr 19 03:36 ./
drwxrwxr-x 3 mhr mhr 4096 Apr 19 03:32 ../
-rwxrwxr-x 1 mhr mhr 8864 Apr 19 03:36 a.out*
-rw-rw-r-- 1 mhr mhr  407 Apr 19 03:34 mycpy.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ diff test1 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out 
Usage:./a.out <src_file> <dest_file>
mhr@ubuntu:~/work/linux/stdio/mycpy$ 

可以查看 读出来或者写进去的 ch值,即

printf("write char character = %d\n",ch);
或
printf("write char character = %c\n",ch);

mhr@ubuntu:~/work/linux/stdio/mycpy$ gcc mycpy.c 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out test1 test2
write char character = 48
write char character = 49
write char character = 50
write char character = 51
write char character = 52
write char character = 53
write char character = 54
write char character = 55
write char character = 56
write char character = 57
write char character = 10
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ gcc mycpy.c 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out test1 test2
write char character = 0
write char character = 1
write char character = 2
write char character = 3
write char character = 4
write char character = 5
write char character = 6
write char character = 7
write char character = 8
write char character = 9
write char character = 

mhr@ubuntu:~/work/linux/stdio/mycpy$ 

实验2 利用 fgetc()查看一个文件中有多少个有效字符

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

int main(int argc,char *argv[])
{
	FILE *fp =NULL;

//此时实验是小文件,用int 计算文件中字符个数不会溢出。如果是大文件 可以用long
	int count = 0;

	if(argc < 2)
	{
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);
	}
	
	fp = fopen(argv[1],"r");
	if(fp == NULL)
	{
		perror("fopen()");
		exit(1);
	}
	
//如果读到文件尾
	while(fgetc(fp) != EOF)
	{
		count ++;
	}

	printf("count = %d\n",count);
	fclose(fp);
	exit(0);
}

mhr@ubuntu:~/work/linux/stdio$ ll
total 44
drwxrwxr-x 3 mhr mhr 4096 Apr 19 03:57 ./
drwxrwxr-x 3 mhr mhr 4096 Apr 16 08:28 ../
-rwxrwxr-x 1 mhr mhr 8936 Apr 19 03:57 a.out*
-rw-rw-r-- 1 mhr mhr  376 Apr 19 03:57 fgetc.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:54 test
mhr@ubuntu:~/work/linux/stdio$ 
mhr@ubuntu:~/work/linux/stdio$ gcc fgetc.c 
mhr@ubuntu:~/work/linux/stdio$ ./a.out test 
count = 11
mhr@ubuntu:~/work/linux/stdio$ 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Linux老A

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

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

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

打赏作者

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

抵扣说明:

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

余额充值