2017-02-22 3 views
0

Das folgende Programm erstellt eine neue Datendatei und speichert zufällige Daten. Dann wird einer der Werte aus der Datei gesucht und gedruckt.Durchsuchen von Daten aus Datendatei mit c

Das Problem ist, Daten bis zu 13 Elemente werden gesucht und das Programm beendet. Wie im folgenden Bild gezeigt, werden 100 Eingaben gespeichert und nur 13 Einträge gesucht. Was ist die Lösung?

// 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); 
} 

Die Ausgabe lautet:

enter image description here

+0

Was haben Sie herausfinden, wenn Sie es debuggt? – John3136

+0

@ John3136 Ich konnte nichts finden. Programm geht nach 13 Iterationen nur aus der Do While-Schleife – Ashish

+0

Weil Stat == 1 oder wegen Feof? – John3136

Antwort

1

Der Code auf meinem System funktioniert gut, aber es gibt mögliche Probleme:

  • Sie die Binärdatei im Standard-Modus zu öffnen, möglicherweise Textmodus. Verwenden Sie stattdessen "ab+".

  • Die Datei ist im Append-Modus geöffnet. Wenn es ungültige Daten enthält, insbesondere wenn seine Größe kein Vielfaches der Größe der Datensatzgröße ist, werden angehängte Datensätze nicht ordnungsgemäß ausgerichtet und daher nicht korrekt zurückgelesen.

  • Test der Erfolg der scanf(), fwrite() und fread() Anrufe

  • das Ende der Datei Test ist falsch. Hier

ist eine verbesserte Version:

// 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

danke @chqrlie es funktionierte, öffnete es als eine Binärdatei. – Ashish

1

Ihr Hauptproblem ist, dass Ihr Geschäft Binärdaten in dem System erwarten Sie Text zu speichern, see this question.

  • fopen(..., "a+"); Öffnen einer Datei für Text lesen, aber Sie in binäre Daten speichern sie

Sie haben einige andere Probleme:

  • nicht benötigt feof die right way
  • Ihre Hauptfunktion Wert nicht zurück ,
  • Sie testen nicht den Wert n oder number.

korrigierte Code sollte wie folgt aussieht:

// 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; 
} 
Verwandte Themen