2017-02-22 154 views
0

以下程序創建一個新的dat文件並存儲隨機數據。然後從文件中搜索其中一個值並打印。使用c從dat文件搜索數據

問題是數據多達13個項目被搜索和程序退出。如下圖所示,存儲100個輸入,僅搜索13個項目。解決辦法是什麼?

// database for storing random values in file and making search operation 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct { 
    int rollNo; 
    int regdNo; 
    int salary; 
    int status; 
} record; 

int main(void) { 
    int i, n; 
    record det; 
    int recordsize = sizeof(det);  // size of record 

    FILE *fp1 = fopen("random.dat", "a+"); 
    if (fp1 == NULL) { 
     printf("error in opening file : \n"); 
     return 1; 
    } 

    printf("enter the no of data to be stored\n"); 
    scanf("%d", &n); 

    for (i = 0; i < n; i++) { 
     det.rollNo = rand(); 
     det.regdNo = rand(); 
     det.salary = rand(); 
     det.status = (rand() % 10) + 1; 

     fwrite(&det, recordsize, 1, fp1); 
    } 

    printf("The last roll no of student stored in list: %d\n", det.rollNo); 

    int stat = 0, countNumber = 0; 
    record buffer; 
    int number; 

    printf("enter the roll number to be searched\n"); 
    scanf("%d", &number); 

    fseek(fp1, 0, SEEK_SET); // move file position indicator to beginning of file 
    do { 
     countNumber++;  // counts number of times the file is searched 
     fread(&buffer, recordsize, 1, fp1); 
     if (buffer.rollNo == number) { 
      stat = 1; 
      break; 
     } 
    } while (!feof(fp1)); 

    printf("\n"); 
    if (stat) { 
     printf("succesfully found at %d\n", countNumber); 
     printf(" roll number %d\n regd number %d\n salary %d\n status %d\n", 
       buffer.rollNo, buffer.regdNo, buffer.salary, buffer.status); 
    } else 
     printf("there is no such roll number %d in the list\nlength of list : %d\n", 
       number, countNumber); 

    fclose(fp1); 
} 

輸出是:

enter image description here

+0

你是怎麼發現當你調試呢? – John3136

+0

@ John3136我找不到任何東西。程序剛好在13次迭代後離開do while循環 – Ashish

+0

由於stat == 1或者因爲feof? – John3136

回答

1

代碼工作我的系統上很好,但也有可能出現的問題:

  • 您在默認模式下打開二進制文件,可能文本模式。改爲使用"ab+"

  • 該文件以追加模式打開。如果它包含無效數據,尤其是其大小不是記錄大小的倍數時,附加記錄將無法正確對齊,從而無法正確讀回。

  • 測試scanf()fwrite()fread()電話

  • 文件測試結束的成功是不正確。

這裏是一個改進版本:

// database for storing random values in file and making search operation 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct { 
    int rollNo; 
    int regdNo; 
    int salary; 
    int status; 
} record; 

int main(void) { 
    int i, n; 
    record det; 
    int recordsize = sizeof(det);  // size of record 

    FILE *fp1 = fopen("random.dat", "ab+"); 
    if (fp1 == NULL) { 
     printf("error in opening file : \n"); 
     return 1; 
    } 

    printf("enter the no of data to be stored\n"); 
    if (scanf("%d", &n) != 1) 
     return 1; 

    for (i = 0; i < n; i++) { 
     det.rollNo = rand(); 
     det.regdNo = rand(); 
     det.salary = rand(); 
     det.status = (rand() % 10) + 1; 

     if (fwrite(&det, recordsize, 1, fp1) != 1) { 
      perror("cannot write record"); 
      fclose(fp1); 
      return 2; 
     } 
    } 

    printf("The last roll no of student stored in list: %d\n", det.rollNo); 

    int stat = 0, countNumber = 0; 
    record buffer; 
    int number; 

    printf("enter the roll number to be searched\n"); 
    if (scanf("%d", &number) != 1) 
     return 1; 

    fseek(fp1, 0, SEEK_SET); // move file position indicator to beginning of file 
    while (fread(&buffer, recordsize, 1, fp1) == 1) { 
     countNumber++;  // counts number of times the file is searched 
     if (buffer.rollNo == number) { 
      stat = 1; 
      break; 
     } 
    } 

    printf("\n"); 
    if (stat) { 
     printf("successfully found at %d\n", countNumber); 
     printf(" roll number %d\n" 
       " regd number %d\n" 
       " salary %d\n" 
       " status %d\n", 
       buffer.rollNo, buffer.regdNo, buffer.salary, buffer.status); 
    } else { 
     printf("there is no such roll number %d in the list\n" 
       "length of list : %d\n", 
       number, countNumber); 
    } 
    fclose(fp1); 
    return 0; 
} 
+0

感謝@chqrlie它的工作,打開它作爲一個二進制文件。 – Ashish

1

你的主要問題是,在那裏系統期待您存儲文本,see this question您存儲二進制數據。

  • fopen(..., "a+");打開文本閱讀文件,但你存儲二進制數據是

你有一些其他問題:

  • 不要使用feofright way
  • 你的主要功能沒有返回值,
  • 您不測試nnumber的值。

更正後的代碼應該是這樣的:

// database for storing random values in file and making search operation 

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int rollNo; 
    int regdNo; 
    int salary; 
    int status; 
} record; 

int main(void) { 
    int i, n; 
    record det; 

    /* open the file in BINARY mode */ 
    FILE* fp1 = fopen("random.dat" , "a+b"); 
    if (fp1 == NULL) { 
     printf("error in opening file : \n"); 
     return 1; 
    } 

    printf("enter the no of data to be stored\n"); 
    scanf("%d", &n); 

    for (i = 0; i < n; i++) { 
     det.rollNo = rand(); 
     det.regdNo = rand(); 
     det.salary = rand(); 
     det.status = (rand() % 10) + 1; 

     if (1 != fwrite(&det, sizeof det, 1, fp1)) { 
      perror("fwrite"); 
      return 2; 
     } 
    } 

    printf("The last roll no of student stored in list: %d\n", det.rollNo); 

    int stat = 0, countNumber = 0; 
    record buffer; 
    int number; 

    printf("enter the roll number to be searched\n"); 
    scanf("%d", &number); 

    fseek(fp1, 0, SEEK_SET); // rewind would have done the job 

    while (1) { 
     countNumber++;  // counts number of times the file is searched 
     if (1 != fread(&buffer, sizeof buffer, 1, fp1)) { 
      perror("fread"); 
      return 3;    
     } 
     if (buffer.rollNo == number) { 
      stat = 1; 
      break; 
     } 
    } 
    printf("\n"); 
    if (stat) { 
     printf("succesfully found at %d\n", countNumber); 
     printf(" roll number %d\n regd number %d\n salary %d\n status %d\n", buffer.rollNo, buffer.regdNo, buffer.salary, buffer.status); 
    } 
    else 
     printf("there is no such roll number %d in the list\nlength of list : %d\n", number, countNumber); 


    /* warning: file is not closed in case of error... */ 
    fclose(fp1); 

    return 0; 
}