gpt4 book ai didi

c - 在文件中搜索时出现段错误

转载 作者:行者123 更新时间:2023-11-30 18:26:35 26 4
gpt4 key购买 nike

我正在为一个简单的数据库编写代码,其中包含“info”类型的信息。

这是我的代码:

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


#define NAME_LENGTH 20
#define EMAIL_LENGTH 15

struct info {
char name[NAME_LENGTH];
char email[EMAIL_LENGTH];
int flag;
};

int createDB(char *name) {
FILE * file = fopen(name, "w+b");
return fclose(file);
}

FILE *openDB(char *name) {
FILE* file = fopen(name, "r+b");
if(file != NULL) return file;
return NULL;
}

int closeDB(FILE *f) {
return fclose(f);
}

struct info *get(FILE *file, int index) {
struct info* temp;
fseek(file, index*sizeof(struct info), SEEK_SET);
fread(temp, 1, sizeof(struct info), file);
if(feof(file) != 0) return NULL;
return temp;

}

int put(FILE *file, int index, struct info *record) {
fseek(file, index*sizeof(struct info), SEEK_SET);
int res = fwrite(record, 1, sizeof(struct info), file);
if(res) return 0;
else return EOF;
}

struct info *search(FILE *file, char *name) {
int k = 0;
struct info* temp = get(file, 0);
do {

if(temp -> flag == 1 && strcmp(temp -> name,name) == 0) return temp;
k++;
temp = get(file, k);

}while(temp != NULL);

return temp;
}

当我从文件中“放置”、“获取”信息时,一切正常。但是,当我尝试根据名称搜索时,出现段错误(核心转储)错误。

你能在这里指出我的错误吗?

最佳答案

代码

struct info* temp;
...
fread(temp, 1, sizeof(struct info), file);

get中尝试将sizeof(struct info)字节写入未初始化的指针temp。您需要为 temp 分配内存。

最简单的方法可能是修改 get 的签名,以允许调用者使用其堆栈中的 info 实例

int get(FILE *file, int index, struct info *record) {
fseek(file, index*sizeof(*record), SEEK_SET);
fread(record, 1, sizeof(*record), file);
if(feof(file) != 0) return -1;
return 0;
}

可以这样称呼

struct info record;
if (get(file, 0, &record) == -1) {
/* eof */
}

关于c - 在文件中搜索时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com