我需要将这个艰巨的任务作为批处理文件完成,用C语言做这件事并不是最难的,但在DOS中却很麻烦(至少对我来说是这样!)我需要将一个结构体转换为单个变量(字符串),以便能够在程序内再次将其转换为该结构体。不用担心返回值,已经完成了。
结构体的大小会变化,并且其中有一个索引 [0],需要成为我的变量中的第一项。
以下是这些结构的示例(仅显示3个):
level.waypoints[0] = spawnstruct();
level.waypoints[0].origin = (1774.5,834.7,67.6);
level.waypoints[0].type = "stand";
level.waypoints[0].childCount = 2;
level.waypoints[0].children[0] = 1;
level.waypoints[0].children[1] = 6;
level.waypoints[1] = spawnstruct();
level.waypoints[1].origin = (1780.6,639.1,65.5);
level.waypoints[1].type = "stand";
level.waypoints[1].childCount = 2;
level.waypoints[1].children[0] = 7;
level.waypoints[1].children[1] = 0;
level.waypoints[2] = spawnstruct();
level.waypoints[2].origin = (1902.2,-345.2,74.2);
level.waypoints[2].type = "stand";
level.waypoints[2].childCount = 2;
level.waypoints[2].children[0] = 3;
level.waypoints[2].children[1] = 97;
level.waypoints[3] = spawnstruct();
level.waypoints[3].origin = ... (goes on...)
因此,第一个结构:
level.waypoints[0] = spawnstruct();
level.waypoints[0].origin = (1774.5,834.7,67.6);
level.waypoints[0].type = "stand";
level.waypoints[0].childCount = 2;
level.waypoints[0].children[0] = 1;
level.waypoints[0].children[1] = 6;
我需要将这个结构转换成这一行:
set flwp_0 "0,1774.5,834.7,67.6,stand,2,1,6"
0(flwp_)是索引,也是“”内的第一项。
因此,在这个例子中,另外两个将是:
set flwp_1 "1,1780.6,639.1,65.5,3,7,0,30"
set flwp_2 "2,1902.2,-345.2,74.2,2,3,97"
孩子数childCount可以是任何值,但我认为不会超过9。 因此,我们有多少个childCount,下一行将有更多的孩子。
但我只需要childCount值后面的值,这样我就知道该字符串中还有多少可用项,所以没问题。
我考虑先删除我不需要的所有内容(按顺序):
level.waypoints[
] = spawnstruct();
].origin = (
);
].type = "
";
].childCount =
].children[0] =
].children[1] =
].children[2] =
].children[3] =
].children[4] =
].children[5] =
].children[6] =
].children[7] =
].children[8] =
].children[9] =
;
在第一个结构中,这将留下像这样的内容:
0
01774.5,834.7,67.6
0stand
02
01
06
现在我需要读取并将其转换为我的单行字符串。但是我遇到了问题,因为可能是第一个值,但如果索引具有2或3个字符怎么办?
我还考虑用一些信息替换来跟踪我,这样就不会替换掉文件中的“]”,这样我就知道在它之前的是索引,在它之后的是值。
我还尝试循环创建索引,但没有成功,例如:
level.waypoints[X]
X的取值范围为0到1000(我不认为会超过这个数字)
它不起作用,也许我的第一个想法更好...:\
我需要一个批处理文件(或几个文件),将具有内部结构的多个文件转换为新文件,并将详细信息中的数值转换为字符串。
有什么想法吗?
谢谢!
@Squashman 同时,结果的顺序有些混乱,如您所见:
set flwp_0 "0,1774.5,834.7,67.6,stand,2,1,6"
set flwp_100 "100,1636.76,371.924,240.125,stand,2,101,99"
set flwp_101 "101,1861.45,437.846,240.125,stand,2,102,100"
set flwp_102 "102,1843.93,557.03,240.125,stand,2,103,101"
set flwp_103 "103,1504.58,553.357,64.125,stand,2,8,102"
set flwp_104 "104,653.17,1675.32,64.125,stand,2,26,105"
set flwp_105 "105,338.784,1680.49,232.125,stand,2,104,133"
set flwp_106 "106,-919.398,1537.7,80.125,stand,3,107,109,150"
set flwp_107 "107,-928.311,1111.47,80.125,stand,3,108,106,149"
set flwp_108 "108,-696.488,1095.93,80.125,stand,2,36,107"
set flwp_109 "109,-787.781,1566.87,80.125,stand,2,106,110"
set flwp_10 "10,1423.3,-403.8,64.3,stand,4,11,12,15,3"
set flwp_110 "110,-754.274,1716.71,80.125,stand,2,109,34"
set flwp_111 "111,-736.201,1887.87,64.125,stand,4,112,34,151,152"
set flwp_112 "112,-454.293,1879.4,64.125,stand,4,111,33,34,152"
set flwp_113 "113,125.395,-451.579,58.6958,stand,3,51,114,142"
set flwp_114 "114,282.593,-447.87,68.125,stand,2,115,113"
set flwp_115 "115,304.311,-271.206,68.125,stand,2,116,114"
set flwp_116 "116,447.128,-292.167,68.125,stand,3,118,115,117"
set flwp_117 "117,437.415,-443.822,68.125,stand,2,67,116"
set flwp_118 "118,582.932,-297.811,126.125,stand,2,119,116"
set flwp_119 "119,561.586,-485.701,204.125,stand,2,120,118"
set flwp_11 "11,1240.1,-249.7,74.1,stand,5,9,16,10,12,15"
set flwp_120 "120,423.422,-470.754,204.125,stand,2,119,135"
set flwp_121 "121,1164.82,-1203.64,72.125,stand,4,123,14,126,122"
set flwp_122 "122,1064.12,-1299.76,72.125,stand,3,123,125,121"
set flwp_123 "123,1117.59,-1476.49,72.125,stand,3,124,122,121"
set flwp_124 "124,861.878,-1497.7,72.125,stand,2,125,123"
set flwp_125 "125,878.58,-1294.38,72.125,stand,2,124,122"
能否按正确的顺序写入文件?
非常感谢@Squashman再次提供帮助。
干杯!
好的,实际上顺序并不重要,但我在尝试将每个文件都写入一个新文件时遇到了麻烦……我尝试过但没有成功:
@echo off
setlocal enabledelayedexpansion
for %%f in (*.gsc) do (
FOR /F "tokens=1-2 delims==;^(^) " %%G IN (%%f) do set %%~G=%%~H
FOR /F "tokens=2 delims=[]" %%G IN ('set level.waypoints ^|find /I "spawnstruct"') do (
SET waypoints=!waypoints! %%G
)
FOR %%G IN (%waypoints%) do (
set line=%%G,!level.waypoints[%%G].origin!,!level.waypoints[%%G].type!,!level.waypoints[%%G].childCount!
FOR /F "tokens=2 delims==" %%H IN ('set level.waypoints[%%G].children') DO set line=!line!,%%H
set line=set flwp_%%G "!line!"
echo !line! >> %%f.cfg
)
)
pause
有什么线索吗?
=======================================
好的,现在我们非常接近了!只需要处理带有level.waypoints[
的行,而其余部分必须被忽略,并且还要添加一个最终的关闭变量,我已经在下面成功地完成了:
@echo off
setlocal enableDelayedExpansion
set findtext="level.waypoints["
for %%F in (*.gsc) do (
set "out="
set "i=x"
> "%%~nF.cfg" (
for /f usebackq^ tokens^=2^,4^,5^ delims^=[]^=(^)^;^"^ %%A in ("%%F") do (
if %%A neq !i! (
if defined out echo !out!"
set /a "i=%%A, j=0"
set "out=set flwp_!i! "!i!"
) else (
set /a j+=1
if !j! leq 3 (set "out=!out!,%%B") else set "out=!out!,%%C"
)
)
if defined out echo !out!"
set /a "fim=i+1"
echo set flwp_!fim! "eof"
)
)
现在我该如何将
findstr %findtext%
添加到这些循环中呢?我尝试了很多不同的方式,但语法是错误的...你能帮我吗?:D非常感谢@Squashman和@dbenham迄今为止提供的所有帮助。
干杯
cmd
,对吗? - aschipfl//
开头的注释或者在/* ... */
块内的多行注释。文件中还有函数名,所有结构都在其中...就像function() { -我发布的结构- }
。这是一个gsc文件(C#)。我们非常接近了,只需要处理包含字符串level.waypoints[
的行。我尝试过for %%F in (findstr %findtext% *.gsc) do (...
但没有成功。你能帮我解决一下吗?请看一下我最后编辑的代码。谢谢! - Hajas