C語言將結構體數組數據寫入到文件中以及從文件中分組讀取不同類型的數據,以及解決fwrite造成的亂碼問題

今天在給別人寫程序的時候,遇到一個問題,將結構體數組的數據存到文件中,出現了亂碼。
下面我寫的程序:

struct student
{
	int num;					//學號
	char name[15];              //姓名 
	char sex[8];                //性別
	char className[15];			//班級 
};
struct student stu[N];   //定義100個學生的結構體數組
int student_number = 0;     //定義學生人數

void save()  //保存學生成績 
{
	int i;

	FILE * fpw;

	if (student_number == 0)
	{
		printf("您現在還沒有錄入借閱者信息!\n");
		return;
	}

	if ( (fpw = fopen("student.txt", "wb")) == NULL)
	{
		printf("保存借閱者信息失敗!\n");
		return;
	}
	else
	{
		rewind(fpw);	//定位到文件開始的地方
		fwrite(&stu[0], sizeof(struct student), student_number, fpw);
		/*
		提一嘴fwrite的用法:
		函數原型:size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);
		指針ptr是待寫入數據塊的地址,size 表示待寫入數據塊的大小(以字節爲單位), nmemb表示待寫入數據塊的數量
		*/

		fclose(fpw);
		printf("保存%d條借閱者成績成功!\n", student_number);
	}
}

這樣子的話正常讀取和寫入都數據都不會出問題,但當打開 student.txt 文件時就會發現有亂碼,後面查了一下,fwrite以及fread函數是把二進制數據寫入文件,在遇到非字符型的數據時候,顯示出來的就是亂碼了,解決辦法如下:
可以使用 sprintf 函數把多個元素組成一個字符串,再將其寫入文件中即可。具體代碼如下:

void save()  //保存學生成績 
{
	int i;

	FILE * fpw;

	if (student_number == 0)
	{
		printf("您現在還沒有錄入借閱者信息!\n");
		return;
	}

	if ( (fpw = fopen("student.txt", "wb")) == NULL)
	{
		printf("保存借閱者信息失敗!\n");
		return;
	}
	else
	{
		rewind(fpw);
		for (i = 0; i < student_number; i++)
		{
			fprintf(fpw, "%d %s %s %s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].className);
		}
		//fwrite(&stu[0], sizeof(struct student), student_number, fpw);

		fclose(fpw);
		printf("保存%d條借閱者成績成功!\n", student_number);
	}
}

同樣的,在讀取的時候,也可以用 fscanf 函數,代碼如下:

void read()
{
	int i = 0;
	FILE *fpr; //定義文件指針 

	fpr = fopen("student.txt", "rb"); //打開文件 

	if (fpr == NULL)
	{
		student_number = 0;
		printf("讀入錯誤!\n");
		return;
	}
	else
	{
		rewind(fpr);
		while ( fscanf(fpr, "%d%s%s%s", &stu[i].num, stu[i].name, stu[i].sex, stu[i].className) == 4 )
		{
			student_number++;
			i++;
		}
		printf("讀入%d條借閱者記錄!\n", student_number);
		fclose(fpr); //釋放文件指針 
	}
}

fscanf函數的返回值爲成功讀入的數的個數,這裏爲 4 個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章