文件操作笔记
fopen():文件打开操作
头文件:stdio.h
函数定义:FILE *fopen(char *pname, char *mode)
函数说明:pname是文件名,mode是打开文件的方式
以“r+”的方式打开一个文件,会清空文件的原始内容,重新写入数据
返回值:
正常返回:FILE *一个指向文件在内存中的文件信息去的开头
异常返回:NULL,表示打开操作不成功
打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;
(4)返回值
正常返回:被打开文件的文件指针。
异常返回:NULL,表示打开操作不成功。
说明:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。
fclose():文件关闭
函数定义:int fclose(FILE *fp);
函数说明:fp是一个以打开的文件的文件指针
返回值:
正常返回:0
异常返回:EOF,表示文件在关闭时发生错误
往文件中写格式化数据
1.函数原型
int fprintf(FILE *fp,char *format,arg_list)
2.功能说明
将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
3.参数说明
fp:这是个文件指针,指出要将数据写入的文件。
format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
4.无返回值
文件定位
A. 反绕
(1) 函数原型
void rewind(FILE *fp)
(2) 功能说明
使由文件指针fp指定的文件的位置指针重新指向文件的开头位置。
(3) 参数说明
fp:文件指针。
(4) 无返回值
B 随机定位
(1) 函数原型
int fseek(FILE *fp,long offset,int base)
(2) 功能说明
使文件指针fp移到基于base的相对位置offset处。
(3)参数说明
fp:文件指针。
offset:相对base的字节位移量。这是个长整数,用以支持大于64KB的文件。
base:文件位置指针移动的基准位置,是计算文件位置指针位移的基点。ANSI C定义了base的可能取值,以及这些取值的符号常量。
(4)返回值
正常返回:当前指针位置。
异常返回:-1,表示定位操作出错。
* 关于exit()函数
1. 函数原型
void exit(int status)
2. 功能说明
exit()函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。
3. 参数说明
status:为0值表示程序正常终止,为非0值表示一个定义错误。
4. 无返回值
* 关于feof()函数
1. 函数原型
int feof(FILE *fp)
2. 功能说明
在文本文件(ASCII文件)中可以用值为-1的符号常量EOF来作为文件的结束符。但是在二进制文件中-1往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C提供了标准函数feof(),用来识别文件是否结束。
3. 参数说明
fp:文件指针。
4. 返回值
返回为非0值:已到文件尾。
返回为0值:表示还未到文件尾。
文件操作重点在与对文件和内存的理解,即从文件到内存和从内存到文件,
以及格式化输入输出的理解。
举例:
/**
* 项目名称:文件操作举例
* 完成时间:2018年4月
* 开发平台:VS2017 win32
* @未央
*/
# include<stdio.h>
# include<string.h>
# include<stdlib.h>
#include<malloc.h>
#include<windows.h>
# define F "数据.txt" //文件路径(绝对路径)
typedef struct Student
{
int num; //学号
char name[20]; //姓名
char xy[100]; //学院
char bj[15]; //班级
struct Student *next;
}Stu;
//添加学生信息
void input(Stu *head)
{
Stu *p=NULL;
if((p=(Stu*)malloc(sizeof(Stu)))==NULL)
{
printf("\n\t\t内存空间不足!");
exit(0);
}
p->next=NULL;
printf("\t\t学院:");
scanf("%s",p->xy);
printf("\t\t班级:");
scanf("%s",p->bj);
printf("\t\t学号:");
scanf("%d",&p->num);
printf("\t\t姓名:");
scanf("%s",p->name);
while(head->next!=NULL)
{
head=head->next;
}
head->next=p;
}
//输出学生信息
void output(Stu *head)
{
printf("---------------------------------------------------------------------\n");
printf("学院 班级 学号 姓名\n");
printf("---------------------------------------------------------------------\n");
Stu *p=NULL;
p=head->next;
if(head==NULL)
{
printf("\n\t\t\t学生信息为空!\n");
}
else
{
while(p!=NULL)
{
printf("%s\t%s\t%d\t%s\n",p->xy,p->bj,p->num,p->name);
p=p->next;
}
}
}
//写入文件
void write_file(Stu *head)
{
FILE *fp;
if((fp=fopen(F,"at+"))==NULL)
{
printf("文件打开失败!\n");
}
Stu *p=NULL;
p=head;
while(p!=NULL)
{
fprintf(fp,"%s\t",p->xy);
fprintf(fp,"%s\t",p->bj);
fprintf(fp,"%d\t",p->num);
fprintf(fp,"%s\n",p->name);
p=p->next;
}
// 刷新缓冲区,将缓冲区的内容写入文件
fflush(fp);
fclose(fp);
}
//读取文件、读取文件数据到链表
void read_file(Stu *head)
{
printf("---------------------------------------------------------------------\n");
printf("学院 班级 学号 姓名\n");
printf("---------------------------------------------------------------------\n");
Stu t; //使用临时变量来存储文件中读取的内容
FILE *fp;
fp=fopen(F,"r");
if(fp==NULL) //对文件是否成功打开的测试
{
printf("无法打开文件!\n");
printf("返回上一级!\n");
return;
}
while(fscanf(fp,"%s\t%s\t%d\t%s",t.xy,t.bj,&t.num,t.name)!=EOF) //fscanf格式化输入
{
Stu *temp=(Stu *)malloc(sizeof(Stu));
temp->next=NULL;
printf("%s\t%s\t%d\t%s\n",t.xy,t.bj,t.num,t.name);
strcpy(temp->xy,t.xy);
strcpy(temp->bj,t.bj);
temp->num=t.num;
strcpy(temp->name,t.name);
head->next=temp; //temp的数据传给head的下一个结点
head=temp; //head后移
}
fclose(fp);
}
int main()
{
Stu *head=NULL; //头指针
head=(Stu *)malloc(sizeof(Stu));
head->next=NULL;
int a=-1;
while(a)
{
system("cls");
printf("\n\n\t\t----------------------学生宿舍管理系统----------------------\n\n");
printf("\t\t☆☆ 1. 添加学生信息 ☆☆\n\n");
printf("\t\t☆☆ 2. 显示学生信息 ☆☆\n\n");
printf("\t\t☆☆ 3. 文件读入链表 ☆☆\n\n");
printf("\t\t☆☆ 4. 信息写入文件 ☆☆\n\n");
printf("\t\t☆☆ 0. 退 出 系 统 ☆☆\n\n");
printf("\t\t------------------------------------------------------------\n");
printf("\t\t请选择功能(0-4):");
scanf_s("%d",&a);
switch(a)
{
case 1:
system("cls");
printf("\n\n\t\t-------------------------------------------------------\n\n");
printf("\n\t\t\t输入学生数据\n\n");
input(head);
break;
case 2:
system("cls");
printf("\n\t\t\t\t\t\t\t\t显示学生数据\n");
output(head);
system("pause");
break;
case 3:
system("cls");
read_file(head);
printf("\n\t\t\t读取成功!\n");
system("pause");
break;
case 4:
write_file(head);
printf("\n\t\t\t写入成功!\n");
output(head);
system("pause");
break;
case 0:
printf("\n\t\t\t谢谢使用\n");
exit(0);
}
}
}