要求:
将学生信息(姓名,年龄,学号,家庭住址)写入文件,并输出某一学生信息(比如最后一个学生)
程序中所涉及的函数如下:
1:文件打开函数:fopen(欲打开的文件名称or文件路径,哪种方式)
2:文件关闭函数:fclose(文件指针)
3:文件信息写入函数(数据块):fwrite(要写入数据的地址,要写入数据项的字节数size,要写入size字节数据项的个数,文件指针)
4:文件信息读出函数(数据块):fread(要读出数据的地址,要读出数据项的字节数size,要读出size字节数据项的个数,文件指针)
5:修改文件指针位置的函数:fseek(文件指针,偏移量,从哪开始偏移)
6:读写文件出错检测的函数:ferror(文件指针)
7:文件出错标志or文件结束标志置0的函数:clearerr(文件指针)
代码如下:
#include<iostream>
using namespace std;
#define NAMESIZE 10
#define ADDARSIZE 20
#define COUNT 4
#define FILENAMESIZE 10
/*结构体:学生信息*/
typedef struct Student
{
char name[NAMESIZE];
int age;
int stuNum;
char addr[ADDARSIZE];
}Student;
Student student[COUNT];
/*打印第n个学生的信息*/
void showInfor(char *name,int n)
{
FILE *fp = NULL;
/*if((fp = fopen(name,"r")) == NULL)
{
cout<<"open error!"<<endl;
}*/
fp = fopen(name,"w+");
if(ferror(fp))
{
cout<<"open error!"<<endl;
clearerr(fp);
}
fseek(fp,(n-1)*sizeof(Student),0); //修改位置指针,从文件开始0(SEEK_SET)偏移(n-1)*sizeof(Student)个字节
Student s;
fread(&s,sizeof(Student),1,fp);//把第n个学生的信息从文件中读出并写入s中
fclose(fp);
fp = NULL;
cout<<"name:"<<s.name<<" "<<"stuNum:"<<s.stuNum<<" ";
cout<<"age:"<<s.age<<" "<<"addr:"<<s.addr<<endl;
}
/*把学生信息添加到文件*/
void addInforToFile(char *name)
{
FILE *fp = NULL;
/*if( (fp = fopen(name,"w+")) == NULL) //1打开文件
{
cout<<"open error!"<<endl;
}*/
fp = fopen(name,"w+");
if(ferror(fp))
{
cout<<"open error!"<<endl;
clearerr(fp);
}
/*for(int i=0;i<COUNT;++i)
{
fwrite(&student[i],sizeof(Student),1,fp);
}//for循环的作用和下面的一句是等价的
*/
fwrite(student,sizeof(Student),COUNT,fp); //将信息(以块的形式)写入文件
fclose(fp);
fp = NULL;
}
int main()
{
for(int i=0;i<COUNT;++i)
{
cout<<"请输入一下信息"<<endl;
cout<<"name:";
cin>>student[i].name;
cout<<"age:";
cin>>student[i].age;
cout<<"stuNum";
cin>>student[i].stuNum;
cout<<"addar:";
cin>>student[i].addr;
}
cout<<"请输入文件的名称:" ;
char fileName[FILENAMESIZE];
cin>>fileName;
addInforToFile(fileName);
cout<<"你想输出第几个学生的信息:";
int n;
cin>>n;
showInfor(fileName,n);
return 0;
}
注意:涉及文件操作时要注意以下几点
a:定义文件指针时,将指针指向空,即FILE *fp = NULL;
b:fopen()与fclose()函数成对使用,否则会造成文件所占内存泄露以及在下次访问文件时出现错误;
c: 文件关闭后,将文件指针赋值为空,防止出现游离指针,对整个工程造成不必要的麻烦