2016-09-30 4 views
1

Я установил в своем коде 2 2D-массива, один для хранения массива идентификаторов, а другой для паролей. Я пытаюсь читать из текстового файла с форматом:Чтение из файла и сохранение в 2D-массив в C

ID1 PASSWORD1 
    ID2 PASSWORD2 
    ID3 PASSWORD3 
    ID4 PASSWORD4 
    ID5 PASSWORD5 

Это мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX_RECORDS 100 
#define MAX_INPUT 40 

void readFile(); 
void inputInit(); 
void DBInit(); 
void init(); 


FILE *fp; 

char **IDArray; 
char **passwordArray; 

char *IDInput; 
char *passInput; 

int main(){ 
    init(); 
    readFile(); 

    return 0; 
} 

void readFile(){ 
    fp = fopen("Database_Table.txt","r"); 

    char line[MAX_INPUT]; 
    if(fp == NULL){ 
     perror("Error in opening file"); 
    } 
    else{ 
     int i; 
     while(!feof(fp)){ 
      fgets(line,sizeof(line),fp); 
      sscanf(line,"%s\t%s",IDInput,passInput); 
      IDArray[i] = IDInput; 
      passwordArray[i] = passInput; 
      i++; 
     } 
    } 
    fclose(fp); 
} 

void init(){ 
    DBInit(); 
    inputInit(); 

} 

void inputInit(){ 
    IDInput = (char*)malloc(sizeof(char) * MAX_INPUT); 
    passInput = (char*)malloc(sizeof(char) * MAX_INPUT); 
} 

void DBInit(){ 
    IDArray = (char**)malloc(sizeof(char*) * MAX_RECORDS); 
    passwordArray = (char**)malloc(sizeof(char*) * MAX_RECORDS); 

    int i,j; 
    for(i=0;i<MAX_RECORDS;i++){ 
     IDArray[i] = (char*)malloc(sizeof(char) * MAX_INPUT); 
     passwordArray[i] = (char*)malloc(sizeof(char) * MAX_INPUT); 
    } 
} 

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

+0

Нет двухмерного массива, ничего, что может представлять один или указать на один в коде. Указатель не является массивом! – Olaf

ответ

1

int i создает неинициализированный дикий i. Замените int i = 0;

+0

О, моя ошибка, спасибо. Но теперь, когда он запускается и пытается заполнить массив, новый элемент, который вводится, теперь заменяет предыдущие записи. Это была моя первоначальная проблема, а не ошибка сегментации. –

0

Будьте осторожны при использовании feof. Вы никогда не должны использовать feof как индикатор выхода для цикла. Вы можете посмотреть this link, это объясняет проблему.

0

Первая проблема заключается в линиях

IDArray[i] = IDInput; 
passwordArray[i] = passInput; 

В этих строках не присваивают указатели, ничего другого. Это означает, что вы не копируете содержимое в ваш предварительно выделенный массив. Для этого вы должны использовать strcpy или strncpy, например.

strcpy(IDArray[i], IDInput); 
strcpy(passwordArray[i], passInput); 

Ваша вторая ошибка в завершении цикла. Массив имеет место для MAX_RECORDS элементов, но вы не останавливаетесь на MAX_RECORDS. Вы читаете до конца файла, что может быть намного позже.

И, наконец, как уже указывал @Malcolm, вы пропустили инициализацию i.

+0

Большое спасибо, это действительно помогло –

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