» Форум TeamX «
08 Сентября 2010, 03:52:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
»  Вернуться на сайт  |  Главная  |  Правила форума  |  Помощь  |  Поиск  |  Архив форума  |  Пользователи  |  Войти  |  Регистрация  «
Страниц: [1]   Вниз
Печать
Автор Тема: Конвертер из txt в pro файл  (Прочитано 2046 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Jordan
Пользователь
Offline

Сообщений: 382

476228895
« : 21 Сентября 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. Непонятно.
« Последнее редактирование: 21 Сентября 2009, 20:19:53 от Wasteland Ghost » IP:  Записан

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

Сообщений: 193

336150559
« Ответ #1 : 21 Сентября 2009, 22:28:31 »

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

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

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

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

Сообщений: 382

476228895
« Ответ #2 : 21 Сентября 2009, 23:53:32 »

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

Проблема номер раз: Ты пишешь 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);
}

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

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

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

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

Сообщений: 748

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


« Ответ #3 : 22 Сентября 2009, 08:36:53 »

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

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

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

Код:
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, из него конвертор сделать за пять минут можно (я для себя делала, только без полей — просто числа друг за другом).

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

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

Сообщений: 41


« Ответ #4 : 22 Сентября 2009, 09:09:24 »

Всё там 4-х байтово, т.е. почти всё.
Цитировать
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", чем нибудь типа этого:
Код:
    c = GetPrivateProfileInt("General","Proto_ID",0, argv[1]);
    c = (c & 0xFF) << 24;
    c = c | (GetPrivateProfileInt("General","Description_ID",0, argv[1]) & 0xFFFFFF);
    //тут c необходимо перевернуть чем нибудь типа ReverseDWord
IP:  Записан
Jordan
Пользователь
Offline

Сообщений: 382

476228895
« Ответ #5 : 23 Сентября 2009, 10:10:53 »

Wasteland Ghost

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

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

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

Не компилит пишет
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
Для продолжения нажмите любую клавишу . . .

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

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

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

Сообщений: 748

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


« Ответ #6 : 23 Сентября 2009, 11:00:50 »

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

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

Исходники, и правда, не переехали со старого сайта. Выложу как время будет. А вообще, в полном архиве всё-в-одном они скорее всего есть.
IP:  Записан
Страниц: [1]   Вверх
Печать
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC Valid XHTML 1.0! Valid CSS!