1、基于字符的I/O
基于字符的I/O通常是用来处理单个字符的。
(1)字符的输入
以下三个函数用于一次读入一个字符:
#include <stdio.h>
Int getc(FILE *fp);
Int fgetc(FILE *fp);
Int getchar(void);
3个函数的返回:若成功则返回读入字符的值,若已处文件尾端或出错则为EOF
(2)字符的输出
#include<stdio.h>
Int putc(int c ,FILE *fp);
Int fputc(int c ,FILE *fp);
Int putchar(int c);
三个函数返回:若成功则为c,若出错则为EOF
2、基于行的I/O
当输入中的内容遇到‘\n’换行符的时候,则将流中'\n'之前的内容送到缓冲区中的I/O方式称为基于行的I/O,即每次一行的I/O。
(1)行的输入
Fgets 和gets函数实现输入一行字符串
#include<stdio.h>
Char *fgets(char *buf,int n,FILE *fp);
Char *gets(char *buf);
两个函数的返回:若成功则返回缓冲区中的首地址,若已处文件尾或出错则为NULL;
(2)行的输出
fputs和puts函数实现输出一行字符串
#include<stdio.h>
Int fputs(const char *buf,FILE *restrict fp);
Int puts(const char *str);
3、直接I/O
二进制I/O操作
#include<stdio.h>
Size_t fread(void *ptr,size_t size,size_t nmemb,FILE *fp);
Size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *fp);
两个函数的返回:读或写的对象数
fread函数用于执行直接输出操作。参数ptr是指向读取数据的缓冲区的指针,size是读取对象的大小,nmemb表示欲读取的对象的个数,fp是指向要读取的流的FILE结构指针。
fwrite函数用于执行直接输入操作。参数ptr是指向存放将要输入数据的缓冲区的指针,size是写入对象的大小,nmemb表示欲写入的对象的个数,fp是指向要写入的流的FILE结构指针。
这些函数有两种常见的用法:
1)读或写一个二进制数组。例如:将一个浮点型数组的第2~5个元素写到一个文件上。:
Float data[10];
if(fwrite(&data[2],sizeof(float),4,fp)!=4)
printf(“fwrite error !\n”);
2)读或写一个结构
struct{
short count;
long total;
Char name[NAME_SIZE];
}item;
if(fwrite(&item,sizeof(item),1,fp)!=1)
printf(“fwrite error !\n”);
3、格式化I/O
基于流的I/O操作的一个最大的特点就是它可以实现格式化的输入输出(基于字符和行的I/O,以及直接I/O统称为非格式化I/O)。格式化I/O是最常见的I/O方式,比如我们常见的printf和scanf。
(1)格式化输出
执行格式化输出处理的是4个printf函数
#include<stdio.h>
Int printf(const char *format,……);
Int fprintf(FILE *fp,const char * format,……);
两个函数的返回:若成功则为实际输出的字符数,若输出出错则为负值;
Int sprintf(char *str,const char*format,……);
Int snprintf(char *str,size_t size,const char *format,……);
两个函数的返回:若成功则为实际存入缓存的字符数,若出错则为负值
(2)格式化输入
执行格式化输入处理的是3个scanf函数
#include<stdio.h>
Int scanf(const char *format);
Int fscanf(FILE *fp,const char *format,……);
Int sscanf(char *str,const char *format,……);
3个函数的返回:若成功则返回指定的输入项数,若输入出错,或在任意变换前已至文件尾端则为EOF