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