1. 程式人生 > >[c語言]檔案資訊輸入與輸出

[c語言]檔案資訊輸入與輸出

要求:

將學生資訊(姓名,年齡,學號,家庭住址)寫入檔案,並輸出某一學生資訊(比如最後一個學生)

程式中所涉及的函式如下:

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: 檔案關閉後,將檔案指標賦值為空,防止出現遊離指標,對整個工程造成不必要的麻煩