c語言向文件寫入名字和成績組成的結構體為什麼只有成績出現了燙?

為什麼只有成績那裡變成了燙但名字是好的。。。我看網上說結構體的初始化有問題,,,,但不應該是這樣啊。。。

————————————————————————————————————————————————

我放碼過來。。。

#include&
#include&
#include&
#include&
#include&
#include&
#include&
struct student
{
char name[10];
int score;
};
int main()
{
int i;
student stu[5]={{"朱洪濤",58},{"張均燾",64},{"悅桐",77},{"侯艷書",55},{"劉麗",85}};
FILE *fp;
fp=fopen("students.dat","w+");
for(i=0;i&<5;i++) fwrite(stu[i],sizeof(struct student),1,fp); fclose(fp); register int t; //initialize FILE *fq; fq=fopen("siudents.dat","rb"); for(t=0;t&<5;t++) stu[t].name[0]=; register int o;//load for(o=0;o&<5;o++) { if(fread(stu[o],sizeof(struct student),1,fq)!=1) { if(feof(fq)) break; printf("error"); } } fclose(fq); register int u;//list int m; printf(" inquire for the failed student "); printf("name grade "); printf("====== ======"); for(m=0;m&<5;m++) { if(stu[m].score &<=60) { printf("%s %d",stu[i].name ,stu[i].score ); printf(" "); } } return 0; }


放碼過來。

——————————問題更新——————————

修正了代碼中個別錯誤後,作出解答。

1. 出現燙的原因

(1)「燙」這個字在GB2312編碼中是CCCC

(2)你現在工程用的是Debug編譯模式。這種模式下編譯器會生成代碼,在每個函數代碼執行之前會將本地臨時變數所要用到的棧內存空間的每一個位元組賦值為CC。

(3)你代碼中結構體name給了10位元組,但是score整型佔4個位元組。這時候要做內存4位元組對齊(即每個變數的地址均可被4整隊),name的10位元組後面會填上2個位元組補齊,已保證score的位置在第12位元組。你可以printf("%d
, sizeof(student))看下student結構的長度,一定是16。

(4)在main函數中初始化的那句中只會為結構體中有效的變數賦值,因此附加的那兩個位元組初始化後仍為CCCC。

(5)你使用二進位模式將結構體寫入文件,再用記事本打開,你就看到了大名鼎鼎的「燙」了,實際上是CCCC在GB2312下對應的漢字,如果你換用其它語言的操作系統看到的就不是這個漢字了。

避免「燙」出現的幾個辦法

a. 調整name數組長度可被4整除。

b. 在struct student前加入一行#pragma pack(1)關閉4位元組對齊。

2. 數字不出現的原因

(1)你用二進位模式將結構體寫入的文件,那麼文件中數字也以二進位格式而不是字元串格式保存。

(2)其實你已經看到了數字,只是沒正確意識到他們。

:在ASCII碼中用3A表示,轉換成10進位就是58。

同理@M?U四個字元分別表示64, 77, 55, 85。

讓數字正確顯示的辦法

a. 棄用二進位文件IO,改為用fprintf。

b. 結構體中score不使用int,而是同樣用字元數組保存。通過sprintf和sscanf在字元和整數間轉換。


燙燙燙燙塌。

2333333


推薦閱讀:

AppleScript類自然語言與非英語語法設計
C語言基礎:函數的聲明與定義
關於Vert.x的冷知識
多維度分析2017年最熱門的編程語言
Malt開發實錄(一)不斷改變的設計

TAG:編程語言 | 編程 | C編程語言 | CC | C語言入門 |