0

我正在编写 C 编程数据库教程(链接在这里 - https://www.youtube.com/watch?v=SEenaPQXxFs

当我去运行我的代码并将新数据插入数据库时​​,它确实会生成一个数据文件,但数据文件/数据库中根本没有存储任何数据——我不确定它为什么不工作,尽我所能告诉没有错误填充。

我正在处理的代码如下

#include <stdio.h> 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
                //give structure to record
typedef struct
{
    unsigned int key;    //primary key assingment
    char fname[16];      // defines length allowed for names
    char lname[16];      //same but for last name
    unsigned int age; 

} person_rec; //gives name to definition

int open_record(char *filename)     //function to open record
{
int fd;

fd = open(filename, O_CREAT | O_APPEND, 0644);
if(fd == -1)
    perror("open_record");

return fd;

}

void close_record(int fd)   //close record
{
close(fd);
 }

int insert_record(int fd, person_rec *rec) //unkkown
 {
int ret;

ret = write(fd, rec, sizeof(person_rec));
return ret;

 }

//function to delete and print
int get_record(int fd, person_rec *rec, int key)
{
    int ret;
    while( ( ret = read(fd, rec, sizeof(person_rec)) ) != -1)
    {
        if(ret == 0)
        {
            memset(rec, 0, sizeof(person_rec)); //clear any errors by resetting size
            break;
            return ret;
        }
        else if (key == rec->key)
            return ret;

    }
    memset(rec, 0, sizeof(person_rec)); //clear record if error due to -1 size
    return ret;
}


//delete function
int delete_record(int fd, int key)
 {
int ret;
person_rec rec;

off_t pos;

pos = lseek(fd, 0, SEEK_SET);

while( ( ret = read(fd, &rec, sizeof(person_rec)) ) != -1)
    {
        if(ret == 0)
        {
            return ret;
        }
        else if (key == rec.key)
        {
            lseek(fd, pos, SEEK_SET);
            rec.key = 0;
            ret = write(fd, &rec, sizeof(person_rec));
            return ret;
        }
        pos = lseek(fd, 0, SEEK_CUR);
    }
   return ret;
  }

int main(int argc, char *argv[]) //main function/uses all prior defined function to make database ect
 {
int fd;
person_rec rec;

fd = open_record("data1");

if(argc > 1)
{
    /* insert */
    if(argc > 5 && !strcmp(argv[1], "insert"))
    {
        rec.key = atoi(argv[2]);
        strcpy(rec.fname, argv[3]);
        strcpy(rec.lname, argv[4]);
        rec.age = atoi(argv[5]);
        insert_record(fd, &rec);
    }
    /* delete */
    if(argc > 2 && !strcmp(argv[1], "delete"))
        delete_record(fd, atoi(argv[2]));

    /*print */
    if(argc > 2 && !strcmp(argv[1], "print"))
    {
        get_record(fd, &rec, atoi(argv[2]));

        printf("key = %d\n", rec.key);
        printf("First = %s\n", rec.fname);
        printf("Last = %s\n", rec.lname);
        printf("Age = %d\n", rec.age);
    }
    }


    return 0;
 } 

我执行代码时的终端

4

2 回答 2

0

我没有看到任何调用 fclose() 或 fflush() 将缓冲区清空到磁盘。在每次写入之后添加 fflush() 或在退出程序之前添加 fclose()。

于 2021-06-09T21:52:20.427 回答
0

打开的手册页

参数标志必须包括以下访问模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。

所以:

fd = open(filename, O_CREAT | O_APPEND, 0644);

应该:

fd = open(filename, O_CREAT | O_APPEND | O_RDWR, 0644);
于 2020-05-02T06:44:24.297 回答