用c语言从dat文件中搜索数据

用c语言从dat文件中搜索数据,c,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> typ

下面的程序创建一个新的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);
}
//用于在文件中存储随机值并进行搜索操作的数据库
#包括
#包括
#包括
类型定义结构{
int-rollNo;
内特雷格德诺;
国际工资;
智力状态;
}记录;
内部主(空){
inti,n;
记录数据;
int recordsize=sizeof(det);//记录大小
文件*fp1=fopen(“random.dat”,“a+”);
如果(fp1==NULL){
printf(“打开文件时出错:\n”);
返回1;
}
printf(“输入要存储的数据编号\n”);
scanf(“%d”和“&n”);
对于(i=0;i
输出为:


您的主要问题是,您将二进制数据存储在系统希望您存储文本的位置

  • fopen(…,“a+”)
    ;打开一个文件进行文本读取,但在其中存储二进制数据
您还有一些其他问题:

  • 您不使用feof的
  • 主函数不返回值
  • 不测试
    n
    number
    的值
更正后的代码应如下所示:

//  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;
}
//用于在文件中存储随机值并进行搜索操作的数据库
#包括
#包括
#包括
类型定义结构
{
int-rollNo;
内特雷格德诺;
国际工资;
智力状态;
}记录;
内部主(空){
inti,n;
记录数据;
/*以二进制模式打开文件*/
文件*fp1=fopen(“random.dat”,“a+b”);
如果(fp1==NULL){
printf(“打开文件时出错:\n”);
返回1;
}
printf(“输入要存储的数据编号\n”);
scanf(“%d”和“&n”);
对于(i=0;i
您的主要问题是,您将二进制数据存储在系统希望您存储文本的位置

  • fopen(…,“a+”)
    ;打开一个文件进行文本读取,但在其中存储二进制数据
您还有一些其他问题:

  • 您不使用feof的
  • 主函数不返回值
  • 不测试
    n
    number
    的值
更正后的代码应如下所示:

//  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;
}
//用于在文件中存储随机值并进行搜索操作的数据库
#包括
#包括
#包括
类型定义结构
{
int-rollNo;
内特雷格德诺;
国际工资;
智力状态;
}记录;
内部主(空){
inti,n;
记录数据;
/*以二进制模式打开文件*/
文件*fp1=fopen(“random.dat”,“a+b”);
如果(fp1==NULL){
printf(“打开文件时出错:\n”);
返回1;
}
printf(“输入要存储的数据编号\n”);
scanf(“%d”和“&n”);
对于(i=0;i