2016-09-30 12 views
1

コード内に2つの2D配列を設定しました.1つはIDの配列を格納し、もう1つはパスワードの配列を格納します。私はフォーマットでテキストファイルから読み取るしようとしています:ファイルから読み込んでC言語で2D配列に格納

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

私の問題は、何らかの理由で、私は私がしようとするとセグメンテーションフォールトを取得しておく、ということですIDとパスワードを保存します。この問題を解決するための助けがあれば幸いです。

+0

2D配列はありません。コード内で1つまたは1対1を表すことはできません。ポインタは配列ではありません! – 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); 

2番目のエラーはループ終了です。配列にはMAX_RECORDS要素のスペースがありますが、MAX_RECORDSで停止しません。あなたはファイルの最後まで読んでいます。それはずっと遅いかもしれません。

最後に、@Malcolmは既に指摘したように、iの初期化に失敗しました。

+0

ありがとう、これは本当に助けになった –

関連する問題