2015-06-25 1 views
0

Я новый c-programmer.Я пишу небольшую базу данных студентов. У меня есть массив структур, которые я бы хотел записать в файл. До сих пор программа работает нормально. Я могу распечатать данные, сохраненные в массиве с именем db (сокращение от базы данных). Чтобы иметь возможность записывать данные, я открыл новый c-файл, и я написал метод writeData(), который позволяет мне записывать данные с использованием FILE-object и fopen. Вот методы моей базы данных, расположенные в заголовочном-файле:fopen не работает должным образом, и я получаю ошибку сегментации, когда использую fclose

//header file 
#ifndef DB_OPS 
#define DB_OPS 
#define SIZE 3typedef int bool; 
typedef int bool; 
#define true 1 
#define false 0 
struct student{ 
    bool statusFlag; 
    char lastname[20]; 
    char firstname[20]; 
    int mNr; 
    char subject[30]; 
    char nationality[20]; 
}; 

int createDb(int s); 
struct student getData(char * lastname, char * firstname, int matNr, char * courseOfStudy, char * nationality); 
void insert_student(struct student * st); 
void update_student(int matNr); 
bool delete_student(int matNr); 
void display_result(bool res, bool operation); 
bool search_student(int matNr); 
void display_db(); 
void writeData();//method to write data 
void readData(); 
void print(); 
#endif 

я определил метод writeData(). Вот код:

//a c-file 
#include <stdlib.h> 
#include <stdio.h> 
#include "db_ops.h" 


void writeData(){ 
    //when i use fopen, the data saved in db will be damaged 
    FILE * fpw; 
    fpw=fopen("database.txt","wb"); 
    if(fpw==NULL){ 
     printf("the file cannot be opened"); 
     exit(1); 
    } 

    extern struct student *db; 
    int i; 
    for(i=0;i<SIZE;i++){ 
     printf("%s, %s, %d, %s , %s\n", 
      (db+i)->lastname,(db+i)->firstname,(db+i)->mNr, (db+i)->subject, (db+i)->nationality); 
    } 
    fclose(fpw);//When I use fclose(),I get segmentation fault: free(): invalid next size 
} 

До сих пор я не могу найти решение или объяснение этой проблемы. Когда я использую fopen, я больше не могу найти свои данные, сохраненные в массиве db. Я знаю, указывает ли мой массив db, который является указателем вне массива. Вторая проблема заключается в использовании fclose, которая генерирует segmentation fault.Any предложения? Вот часть кода находится в файле, где я инициализирован дб массива:

// another c-file 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include "db_ops.h" 

struct student * db; 
struct student * ptrDb; 
static int insertCounter=1; 
int size=0; 
int createDb(int s){ 
    size=s; 
    db= (struct student *)calloc(3,sizeof(struct student *)); 
    if(db==NULL){ 
     printf("dynamic allocation failed"); 
     return EXIT_FAILURE; 
    } 
    ptrDb=db; 
    printf("database was created\n"); 
} 
struct student getData(char * lastname, char * firstname, int matNr, char * subject, char * nationality){ 
    struct student st; 
    int i; 
    if(insertCounter<=size){ 
     //get data 
     st.statusFlag=1;//flag to show, whether the program gets data or not 
     //0-byte marks the end of the string 
     memcpy(st.lastname,lastname,strlen(lastname)+1); 
     memcpy(st.firstname,firstname,strlen(firstname)+1); 
     st.mNr=matNr; 
     memcpy(st.subject, subject,strlen(subject)+1); 
     memcpy(st.nationality,nationality,strlen(nationality)+1); 
     //printf("%s,%s,%d,%s,%s\n",st.lastname,st.firstname,st.mNr,st.subject,st.nationality); 
     return st; 
    }else if(insertCounter>size){ 
     st.statusFlag=0; 
     return st; 
    } 
} 
//coping input by reference 
void insert_student(struct student * st){ 

    printf("statusFlag:%d\n",st->statusFlag); 
    if(st->statusFlag==1){ 
     *ptrDb=*st; 
     insertCounter++; 
     ptrDb++;  
    }else{ 
      printf("##########################################################\n"); 
    printf("no insert is possible, The maximum size has been reached\n"); 
     printf("##########################################################\n"); 
} 

}

+3

Поскольку мы понятия не имеем, где вы получаете/создаете указатели 'db', нам не удается выяснить, что вы сделали правильно или неправильно. Создайте минимально возможный код, чтобы полностью отображать, что вы делаете. – KevinDTimm

+0

с man-страницы для fopen 'w Усекать файл до нулевой длины или создать текстовый файл для записи. Поток помещается в начале файла. «Итак, чтобы оставить только существующее содержимое, используйте' w + '. Чтобы написать данные 'binary', используйте' wb + 'http://man7.org/linux/man-pages/man3/fopen.3.html – KevinDTimm

ответ

0

Почему calloc(3,sizeof(struct student *)) предназначен для указателя struct, но не является структурным элементом? Кажется, должно быть calloc(3,sizeof(struct student)) для 3 членов структуры.

+0

Работает сейчас – amitakCs

0

Не известно ли правильно студент указатель структура и содержание. Попробуйте открыть файл сразу после fopen. Если ошибка сегментации отсутствует, ваша проблема связана с указателем или распределением памяти.

+0

Я уже это сделал. Я получаю ошибку сегментации – amitakCs

+0

Так что посмотрите на код, в котором ученик инициализирован и работал до вызова writeData() ... – Dronz

+0

@amitakCs - ну, если вы уже сделали некоторую отладку, почему вы не сообщили нам об этом ? –

 Смежные вопросы

  • Нет связанных вопросов^_^