C Программирование в Linux, Создание простой базы данных, данные не вставляются в базу данных - PullRequest
0 голосов
/ 02 мая 2020

Я работал над учебником по программированию C (ссылка здесь - https://www.youtube.com/watch?v=SEenaPQXxFs)

Когда я go запустил свой код и вставил новые данные в базу данных он генерирует файл данных, но никакие данные не сохраняются в файле / базе данных вообще, я не совсем уверен, почему он не работает, и, насколько я могу судить, ошибок не возникает.

Код, над которым я работал, выглядит следующим образом:

#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;
 } 

My terminal when I am executing code

1 Ответ

0 голосов
/ 02 мая 2020

со страницы open man :

Флаги аргументов должны включать один из следующих режимов доступа: O_RDONLY, O_WRONLY или O_RDWR.

Итак:

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

должно быть:

fd = open(filename, O_CREAT | O_APPEND | O_RDWR, 0644);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...