2016-07-09 6 views
2

Cで構成ファイルを読み込む簡単なプログラムを作成しようとしていますが、構造体のメンバーのデータは置いていません。構造体をCで参照渡ししますが、変更はすべてではありません。

コードが下部にあります。

これは私がは私がやっていると思いますものです:

  • を私は
  • は、設定ファイル
  • から構造体のメンバーを取り込み、参照
  • によって構造体を渡すという構造体を作成しています

メンバーにアクセスしようとすると、設定ファイルの最後の行からしかデータを取得できません。

ありがとうございます!


編集:構成ファイルにキー/値を挿入することを期待しました。代わりに、configファイルの最後の行の値だけを持っていました。

期待出力

example.com

実際の出力

food.txt

問題である:

conf->key[i] = key; 
conf->value[i] = value; 
あなたのコード内の1つの問題よりも多分もっと

main.cの

/* 
* Goal is to make simple key value storage with struct and pointers 
*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXLEN 100 
#define CONFIG_MAX_BUF 1024 
#define DELIM "=" 

struct config_s { 
    char *key[MAXLEN]; 
    char *value[MAXLEN]; 
}; 

void read_config_file(struct config_s *conf, char *filename, int *size_of_array); 

int main() { 
    int i = 0, size_of_array; 
    // type config_s has key and value members 
    struct config_s c; 

    read_config_file(&c, "test.cfg", &size_of_array); 
    printf("size of array: %i\n", size_of_array); 

    // if i want to print them all out, i can use this, but i'll have 
    // a function to search for a certain key and return the value. 
    int l = 0, e = 1; 
    printf("********** TEST 1 ***********\n"); 
    printf("key: [%s] value: [%s] i: [%i]\n", c.key[l], c.value[l], l); 
    printf("key: [%s] value: [%s] i: [%i]\n", c.key[e], c.value[e], e); 
    printf("********** TEST 2 ***********\n"); 

    return 0; 
} 

void read_config_file(struct config_s *conf, char *filename, int *size_of_array) { 
    FILE *file; 
    file = fopen(filename, "r"); 

    char line[CONFIG_MAX_BUF]; 

    int i = 0; 

    char *cfline; 
    char *key; 
    char *value; 

    while(fgets(line, sizeof(line), file) != NULL) { 
     cfline = strstr((char *)line, DELIM); 
     value = cfline + strlen(DELIM); 
     value[strlen(value) - 1] = '\0'; 

     key = strtok((char *)line, DELIM); 
     printf("%i %s %s\n", i, key, value); 
     conf->key[i] = key; 
     conf->value[i] = value; 
     printf("%i %s %s\n", i, (*conf).key[i], (*conf).value[i]); 
     i++; 
    } 
    printf("%s %s\n", (*conf).key[0], (*conf).value[0]); 
    fclose(file); 
    *size_of_array = i; 
    return; 
} 

あるtest.cfgあり

server=example.com 
port=443 
file=food.txt 
+5

あなたはポインタではなく、文字列を代入しているためです。 – Peter

+2

'Cで参照渡しの構造体を渡しますが、** C **で参照渡しのメカニズムはありません! Cは値渡し*機構しか持っていません – Cherubim

+1

Cはそれをサポートしていないので、あなたは参照渡しではありません。構造体へのポインタを渡しています。適切な用語を使用することは重要です。 – Donnie

答えて

関連する問題