Форум TeamX
   Home   Members  
Pages: [1] |   Go Down
 
Author Topic: Конвертер из txt в pro файл  (Read 2824 times)
Jordan
Пользователь
Posts: 416

476228895
Конвертер из txt в pro файл
« on: 21 September 2009, 18:44:17 »

Привет.

Хочу сделать конвертер из txt в pro файл.

Вот код. Пишу на си.

#include <stdio.h>
#include <windows.h>

int main (int argc, char * argv[])
{
int c;
FILE *f;
f=fopen(argv[2],"wb");

c=GetPrivateProfileInt("General","Proto_ID",0,argv[1]);;
putw(c,f);

c=GetPrivateProfileInt("General","Description_ID",0,argv[1]);;
putw(c,f);

c=GetPrivateProfileInt("General","FRM_ID",0,argv[1]);;
putw(c,f);



fclose(f);
}

запускаю так
rem ..\bin\gcc.exe main.c
call a.exe .\\test.txt test.pro

pause

test.txt

[General]
Proto_ID=1
Description_ID=15
FRM_ID=1500

Есть одна проблема при создании прошника байты получаются сдвинуты.
Вот пример
Оригинальный
01 00 00 0F 00 00 05 DC 01

Получается
01 00 00 00 0F 00 00 00 DC 05 00 00

Сдвинут на 1 байт. Как это исправить? И ещё почему то значения меняются в оригинале 05 DC
а получается DC 05. Непонятно.
« Last Edit: 21 September 2009, 20:19:53 by Wasteland Ghost »

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Ray
Глобальный модератор
Posts: 220

336150559
Re: Конвертер из txt в pro файл
« Reply #1 on: 21 September 2009, 22:28:31 »

Quote
И ещё почему то значения меняются в оригинале 05 DC
а получается DC 05

Тут всё довольно просто. Есть две системы записи - Интеловская и Моторола. Отличаются они тем, что в одной младший бит пишется справа и по возрастанию, а в другой - наоборот, слева. Можешь в принципе писать по байтам (это также поможет справиться с первой проблемой)

Проблема номер раз: Ты пишешь integer'ами, каждый из которых 4 байта. А в оригинале я так понимаю 3 байта. Разбивай число по байтам и пиши так, и учти способ записи чисел из начала этого сообщения Подмигивающий У тебя переменная "с" - int (4 байта). Кстати... Можешь писать функцией fwrite. Там можно указать количество записываемых байт.

P.S. А вообще, оригинально писать под Windows используя gcc Веселый Нет, я всё понимаю - но если используешь кросплатформенный компилятор - зачем привязываться к API винды? Улыбка
Jordan
Пользователь
Posts: 416

476228895
Re: Конвертер из txt в pro файл
« Reply #2 on: 21 September 2009, 23:53:32 »

Quote
Тут всё довольно просто. Есть две системы записи - Интеловская и Моторола. Отличаются они тем, что в одной младший бит пишется справа и по возрастанию, а в другой - наоборот, слева. Можешь в принципе писать по байтам (это также поможет справиться с первой проблемой)

Проблема номер раз: Ты пишешь integer'ами, каждый из которых 4 байта. А в оригинале я так понимаю 3 байта. Разбивай число по байтам и пиши так, и учти способ записи чисел из начала этого сообщения Подмигивающий У тебя переменная "с" - int (4 байта). Кстати... Можешь писать функцией fwrite. Там можно указать количество записываемых байт.

Вот что получилось.

#include <stdio.h>
#include <windows.h>

int main (int argc, char * argv[])
{
int c;
FILE *f;
f=fopen(argv[2],"wb");

c=GetPrivateProfileInt("General","Proto_ID",0,argv[1]);
fwrite(&c, 3, 1, f);

c=GetPrivateProfileInt("General","Description_ID",0,argv[1]);
fwrite(&c, 3, 1, f);

c=GetPrivateProfileInt("General","FRM_ID",0,argv[1]);
fwrite(&c, 3, 1, f);

fclose(f);
}

Теперь всё нормально. Но я не понял как писать в формате моторола, может есть функция?
Я только неделю изучаю язык программирования си, поэтому не знаю как многие вещи делать.

Quote
P.S. А вообще, оригинально писать под Windows используя gcc Веселый Нет, я всё понимаю - но если используешь кросплатформенный компилятор - зачем привязываться к API винды? Улыбка

