数据输入输出对象之间的关系图:
函数使用说明:
1. 一个字符的输入 \ 输出, 对象是键盘(缓存和屏幕)
- 1.1.getchar(a),putchar(a);
- 1.2.scanf("%d",&i),printf("%d",i)
2. 一个变量的输入 \ 输出, 对象是键盘(缓存和屏幕)
- 2.1. gets(a),puts(a)
- 2.2.scanf("%d %c %2f",&i,&a,&b),printf("%d %c %2f",i,a,b)
3. 一个字符的输入 \ 输出, 对象是文件(磁盘文件和缓存)
- 3.1.p=fgetc(fp),fput(p,fp);p=getc(fp),putc(p,fp)
- 3.2.p=getw(fp),putw(i,fp)
注释: 用来对磁盘文件读写一个字(整数)
函数定义:
- >int i; FILE *fp; >FILE *fp;
- >putw(i,fp){
- >getw(fp){
- >char *s; s=&i; >char *s; int i;
- >putc(s[0],fp);putc(s[1],fp); >s=&i; s[0]=getc(fp); s[1]=getc(fp);
- >return(i);
- } >return(i);
- }
4. 一 \ 多个字符窜的输入 \ 输出, 对象是文件(磁盘文件和缓存)
4.1.fgets(str,n,fp),fputs(str,fp)
注释://fgetc()函数 (getc() 宏)与 fputc()函数 (putc() 宏)
getc() putc()是宏, fgetc(),fputc()是函数, 它们之间的关系
- #define putc(ch,fp) fputc(ch,fp)
- #define getc(fp) fgetc(fp)
由此可见, getc(fp)是 fgetc(ch,fp)定义的宏, putc(ch,fp)是 fputc(ch,fp)定义的宏, 它们实现的功能一样
4.2. fread(buffer,size,count,fp),fwrite(buffer,size,count,fp)
注释: fread(读入存放数据的地址(buffer), 要读写的字节数(size), 读写多少个 size 字节的数据项(count), 文件型指针(fp));
fwrite(输出存放数据的地址(buffer), 要读写的字节数(size), 读写多少个 size 字节的数据项(count), 文件型指针(fp));
例子:
- fread(&stud[i],sizeof(struct student_type),1,stdin); // 读取数据到缓存里的结构 \ 数组变量, 用 printf()显示数据到屏幕
- fwrite(&stud[i],sizeof(struct student_type),1,stdin);
- 4.3. fscanf(fp,"%d,%c,%2f",&i,&a,&b),fpringf(fp,"%d,%c,%2f",i,a,b)
注释: 格式限制输入 \ 输出, 读写对象不是终端而是磁盘文件(建议少用), 可以与 fread 和 fwrite 替换, 调用格式:
- fscanf(文件指针, 格式字符串, 输出表列); // 从磁盘文件读取数据到缓存里的变量, 用 printf()显示数据到屏幕???
- fprintf(文件指针, 格式字符串, 输出表列);
例子: fscanf(fp,"%d,%f",&i,&t);
fprintf(fp,"%d,%6.2f",i,t);
文件结构体: typedef struct { int -fd; // 文件号 int -cleft; // 缓冲区中剩下的字符 int -mode; // 文件操作模式 char * -nextc; // 下一个字符位置 char * -buff; // 文件缓冲区位置 }FILE;
例子 1: 打开一个已存在文件, 录入字符串到文件
- #include"stdio.h" void main(){
- FILE *in,; char *ch;
- //r + 为读 / 写打开一个文本文件, 文件为非空文件, 则要把位置指针职位文件末尾, 需加 fseek(in,0,2); 语句
- in=fopen("E:\\ 新建文件夹 \\ 新建文件夹 \\a.txt","r file://a.txt%22%2C%22r/ +"); //a 在文件末尾追加数据, 空文件和非空文件位置指针都是在文件末尾
- //rewind(in); // 使位置指针重新回到文件开头
- //i=ftell(fp); // 获得当前指针位置
- fseek(in,0,2); // 使位置指针回到文件末尾
- //ch=c; // 录入的字符串会产生乱码, 赋值错误
- ch=&c[0]; //1. 使用指针
- //scanf("%s",c); //2. 使用数组
- gets(ch);
- fputs(ch,in); puts(ch);
- fclose(in);
- }
例子 2: 录入字符, 在屏幕显示录入字符, 显示文件里的全部内容
- #include "stdio.h"
- #include "stdlib.h"
- #define EOP -1 // 定义宏, 文件结束符
- void main(){
- FILE *in;
- char ch[50],p;
- printf("Please input the file name:\n");
- scanf("%s",ch);
- if((in=fopen(ch,"r+"))==NULL){
- // 定义文件字符串要足够长, 不然会出错
- printf("error!"); exit(0);
- }
- fseek(in,0,2);
- p=getchar();
- while(p!='#'){
- fputc(p,in);
- putchar(p);
- p=getchar();
- } printf("\n");
- rewind(in); // 文件流指针移到文件开始位置
- p=fgetc(in);
- while(!feof(in)){
- //p!=EOF 不适合缓冲文件系统处理二进制文件的情况; 错误: p!='\0' p!='\n'
- putchar(p);
- p=fgetc(in);
- } fclose(in); printf("\n");
- }
C 语言 ->关于文件数据的录入和输出调用的函数总结
来源: http://www.bubuko.com/infodetail-3281487.html