“ Ctrl AC!一起 AC!”
目录
流的概述
在C语言中的每个串行输入源和输出目标被称为“流”。
输入流
输入流是一个串行数据源,可以为程序提供数据。
输出流
输出流是串行数据的目的地,可以接受程序的输出。
在输入操作中,字节从输入设备流向内存,在输出操作中,字节从内存流向输出设备。
标准流
程序开始执行时,标准流会自动连接程序,可以直接使用。
流名称 | 流含义 | 默认连接设备 |
---|---|---|
stdin | 标准输入 | 键盘 |
stdout | 标准输出 | 屏幕 |
stderr | 标准错误 | 屏幕 |
文件的分类
文本文件
文本文件就是用字节来存储信息,如C程序源代码文件(后缀为“.c”)。
二进制文件
二进制文件用二进制数来存储信息,如C程序的可执行文件(后缀为“.exe”)。
文件指针
文件指针的类型为:
FILE *
如:
FILE *fp1 *fp2;
就定义了两个文件指针
文件的打开与关闭
fopen()函数
功能:以某方式打开某文件。
返回:打开文件成功返回文件指针,否则返回空指针。
样例:
FIEL *fp; //定义一个文件指针
fp=fopen("onefile.txt","r"); //以“r”的方式打开“onefile.txt”文件
其中“r” 是一种文件读写模式。
文件读写模式
fclose()函数
功能:关闭已打开的文件。
返回:如果成功关闭则返回零,否则返回EOF。
样例:
fclose(fp) //关闭了fp所指向的已开文件
文件检测函数
feof()函数
功能:检测文件指针读写位置是否已到达文件末尾。
返回:若已到末尾,则返回非0值(逻辑真);否则返回0(逻辑假)
样例:
feof(fp); //检测fp指针是否达到文件末尾
常用于控制文件的读写:
while(!feof(fp))
文件读写语句;
ferror()函数
功能:检测输入输出函数的调用是否出错。
返回:正常时函数返回0值,出错时函数返回非0值。
样例:
文件读写语句;
if(ferror(fp))
printf("文件读写错误!\n");
文件的读写操作
字符读写函数
fgetc()函数
功能:从文件读取一个字符。
返回:若读取成功则返回该字符,若读到文件尾则返回EOF。
样例:
while(!feof(fp))
{
char=ch;
ch=fgetc(fp); //ch得到文件指针所指的字符
...
}
while((ch=fgetc(fp))!=EOF) //判断文件是否已读到文件末尾
fputc()函数
功能:将一个字符写入文件。
返回:若写入成功则返回ch;否则返回EOF。
样例:
fputc('A',fp); //将‘A’写入fp所指的文件中
字符串读写函数
fgets()函数
功能:从指定文件中读入一行字符串。
返回:函数返回字符数组的首地址;若读取失败,返回NULL。
样例:
函数原型:
char *fgets(char *s,int n,FILE *fp);
样例:
fgets(s,20,fp);
函数原型中的n的长度包括字符串末尾的'\0',所以样例表示:从fp指向的文件中读取最大长度为19的字符串存入s。
常用:
fgets(s,sizeof(s),stdin)
//代替gets()函数,防止输入数据过长而导致非法访问
fputs()函数
功能:将一个字符串写入指定的文件。
返回:写入成功返回一个非负数,否则返回EOF。
样例:
函数原型:
int fputs(const char *s,FILE *fp);
样例:
fputs(s,fp);
格式化读写函数
fscanf()函数
功能:按格式从文件读出信息。
返回:执行成功则返回输入项的个数,否则返回0。
样例:
函数原型:
int fscanf(FILE *fp,const char *format, 变量地址列表);
样例:
fscanf(fp,"%s%d",name,&age);
//表示从fp指定的文件中读取一个字符串和一个整型数据存入name和age
fprintf ()函数
功能:按格式向文件写入信息。
返回:若成功则返回读入的字节数。
样例:
函数原型:
int fprintf(FILE *fp,const char *format,输出项列表);
样例:
char name[12]="Tony";
int age=20;
...
fprintf(fp,"%12s%6d",name,age);
//将字符串name和整型变量age的值存入fp所指向的文件
数据块读写函数
fread ()函数
原型:
unsigned fread(void *buffer,unsigned size, unsigned count,FILE *fp);
该函数从fp所指的文件中读取数据块并存储到buffer指向的内存中,buffer是待读入数据块存放的起始地址,size是每个数据块的大小,即待读入的每个数据块的字节数,count是最多允许读取的数据块个数。
返回:函数返回实际读到的数据块个数。
fwrite()函数
原型:
unsigned fwrite(const void *buffer,unsigned size,unsigned count,FILE *fp);
同上,该函数的功能是将buffer指向的内存中的数据块写入fp所指的文件,该数据块共有count个数据项,每个数据型有size个字节。
返回:执行成功则返回实际写入的数据块的个数;若所写实际数据块少于需要写入的数据项,则出错。
注意:用fwrite()写入文件的数据应该用fread()函数按相应的格式来进行读取,才能正确还原数据。
文件的随机读写
文件的定位
fseek()函数
功能:移动文件读写位置指针到指定位置。
调用方式:
fseek(文件指针,位移量,移动起始点);
符号名 | 值 | 含义 |
---|---|---|
SEEK_SET | 0 | 文件开头 |
SEEK_CUR | 1 | 文件当前位置 |
SEEK_END | 2 | 文件末尾 |
位移量 指从起始点为基点移动的字节数,正数为向文件尾移动(称为前移),负数为向文件头移动(称为后移)。
返回:如果执行成功,返回0;否则返回非0值。
样例:
fseek(fp,sizeof(a)*2,SEEK_SET);
//表示将文件读写位置指针从文件开头向前移动两个单位的a变量。
注意:fseek()函数一般用于二进制的文件读写!
ftell()函数
功能:告诉文件出错位置。
返回:出错时返回-1。
样例:
//调用格式
ftell(fp);
//样例
long postion;
if((postion=ftell(fp))==-1L) //L 是指该-1是long long型
printf("A file error has occurred at %ld.\n",postion);
rewind()函数
功能:使文件读写位置指针重新回到文件开头处。
返回:调用成功则返回0,否则返回非0值。
调用格式:
rewind(fp);
各读写函数应用实例
fgetc & fputc
· 编写一个程序,从键盘向一个txt文件输入若干行字符串(以"#"作为结束标志),并将文件的内容读出到屏幕上。
· 上代码:
#include<stdio.h>
int main() {
char ch;
FILE* fp;
fp = fopen("new_file.txt", "w");
if (fp != NULL) {
printf("请输入若干行文本,以“#”结束\n");
while ((ch = getchar()) != '#') {//读到‘#’结束
fputc(ch, fp);//将ch放入fp所指的文件
}
fclose(fp);
}
else
printf("文件创建失败!\n");
fp = fopen("new_file.txt", "r");
if (fp != NULL) {
printf("文件内容是:\n");
while (!feof(fp)) {
ch = fgetc(fp);//将读到的字符放入ch,以便输出
putchar(ch);
}
fclose(fp);
}
else
printf("文件打开失败!\n");
return 0;
}
· 运行情况:
fgets & fputs
见博主的另一篇文章,嘻嘻
fscanf & fprintf
· 将学生一的信息复制给学生二
· 上代码:
#include<stdio.h>
int main() {
FILE* fp;
fp = fopen("new_file.txt", "w+");
char name1[12] = "Tony";
int score1 = 20;
char name2[20]; int score2=0;
fprintf(fp, "%12s%6d", name1, score1);
rewind(fp);//写完后指针需要重回起点
fscanf(fp, "%s%d", name2, &score2);
fclose(fp);
printf("学生2的姓名和成绩:\n");
puts(name1);
printf("%d", score2);
return 0;
}
· 运行情况:
fread & fwrite
· 题目同上
· 上代码:
#include <stdio.h>
typedef struct people {
char name[10];
int age;
}peop;
int main()
{
peop p1[2] = { {"Astudent", 24}, {"BStudent", 20} };
peop p2[2];
FILE* fp = fopen("new_file", "w+");
fwrite(p1, sizeof(peop), 2, fp);
rewind(fp);
fread(p2, sizeof(peop), 2, fp);
fclose(fp);
for (int i = 0; i < 2; i++) {
puts(p2[i].name);
printf("%d\n", p2[i].age);
}
return 0;
}
· 运行情况:
感谢阅读!!!
“ Ctrl AC!一起 AC!”