Можно сделать через fscanf
fscanf(f, "Proto_ID=%d\n", &c); и так далее

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Конвертер из txt в pro файл
« Reply #3 on: 22 September 2009, 08:36:53 »

Очень странно, что в «оригинале» 3 байта, потому как ID все 4-байтовые...

Quote
о я не понял как писать в формате моторола, может есть функция?

Просто сам байтики переставь. Подмигивающий

Code:
void ReverseWord(WORD& w)
{
    w = (w >> 8) | (w << 8);
}

void ReverseDWord(DWORD& dw)
{
    dw = (dw >> 24) | (dw << 24) | ((dw >> 8) & 0x0000FF00) | ((dw << 8) & 0x00FF0000);
}

А вообще глянь исходники ProInfo, из него конвертор сделать за пять минут можно (я для себя делала, только без полей — просто числа друг за другом).

Quote
зачем привязываться к API винды?

Я так понимаю, чтобы не делать собственный парсер конфигов. Веселый У меня вот тоже вопрос: а почему c, а не c++? Зачем микроскопом гвозди забивать и себе дополнительные сложности создавать? Не думаю, что потеря производительности из-за классов в данном случае существенна.
Freeman
Пользователь
Posts: 50


Re: Конвертер из txt в pro файл
« Reply #4 on: 22 September 2009, 09:09:24 »

Всё там 4-х байтово, т.е. почти всё.
Quote
Proto ID (идентификатор прототипа)
Формат: 0xXX00YYYY
X - ID типа объекта (см. табл. 1.1)
YYYY - индекс в соответствующий lst-файл (critters.lst, items.lst, misc.lst, scenery.lst, tiles.lst или walls.lst)
Поэтому нужно просто объединить "Proto_ID" и "Description_ID", чем нибудь типа этого:
Code:
    c = GetPrivateProfileInt("General","Proto_ID",0, argv[1]);
    c = (c & 0xFF) << 24;
    c = c | (GetPrivateProfileInt("General","Description_ID",0, argv[1]) & 0xFFFFFF);
    //тут c необходимо перевернуть чем нибудь типа ReverseDWord
Jordan
Пользователь
Posts: 416

476228895
Re: Конвертер из txt в pro файл
« Reply #5 on: 23 September 2009, 10:10:53 »

Wasteland Ghost

Quote
А вообще глянь исходники ProInfo, из него конвертор сделать за пять минут можно (я для себя делала, только без полей — просто числа друг за другом).

Где можно скачать исходники? В разделе файлы не нашел.

Quote
Просто сам байтики переставь. Подмигивающий

Не компилит пишет
C:\MinGW\MinGW\MyFiles>..\bin\gcc.exe main.c
main.c:4: error: syntax error before '&' token
main.c: In function `ReverseWord':
main.c:6: error: `w' undeclared (first use in this function)
main.c:6: error: (Each undeclared identifier is reported only once
main.c:6: error: for each function it appears in.)
main.c: At top level:
main.c:9: error: syntax error before '&' token
main.c: In function `ReverseDWord':
main.c:11: error: `dw' undeclared (first use in this function)

C:\MinGW\MinGW\MyFiles>call a.exe .\\test.txt test.pro

C:\MinGW\MinGW\MyFiles>pause
Для продолжения нажмите любую клавишу . . .

Quote
У меня вот тоже вопрос: а почему c, а не c++? Зачем микроскопом гвозди забивать и себе дополнительные сложности создавать? Не думаю, что потеря производительности из-за классов в данном случае существенна.

Я классы вообще понять не могу.

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Конвертер из txt в pro файл
« Reply #6 on: 23 September 2009, 11:00:50 »

Ну, стал-быть, у тебя WORD и DWORD не определены. Что странно, вроде в выньдовз.аш они живут... Сам определи:
Code:
typedef unsigned short WORD; // 16 бит
typedef unsigned int DWORD; // 32 бита

А шшто там в классах понимать? Объединили данные и функции для работы с этими данными — получили класс. Подмигивающий Почитай Айру Пола, например, более-менее понятно там описано.

Исходники, и правда, не переехали со старого сайта. Выложу как время будет. А вообще, в полном архиве всё-в-одном они скорее всего есть.
Pages: [1] |   Go Up