2011-03-31 30 views
0

我有一個使用兩個二進制文件的函數void display_a_student()。首先是一個binary1.dat和和index.dat,其中包含添加到binary1.dat中的每個學生的偏移量。使用Strcmp()和二進制文件的幫助

我想使用索引找到用戶輸入的學生的偏移值,我無法使用strcmp()函數來比較輸入的值與保存在index.dat中的值文件。

任何幫助將非常感謝這裏是代碼到目前爲止。

void display_a_student() 
{ 
     struct student aStudent; 

     char studentNumSearch[11]; 
     int index=0; 
     int found = false; 

     fp = fopen("binary1.dat", "a+b"); 
     fp1 = fopen("index.dat", "a+b"); 

     printf("\n\nWhich student are you searching for?"); 
     scanf("%s", studentNumSearch); 
     fflush(stdin); 

    while(!found && index < 10) 
    { 
     if(strcmp(studentNumSearch,fp1[index].studentNum)==0) 
     { 
      found = true; 
     } 
     index++; 
    } 

    if (found) 
    { 
     fseek(fp, fp1[index].offset, SEEK_SET); 
     fread(&aStudent,sizeof(struct student),1,fp); 
     printf("\n\nThe student name is %s\n",aStudent.firstName); 
    } 
    else 
    { 
     printf("\n\nNo such student\n"); 

    } 

    fclose(fp); /* fclose closes file */ 
    fclose (fp1); 
    getchar(); 

} 

我確信行:如果(的strcmp(studentNumSearch,FP1 [指數] .studentNum)== 0) 是我要去的地方錯了,因爲我不確定如何在使用指向文件strcmp()函數。 - 編輯相關的代碼。

+0

AFAIK fflush(stdin)是非標準的。有些編譯器支持它,但fflush(stdout)是標準支持的那個函數的調用。您可能必須自己刷新輸入緩衝區。 – jonsca 2011-03-31 12:20:44

+2

我對您的代碼進行了格式化 - 請使用編輯器中的格式按鈕,或下次將所有代碼縮進4格。此外,我會建議剝離示例代碼到儘可能短的代碼片段,該片段仍包含相關行或演示您的問題。代碼越長,人們花時間去閱讀它就越少。 – 2011-03-31 12:22:14

+0

請告訴我們(1)你期望你的代碼做什麼,(2)它做了什麼,(3)你爲什麼認爲它應該做#1而不是#2。噢,(4)爲什麼你認爲問題出在你提到的那一行上,更具體地說是'strcmp'。 – 2011-03-31 12:26:31

回答

5

strcmp用於字符串比較。使用memcmp進行二進制比較。

主要問題是您訪問fp1[index]。當你訪問一個永不分配的FILE元素時,這將不起作用。 fp1不是一個數組,而是一個FILE指針。

您需要使用fscanffread從文件中讀取,並根據每個條目的索引和大小從文件中讀取fseek以正確定位文件。

+0

但我比較用戶輸入的字符串與index.dat結構中保存的字符串? memcmp在這種情況下仍然可以工作嗎? – James 2011-03-31 12:33:57

+0

@詹姆斯,你確定這些真的是字符串嗎?它們是否在binary.dat中被終止?無論如何,如果你知道要比較的長度,memcmp將在所有情況下工作。 – 2011-03-31 12:36:14

+0

對不起,我在編程時很漂亮,字符串包含在另一個函數中打印到二進制文件的結構中,我不確定你的意思是由null終止對不起=/ – James 2011-03-31 12:39:42

0

我不認爲你應該使用strcmp,你必須使用fread複製到一個結構,然後使用你想要的strcmp。 如果你必須使用你的方式..你有使用memcmp而不是strcmp,但正如Benoit所說,在你做cmp之前你需要知道長度。

+1

這實在是一個評論,而不是問題的答案。請使用「添加評論」爲作者留下反饋。 – Thor 2012-08-15 12:17:55