标准IO的字符输入和输出
一、单个字符的输入与输出
1、读单个字符
下列函数用来输入一个字符
:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream); //宏
int getchar(void);
成功
时返回读取的字符
;若到文件末尾
或出错
时返回EOF(-1)
getchar()
等同于fgetc(stdin)
getc
和fgetc
区别是一个是宏
一个是函数
注意事项:
1、函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
2、stdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
3、打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。
读写注意文件位置!
4、调用getchar会阻塞,等待你的键盘输入
示例:
int ch;
ch = fgetc(stdin);
printf(“%c\n”, ch);
FILE *fp;
int ch, count = 0;
if ((fp = fopen(argv[1], “r”)) == NULL)
{
perror(“fopen”);
return -1;
}
while ((ch = fgetc(fp)) != EOF)
{
count++;
}
printf(“total %d bytes\n”, count);
2、写单个字符
下列函数用来输出一个字符
:
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
成功
时返回写入的字符
;出错
时返回EOF(-1)
putchar( c )
等同于fputc(c, stdout)
注意事项:
1、返回和输入参数都是int类型
2、遇到这种错误:Bad file descriptor,
很可能是文件打开的模式错误(只读模式去写,只写模式去读)
示例:
fputc(‘a’, stdout);
putchar(‘\n’);
FILE *fp;
int ch;
if ((fp = fopen(argv[1], “w”)) == NULL)
{
perror(“fopen”);
return -1;
}
for(ch = ‘a’; ch <=‘z’; ch++)
{
fputc(ch, fp);
}
二、整行的输入与输出
1、读取整个行
下列函数用来输入一行
:
#include <stdio.h>
char *gets(char *s);
char *fgets(char *s, int size, FILE *stream);
成功
时返回s
,到文件末尾
或出错时
返回NULL
gets
不推荐使用,容易造成缓冲区溢出
- 遇到
’\n’
或已输入size-1
个字符时返回,返回时自动加上’\0’
注意事项:
1、gets函数已经被淘汰,因为会导致缓冲区溢出
2、fgets 函数第二个参数,输入的数据超出size,
size-1个字符会保存到缓冲区,最后添加’\0’,
如果输入数据少于size-1 后面会添加换行符。
#define N 6
char buf[N];
fgets(buf, N, stdin);
printf(“%s”, buf);
2、写整个行
下列函数用来输出字符串
:
#include <stdio.h>
int puts(const char *s);
int fputs(const char *s, FILE *stream);
成功
时返回输出的字符个
数;出错
时返回EOF(-1)
puts
将缓冲区s
中的字符串输出
到stdout
,并追加’\n’
fputs
将缓冲区s
中的字符串输出到stream
,不追加 ‘\n’
示例:
puts(“hello world”);
FILE *fp;
char buf[] = “hello world”;
if ((fp = fopen(argv[1], “a”)) == NULL)
{
perror(“fopen”);
return -1;
}
fputs(buf, fp);
三、二进制的输入与输出
文本文件
和二进制文件
的区别:
存储的格式
不同,文本文件
只能存储文本。
下列函数用来从流中读写
若干个对象:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
成功
返回读写的对象个数
;出错
时返回EOF(-1)
- 既可以
读写文本文件
,也可以读写数据文件
,效率高
二进制读写函数元素解析:
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
void *ptr
: 读取内容放的位置指针size_t size
:读取的块大小size_t n
: 读取的个数FILE *fp
: 读取的文件指针
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
void *ptr
: 写文件的内容的位置指针size_t size
:写的块大小size_t n
: 写的个数FILE *fp
: 要写的文件指针
注意事项:
文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。
解决办法:移动指针(后面讲解)到文件头;关闭文件,重新打开
示例:
int s[10];
if (fread(s, sizeof(int), 10, fp) < 0)
{
perror(“fread”);
return -1;
}
struct student
{
int no;
char name[8];
float score;
} s[] = {{ 1, “zhang”, 97}, {2, “wang”, 95}};
fwrite(s, sizeof(struct student), 2, fp);
到这里就结束啦!