文章目录
标准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()实现文件的复制?
要求:
- 通过命令行参数传递源文件和目标文件名
- 通过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