IDK, как получить информацию из файла .dat и создать один связанный список из этого, используя C - PullRequest
0 голосов
/ 18 апреля 2020

Это мой код:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LENG 100
#define PAGE_LENG 30


typedef struct pDB {
    char model[MAX_LENG];
    char ram[MAX_LENG];
    char memSpace[MAX_LENG];
    char screenSize[MAX_LENG];
    char price[MAX_LENG];
}phonedb;

struct nod {
    phonedb phone;
    struct nod* next;
};
typedef struct nod node;

node* root, * prev, * cur;

node *newNode(phonedb p)
{
    node* new = malloc(sizeof(node));
    new->phone = p;
    new->next = NULL;
    return new;
}

void insertAfterCur(phonedb p)
{
    FILE* fptr;
    fptr = fopen("phonedb.dat", "rb");
    while (fread(&p, sizeof(phonedb), 1, fptr))
    {
        if (root == NULL)
        {
            root = newNode(p);
            cur = root;
        }
        else
        {
            cur->next = newNode(p);
            cur = cur->next;
        }
    }
    fclose(fptr);
}


int main()
{
    phonedb p;
    int inp;
    FILE* fptr;
    FILE* fptr2;


    while (1)
    {
        printf("2. Create a list from dat\n");
        printf("3. Print all database\n");
        printf("4. Quit\n");

        scanf("%d", &inp);

        switch (inp)
        {
        case(2):
            insertAfterCur(p);
            break;

        case(3):
            for (cur = root; cur != NULL; cur = cur->next)
            {
                printf("%s %s %s %s %s\n", cur->phone.model, cur->phone.ram, cur->phone.memSpace, cur->phone.screenSize, cur->phone.price);
            }
            break;

        case(4):
            exit(1);
        }
    }
}

он выводит только 1 строку информации, а остальные - '\ n', цена указывается как странные символы. Моя структура phonedb имеет модель, ram, memspace, размеры экрана и цену, которые являются строками, а структура узла содержит тип phonedb и указатель.

1 Ответ

0 голосов
/ 18 апреля 2020
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LENG 100
#define PAGE_LENG 30


typedef struct pDB {
    char model[MAX_LENG];
    char ram[MAX_LENG];
    char memSpace[MAX_LENG];
    char screenSize[MAX_LENG];
    int price;
}phonedb;

void importDBtext(FILE* fptr, FILE* fptr2);
int lineCount(FILE* fptr);

int main()
{
    phonedb p;
    int inp;
    FILE* fptr;
    FILE* fptr2;


    while (1)
    {
        printf("1. Convert txt to dat\n");
        printf("5. Quit\n");

        scanf("%d", &inp);

        switch (inp)
        {
        case(1):
            fptr = fopen("phonedb.txt", "r");
            fptr2 = fopen("phonedb.dat", "wb+");
            importDBtext(fptr, fptr2);
            fclose(fptr);
            fclose(fptr2);
            break;

        case(5):
            exit(1);
        }
    }
}

int lineCount(FILE* fptr)
{
    char* c;
    c = malloc(6969 * sizeof(char*));

    int count = 0;
    while (fgets(c, 6969, fptr))
        count++;

    rewind(fptr);
    return count;
}

void importDBtext(FILE* fptr, FILE* fptr2)
{
    phonedb *p;


    p = malloc(lineCount(fptr) * sizeof(phonedb));
    int i = 0;

    while (fscanf(fptr, "%s %s %s %s %d", p[i].model, p[i].ram, p[i].memSpace, p[i].screenSize, &p[i].price) != EOF)
    {


        i++;

    }

    fwrite(p, sizeof(phonedb), i, fptr2);
}
...