涉及內(nèi)容:#scanf對(duì)結(jié)構(gòu)體初始化#文檔的基本操作#寫(xiě)入文檔后記事本打開(kāi)亂碼問(wèn)題
首先代碼如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
? ? char name[7];
? ? char number[4];
};
void input(struct student *node)//用scanf對(duì)結(jié)構(gòu)體初始化
{
? ? printf("請(qǐng)輸入姓名:");
? ? scanf("%s",node->name);
? ? printf("請(qǐng)輸入學(xué)號(hào):");
? ? scanf("%s",node->number);//注意讀入格式
}
int main(void)
{?
? ? struct student *node=NULL;
? ? struct student *p=NULL;
? ? node=(struct student*)malloc(sizeof(struct student));//結(jié)構(gòu)體指針要申請(qǐng)內(nèi)存空間才能使用
? ? p=(struct student*)malloc(sizeof(struct student));
? ? input(node);
? ? printf("這個(gè)學(xué)生的信息是:%s %s\n",node->name,node->number);
? ? FILE *fp;
? ? fp=fopen("C:\\Users\\miyanx\\Desktop\\b.txt","w+");
? ? if(fp==NULL)
? ? ? ? printf("文件打開(kāi)失敗\n");
? ? else
? ? {
? ? ? ? printf("文件創(chuàng)建并打開(kāi)成功\n");
? ? ? ? fwrite(node,sizeof(struct student),1,fp);//寫(xiě)入數(shù)據(jù)
? ? ? ? fseek(fp,0,SEEK_SET);//文件定位函數(shù) 把光標(biāo)移動(dòng)到開(kāi)頭
? ? ? ? fread(p,sizeof(struct student),1,fp);//讀取文件的內(nèi)容
? ? ? ? printf("寫(xiě)入的內(nèi)容是:\n");
? ? ? ? printf("姓名:%s\n",p->name);
? ? ? ? printf("學(xué)號(hào):%s\n",p->number);
? ? ? ? fclose(fp);
? ? }
? ? return 0;
}
運(yùn)行結(jié)果如圖:
用記事本查看該文檔的內(nèi)容情況:
不難發(fā)現(xiàn)的一個(gè)問(wèn)題就是:結(jié)構(gòu)體里的字符型數(shù)組大小需要我們提前計(jì)算好字節(jié)與鍵入的字節(jié)數(shù)一致薪夕,否則就會(huì)出現(xiàn)寫(xiě)入的文件我們打開(kāi)后是亂碼的問(wèn)題。(這一點(diǎn)可以去更改結(jié)構(gòu)體數(shù)組的大小來(lái)進(jìn)行實(shí)驗(yàn))
但是值得肯定的是用fread重新讀取這個(gè)文檔時(shí)玫鸟,是正常輸出不會(huì)亂碼的乏梁。僅僅是記事本中打開(kāi)亂碼應(yīng)該是與記事本讀取數(shù)據(jù)的方式有關(guān)的偷溺。
原因:我們鍵入字符時(shí)如果不將數(shù)組全部賦值划煮,那么它自己就會(huì)隨機(jī)賦值裆操,導(dǎo)致隨機(jī)賦值的元素寫(xiě)入到了所創(chuàng)建文檔中官地,所以記事本中出現(xiàn)亂碼情況酿傍。
另外還有關(guān)于字符型數(shù)組里面存入數(shù)字時(shí)考慮所占字節(jié)的問(wèn)題。
以上僅僅是個(gè)人觀(guān)點(diǎn)驱入,如上述有錯(cuò)誤請(qǐng)讀者積極指出赤炒,本人愿聽(tīng)高見(jiàn)氯析。作者聯(lián)系方式:Q1171466045 可隨時(shí)交流其中的問(wèn)題。