Спойлер
Код: Выделить всё
[b]ini.h[/b]
#ifndef __INI_H__
#define __INI_H__
#include "ff.h"
#define INI_MAX_LINE 100
#define MAX_SECTION 50
#define MAX_NAME 50
#define MAX_VALUE 50
//#ifndef INI_ALLOW_MULTILINE
#define INI_ALLOW_MULTILINE 1
//+
#endif
typedef struct {
char* st;
} Ini_struct;
class INI
{
public:
int Read(const char* fName);
char* find(const char* key);
Ini_struct iniMain[20];
private:
int iniParse();
char* rstrip(char* s);
char* lskip(const char* s);
char* find_char_or_comment(const char* s, char c);
char* strncpy0(char* dest, const char* src, size_t size);
const char* filename;
void handler(const char* key,const char* val);
FIL file;
int error;
int iter;
};
#endif /* __INI_H__ */
[b]ini.cpp[/b]
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "ini.h"
#include "ff.h"
int INI::Read(const char* fName)
{
filename = fName;
iter = 0;
int eini = f_open(&file,filename,FA_READ);
if (error!=0) return error;
eini = iniParse();
if(eini>0) return 0;
f_close(&file);
return eini;
}
int INI::iniParse()
{
iter = 0;
char line[INI_MAX_LINE];
char section[MAX_SECTION] = "";
char prev_name[MAX_NAME] = "";
char* start;
char* end;
char* name;
char* value;
int lineno = 0;
int error = 0;
while (f_gets(line, INI_MAX_LINE, &file) != NULL) {
lineno++;
start = lskip(rstrip(line));
if (*start == ';' || *start == '#') {
}
else if (*start == '[') {
end = find_char_or_comment(start + 1, ']');
if (*end == ']') {
*end = '\0';
strncpy0(section, start + 1, sizeof(section));
*prev_name = '\0';
}
else if (!error) {
error = lineno;
}
}
else if (*start && *start != ';') {
end = find_char_or_comment(start, '=');
if (*end != '=') {
end = find_char_or_comment(start, ':');
}
if (*end == '=' || *end == ':') {
*end = '\0';
name = rstrip(start);
value = lskip(end + 1);
end = find_char_or_comment(value, '\0');
if (*end == ';')
*end = '\0';
rstrip(value);
/* Valid name[=:]value pair found, call handler */
strncpy0(prev_name, name, sizeof(prev_name));
handler(prev_name,value);
}
else if (!error) {
error = lineno;
}
}
}
return error;
}
char* INI::rstrip(char* s)
{
char* t = s + strlen(s);
while (t > s && isspace((unsigned char)(*--t)))
*t = '\0';
return s;
}
char* INI::lskip(const char* s)
{
while (*s && isspace((unsigned char)(*s)))
s++;
return (char*)s;
}
char* INI::find_char_or_comment(const char* s, char c)
{
int was_whitespace = 0;
while (*s && *s != c && !(was_whitespace && *s == ';')) {
was_whitespace = isspace((unsigned char)(*s));
s++;
}
return (char*)s;
}
char* INI::strncpy0(char* dest, const char* src, size_t size)
{
strncpy(dest, src, size);
dest[size - 1] = '\0';
return dest;
}
char* INI::find(const char* keys)
{
for(int i = 0; i < iter; i++)
{
//if(strcmp(iniMain[i].key, keys)==0) return iniMain[i].val;
}
return "none";
}
void INI::handler(const char* key,const char* val)
{
static char prev_k[MAX_NAME] = "";
static char prev_v[MAX_NAME] = "";
strncpy(prev_k, key, sizeof(prev_k));
prev_k[sizeof(prev_k) - 1] = '\0';
iniMain[++iter].st=prev_k;
strncpy(prev_v, val, sizeof(prev_v));
prev_v[sizeof(prev_k) - 1] = '\0';
iniMain[++iter].st=prev_v;
}
[b]test.ini[/b]
version=6
name = Bob Smith
email = bob@smith.com
active = true
Стал вопрос как хранить данные с контроллера. Выбрал INI файл...
Отрывается читается, но в iniMain почему то одинаковые значения...
iniMain[0].st = active
iniMain[1].st = true
iniMain[2].st = active
iniMain[3].st = true
iniMain[4].st = active
iniMain[5].st = true
iniMain[6].st = active
iniMain[0].st = true
в место
iniMain[0].st = version
iniMain[1].st = 6
iniMain[2].st = name
iniMain[3].st = Bob Smith
iniMain[4].st = email
iniMain[5].st = bob@smith.com
iniMain[6].st = active
iniMain[0].st = true
Я уже 2 дня бьюсь с этой проблемой... помогите пожалуйста... подскажите в чем ошибка?


