【linux-lv4-Day2】标准I/O-流的读写、刷新、定位、判断

标准I/O

Day2

读/写 流

流支持不同的读写方式:

  • 读写一个字符:fgetc() / fputc() 一次读/写一个字符
  • 读写一行:fgets() / fputs() 一次读/写一行,一般适用于文本文件
  • 读写若干个对象:fread() / fwrite() 每次读/写 若干个对象 而每个对象具有相同的长度
如何从一个流中读/写一个字符?
按字符输入

下列函数用于从流中读取一个字符:
#include <stdio.h>
int fgetc(FILE * stream);
int getc(FILE * stream);
int getchar(void);

  • 其中fgetc()与getc()等价,参数就是一个流指针
  • getchar()等同于fgetc(stdin)

示例

linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s fgetc1.c 
#include <stdio.h>

int main()
{
   
	int ch;
	ch=fgetc(stdin);//先从键盘读入一个字符
	printf("%c\n",ch);//再打印到终端上,此时是标准输出流-->行缓冲-->必须加'\n'

	return 0;
}
linux@linux-virtual-machine:~/test/lv4/Day2$ gcc fgetc1.c -o fgetc1 -Wall
linux@linux-virtual-machine:~/test/lv4/Day2$ ./fgetc1
a
a
linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s fgetc2.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc,char * argv[])
{
   
	FILE *fp;
	int ch;
	int count=0;
	if((fp=fopen(argv[1],"r+"))==NULL)
	{
    
		perror("fopen");
		return -1;
	}
	//如果文件打开成功,则利用while循环用fgetc从流中读取字符,并判断返回值,如果不=EOF则说明读取到了一个字符,计数器+1,一直读到文件末尾(会返回EOF)
	while((ch=fgetc(fp))!=EOF)
	{
    
		count++;
	}
	printf("total %d bytes\n",count);

}
linux@linux-virtual-machine:~/test/lv4/Day2$ gcc fgetc2.c -o fgetc2 -Wall
linux@linux-virtual-machine:~/test/lv4/Day2$ ./fgetc2 src.txt
total 9 bytes
linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s src.txt
src_file

按字符输出

下列函数用于向流中输出一个字符:
#include <stdio.h>
int fputc(int c,FILE * stream);
int putc(int c, FILE * stream);
int putchar(int c);

  • 其中fputc()与putc()用法相同,第一个参数为我们想要输出的字符,第二个参数是指定向哪一个流输出。成功时返回写入的字符,出错时返回EOF
  • putchar()等同于fputc(stdout);因此,在日常使用中用putchar()更方便;

示例

linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s fputc1.c
#include <stdio.h>

int main()
{
   
	fputc('a',stdout);
	putchar('\n');

}
linux@linux-virtual-machine:~/test/lv4/Day2$ gcc fputc1.c -o fputc1 -Wall
linux@linux-virtual-machine:~/test/lv4/Day2$ ./fputc1
a
linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s fputc2.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc,char * argv[])
{
   
	FILE * fp;
	int ch;
	if((fp=fopen(argv[1],"w"))==NULL)
	{
   
		perror("fopen");
		return -1;
	}
	for(ch='a';ch<='z';ch++)
	{
   
		fputc(ch,fp);
	}

	return 0;
}

linux@linux-virtual-machine:~/test/lv4/Day2$ gcc fputc2.c -o fputc2 -Wall
linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s src.txt
src_file
linux@linux-virtual-machine:~/test/lv4/Day2$ ./fputc2 src.txt
linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s src.txt
abcdefghijklmnopqrstuvwxyzlinux@linux-virtual-machine:~/test/lv4/Day2$ 
思考和练习

如何利用fgetc() 和 fputc()实现文件的复制?
要求:

  1. 通过命令行参数传递源文件和目标文件名
  2. 通过fgetc()返回值判断是否读到文件的末尾
linux@linux-virtual-machine:~/test/lv4/Day2$ cat -s ans.c
#include <stdio.h>
int main(int argc,char * argv[])//argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数是命令行后面跟的用户输入的参数
{
   
	FILE *fps,*fpd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值