C - 从 .INI 文件中读取并将值传递给 vars
C - Read from .INI file and pass values to vars
我正在为学校做一个项目,我需要读取 .INI 文件以启动我的游戏变量。问题是,我似乎无法理解 strtok 的工作原理,此时我真的很困惑。
我知道我返回的是一个空结构,因为我不知道如何将特定值放入变量中!
这是我的 read_from_config.h
#ifndef READ_FROM_CONFIG_H
#define READ_FROM_CONFIG_H
#define MAXSTR 500
typedef struct {
unsigned int xdim;
unsigned int ydim;
unsigned int nzombies;
unsigned int nhumans;
unsigned int nzplayers;
unsigned int nhplayers;
unsigned int turns;
} CONFIG;
CONFIG read_config(char *argv[]);
#endif
这是我的 read_from_config.c
#include "read_from_config.h"
#include "example.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
CONFIG read_config(char *argv[]) {
char str[MAXSTR];
FILE *fp = NULL;
char *filename = argv[1];
char *token;
fp = fopen(filename, "r");
if (fp == NULL) {
fprintf(stderr, "Não foi possível abrir ficheiro de configuração.");
fprintf(stderr, "\nModo de uso: ./program_name config.ini");
}
while (fgets(str, MAXSTR, fp) != NULL) {
for (int i = 0; i != '[=11=]'; i++) {
char *equal = strpbrk (str, "=");
if (equal) {
token = strtok(str, "=");
}
}
}
printf("%d", token[0]);
CONFIG config;
return config;
}
CONFIG.INI
; Dimension of the grid
xdim=20
ydim=20
; Inicial number of zombies and humans
nzombies=20
nhumans=20
; Number of zombies and humans controlled by players
nzplayers=0
nhplayers=1
; Number of maximum turns
maxturns=1000
函数 strtok
仅在第一次调用时获取字符串。 全部
后续调用必须通过 NULL
man strtok
#include <string.h>
char *strtok(char *str, const char *delim);
DESCRIPTION
The strtok()
function breaks a string into a sequence of zero or more nonempty tokens.
On the first call to strtok()
, the string to be parsed should be specified in str
.
In each subsequent call that should parse the same string, str
must be NULL
.
示例:
char line[] = "a,b,c,d,e,f\n"; // to simulate an fgets line
char *token = strtok(line, ",\n"); // you can add \n to the separator
// to get rid of the \n at the end
puts(token); // prints a
while(token = strtok(NULL, ",\n"))
puts(token); // prints b then c etc..
记住 strtok
修改源,这将失败:
strtok("a,b,c", ",");
因为字符串文字是不可修改的。在这种情况下,您必须复制一份
到 char[]
或动态分配的 char*
.
如果您需要在解析后完整地保留源代码,那么您绝对
需要复印一份。
在你的代码中你做了:
printf("%d", token[0]);
这没有错,但可能不是您想做的。这条线不
打印第一个字符,它打印第一个字符的ascii值。
这个
printf("%c", token[0]);
将打印第一个字符。
你也在做
CONFIG read_config(char *argv[]) {
...
CONFIG config;
return config;
}
您正在返回一个未初始化的 CONFIG
对象,您忽略了解析
并且您的配置对象中没有设置任何内容。
你的解析也有点奇怪。
for (int i = 0; i != '[=16=]'; i++)
循环立即退出,因为0 == '[=29=]'
!我不明白你是什么
试着用它来做。
我会首先创建一个辅助函数来填充配置的值,请参阅
set_config_val
。然后你可以这样解析它:
CONFIG read_config(char *argv[]) {
...
const char *delim = "=\n";
CONFIG config;
while (fgets(str, MAXSTR, fp) != NULL) {
if(strchr(str, '='))
{
char varname[100];
int value;
token = strtok(line, delim);
strcpy(varname, token);
token = strtok(NULL, delim);
value = atoi(token);
set_config_val(&config, varname, value);
} else {
fprintf(stderr, "Skipping line, no = found");
}
}
fclose(fp);
return config;
}
void set_config_val(CONFIG *config, const char *key, int val)
{
if(config == NULL)
return;
if(strcmp(key, "xdim") == 0)
config->xdim = val;
else if(strcmp(key, "ydim") == 0)
config->ydim = val;
...
}
我正在为学校做一个项目,我需要读取 .INI 文件以启动我的游戏变量。问题是,我似乎无法理解 strtok 的工作原理,此时我真的很困惑。
我知道我返回的是一个空结构,因为我不知道如何将特定值放入变量中!
这是我的 read_from_config.h
#ifndef READ_FROM_CONFIG_H
#define READ_FROM_CONFIG_H
#define MAXSTR 500
typedef struct {
unsigned int xdim;
unsigned int ydim;
unsigned int nzombies;
unsigned int nhumans;
unsigned int nzplayers;
unsigned int nhplayers;
unsigned int turns;
} CONFIG;
CONFIG read_config(char *argv[]);
#endif
这是我的 read_from_config.c
#include "read_from_config.h"
#include "example.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
CONFIG read_config(char *argv[]) {
char str[MAXSTR];
FILE *fp = NULL;
char *filename = argv[1];
char *token;
fp = fopen(filename, "r");
if (fp == NULL) {
fprintf(stderr, "Não foi possível abrir ficheiro de configuração.");
fprintf(stderr, "\nModo de uso: ./program_name config.ini");
}
while (fgets(str, MAXSTR, fp) != NULL) {
for (int i = 0; i != '[=11=]'; i++) {
char *equal = strpbrk (str, "=");
if (equal) {
token = strtok(str, "=");
}
}
}
printf("%d", token[0]);
CONFIG config;
return config;
}
CONFIG.INI
; Dimension of the grid
xdim=20
ydim=20
; Inicial number of zombies and humans
nzombies=20
nhumans=20
; Number of zombies and humans controlled by players
nzplayers=0
nhplayers=1
; Number of maximum turns
maxturns=1000
函数 strtok
仅在第一次调用时获取字符串。 全部
后续调用必须通过 NULL
man strtok
#include <string.h> char *strtok(char *str, const char *delim);
DESCRIPTION
The
strtok()
function breaks a string into a sequence of zero or more nonempty tokens. On the first call tostrtok()
, the string to be parsed should be specified instr
. In each subsequent call that should parse the same string,str
must beNULL
.
示例:
char line[] = "a,b,c,d,e,f\n"; // to simulate an fgets line
char *token = strtok(line, ",\n"); // you can add \n to the separator
// to get rid of the \n at the end
puts(token); // prints a
while(token = strtok(NULL, ",\n"))
puts(token); // prints b then c etc..
记住 strtok
修改源,这将失败:
strtok("a,b,c", ",");
因为字符串文字是不可修改的。在这种情况下,您必须复制一份
到 char[]
或动态分配的 char*
.
如果您需要在解析后完整地保留源代码,那么您绝对 需要复印一份。
在你的代码中你做了:
printf("%d", token[0]);
这没有错,但可能不是您想做的。这条线不 打印第一个字符,它打印第一个字符的ascii值。
这个
printf("%c", token[0]);
将打印第一个字符。
你也在做
CONFIG read_config(char *argv[]) {
...
CONFIG config;
return config;
}
您正在返回一个未初始化的 CONFIG
对象,您忽略了解析
并且您的配置对象中没有设置任何内容。
你的解析也有点奇怪。
for (int i = 0; i != '[=16=]'; i++)
循环立即退出,因为0 == '[=29=]'
!我不明白你是什么
试着用它来做。
我会首先创建一个辅助函数来填充配置的值,请参阅
set_config_val
。然后你可以这样解析它:
CONFIG read_config(char *argv[]) {
...
const char *delim = "=\n";
CONFIG config;
while (fgets(str, MAXSTR, fp) != NULL) {
if(strchr(str, '='))
{
char varname[100];
int value;
token = strtok(line, delim);
strcpy(varname, token);
token = strtok(NULL, delim);
value = atoi(token);
set_config_val(&config, varname, value);
} else {
fprintf(stderr, "Skipping line, no = found");
}
}
fclose(fp);
return config;
}
void set_config_val(CONFIG *config, const char *key, int val)
{
if(config == NULL)
return;
if(strcmp(key, "xdim") == 0)
config->xdim = val;
else if(strcmp(key, "ydim") == 0)
config->ydim = val;
...
}