Re: [問題] C的結構問題

作者: overhead (overhead)   2015-05-28 00:23:47
※ 引述《tarobear (塔落熊)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: C
: 問題(Question):
: 書本範例: 利用學生ID搜尋,找出學生的資料
: 餵入的資料(Input):
: #include<stdio.h>
: struct mydata
: {
: int id;
: char name[12];
: int score;
: }buffer;
: int main(void)
: {
: FILE *fptr;
: int idkey;
: printf("Input ID to search");
: scanf("%d",&idkey);
: fptr=fopen("c:\\c_prog\\abc.txt","r");
: if(fptr!=NULL)
: {
: while(!feof(fptr)&&(idkey!=buffer.id))
: {
: fread(&buffer,sizeof(buffer),1,fptr)
: if(buffer.id==idkey)
: {
: printf("Yes! You got it!\n");
: printf("Student's ID:%d\n",buffer.id);
: printf("Student's NEME:%s\n",buffer.name);
: printf("Student's score:%d\n",buffer.score);
: }
: }
: }
: ...
: ...(以下省略
: }
: 補充說明(Supplement):
: 程式打得有點多, 主要是想問為何 buffer.id 就可以找到資料
: 而不需要像 buffer[1].id 這樣呢?
你的"buffer"可以看成是一個"struct mydata"的變數
既然你從頭到尾沒有把他宣告成array
又怎麼需要用[1]呢?
另個問題是關於fread的用法
https://msdn.microsoft.com/zh-tw/library/kt0etdcs.aspx
參考msdn
The fread function reads up to count items of size bytes from the input
stream and stores them in buffer.
意思是說,實際執行一次fread,是會讀第二跟第三個參數相乘的大小
以你的fread(&buffer,sizeof(buffer),1,fptr)為例
就是一次讀sizeof(buffer)*1=sizeof(buffer)
再來,msdn說
The file pointer associated with stream (if there is one) is increased by the
number of bytes actually read.
意思是使用fread時,你丟進去的最後一個參數fptr會因為fread而往後移動
而移動的量就是你讀的數量,也就是剛剛的sizeof(buffer)*1
初學者使用function時要注意
哪些參數是給此function了解你的設定(function只讀不寫該參數)
哪些參數原本是一個空值,你宣告好後設定為參數,function可以把該值設定
成他想告訴你的值(function只寫不讀該參數)
有些就像這次的fptr一樣,function想知道內容,又會告訴你他操作後的結果
(function又讀又寫該參數)
參數要能被function改動,他必須至少是個指標,才能call by reference
所以非指標的參數,基本上就是function會讀但不寫的
但是這些參數到底怎麼用,是由設計那個function的前人所決定
我們這些使用者必須跟著他的思維放入&操作正確的參數
所以用function之前要上網看過描述
推薦你看msdn
他會附上_In_ _Out_ 來描述這件事
https://msdn.microsoft.com/zh-tw/library/jj159525.aspx
這件事是我初學程式語言時最迷惑的事情,分享給你

Links booklink

Contact Us: admin [ a t ] ucptt.com