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
あなたはポインタではなく、文字列を代入しているためです。 – Peter
'Cで参照渡しの構造体を渡しますが、** C **で参照渡しのメカニズムはありません! Cは値渡し*機構しか持っていません – Cherubim
Cはそれをサポートしていないので、あなたは参照渡しではありません。構造体へのポインタを渡しています。適切な用語を使用することは重要です。 – Donnie