Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Считывание переменных структуры


Автор: gepard 20.5.2004, 14:52
Вот у меня есть структура:
Код

struct mystr
{
float fff;
unsigned __int16 iii;
__int8 tex_ID;
};
mystr ms;

И есть файл("file.txt") со след. содержимым:
Цитата

tex_ID = 0
fff = 0.15
iii = 75837352

Как вы можете видеть названия переменных, которым присваиваются значения в файле, совпадают с именами эл-ов структуры. Вопрос:
Как мне записать соответствующее значение, считанное из файла, в соответствующую переменную?
Т.е., если она видит, что в файле идёт присвоение переменной tex_ID значения 0, то она соответственно присваивает ms.tex_ID значение 0.
Как мне это сделать не используя сравнения строк, типа:
Код

#include <stdio.h>
#include <windows.h>
struct mystr
{
float fff;
unsigned __int16 iii;
__int8 tex_ID;
};
bool look_str(char chr[], char chr2[])
{
for (unsigned __int8 i=0;i<strlen(chr2);i++)
 if (chr[i]!=chr2[i]) retrun false;
return true;
}
void main()
{
FILE* file;
mystr ms;
int file_result;
char chr[256]={""};
char temp[1]={""};
file=fopen("file.txt", "r");
if (!file) MessageBox(NULL, "Can't Load File", "File Loading", NULL);
else
{
 while(true)
 {
  file_result=fscanf(file, "%s", chr);
  if (file_result==EOF)
   break;
  if (look_str(chr, "tex_ID"))
  {
   fscanf(file, "%s %d", temp, &ms.tex_ID);
   continue;
  }
  if(look_str(chr, "fff"))
  {
   fscanf(file, "%s %f", temp, &ms.fff);
   continue;
  }
  if (look_str(chr, "iii"))
  {
   fscanf(file, "%s %d", temp, &ms.iii);
   continue;
  }
 }
fclose(file);
}
}


Автор: Sined 20.5.2004, 15:09
Если тебе не известно содержимое файла, то, не очень(?????).
Если известно точно, почему бы просто не пропускать ненужные вещи и считывать только то, что тебе надо, потом трансформировать в число.
например так.
считывание Tex_ID. Не помню точно синтаксиса, но ПСЕВДОкод, наверное такой
Код

fgets(File,stroka);
char* prom=stroka+7;
my_str=atoi(prom);

Автор: bel_nikita 20.5.2004, 17:03
Не энаю, может и не в тему rolleyes.gif
В VC есть GetPrivateProfileString(....); и GetPrivateProfileInt(...); для работы с ini файлами.
Можно txt файл переделать типа того:
Цитата
[Section]
tex_ID = 0
fff = 0.15
iii = 75837352

и тогда считывать никаких проблем

Если заинтересует, то могу примерчик кидануть

Автор: Конструктор 20.5.2004, 17:42
Напиши функцию например long GetVarLongValue(const char * varname , FILE * f).
Она по сути и будет мутить все сравнения, но внутрях, и будет красиво.

В Builder есть славный компонент TIniFile. Работает со стандартными Ini файлами. Аналогичен по действию как я понимаю с тем что предложил bel_nikita.

Если есть задача просто забить структуру в файл, то лучше вообще использовать fwrite, правда файлик будет двоичным и читать надо будет так-же как и записал.

А вот чтобы имена переменных сами совпадали с именами параметров это не знаю rolleyes.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)