我有一个代码(这只是一部分):
var iStr:String;
var kStr:String;
var pixelValue:uint;
var Xcord:Vector.<int> = new Vector.<int>();
var Ycord:Vector.<int> = new Vector.<int>();
var PixVal:Vector.<uint> = new Vector.<uint>();
for (i= 0; i< 225; i++)
{
iStr = fs.readUTF() + "\n";
Xcord[i] = int(iStr);
kStr = fs.readUTF() + "\n";
Ycord[i] = int(kStr);
pixelValue = fs.readUnsignedInt() ;
PixVal[i] = pixelValue;
trace(Xcord[i]);
trace(Ycord[i]);
trace(PixVal[i].toString(16));
i++;
trace(i);
}
我有三个数组,第一个和第二个用于存储整数值,第三个用于存储单位值。 我想在读完文本文件数据中的每一行后,将其分配给数组中的元素,但问题是,它只读取文件中的前3个数据(值),然后给我这个错误信息:
错误:错误#2030:遇到文件结尾。
在flash.filesystem :: FileStream / readUTF() at bitmapPixelDisplay_Air_Scene1_fla :: MainTimeline / frame1()[bitmapPixelDisplay_Air_Scene1_fla.MainTimeline :: frame1:63] 在运行时:: ContentPlayer / loadInitialContent() 在运行时:: ContentPlayer / playRawContent() 在运行时:: ContentPlayer / playContent() 在运行时:: AppRunner / run() 在ADLAppEntry / run() 在global / runtime :: ADLEntry()
有人可以帮我解决问题吗?将文本文件数据加载到数组中的正确方法是什么?如何修复我的代码? 有没有办法检查到达文件末尾? 或者我应该使用byteArray,然后我使用readByte方法和如何? 或者是什么?。
感激不尽。我对我的问题有了一个想法,我想给你你的意见,我使用了如下的数组:
var PixInfo:Array = new Array(21,35,0x393939,22,33,0x4c4c4c,22,34,0x2e2b2b,22,35,0x141414,22,36,0x161313,......... 。);
我已使用文本文件中的所有值(通过复制和粘贴方法)填充数组 然后,我更新了我的代码如下:
PixInfo.reverse(); // to read array in reverse way.
Canav.addEventListener(Event.ENTER_FRAME, TextDisplay);
function TextDisplay(evt: Event):void
{
CanavData.setPixel(PixInfo[i+2], PixInfo[i+1], PixInfo[i]);
trace (PixInfo[i+2], PixInfo[i+1], PixInfo[i].toString(16));
i+=3;
if ( i > 674)
{
Canav.removeEventListener(Event.ENTER_FRAME,TextDisplay);
}
它在我需要的时候运作得非常好,我认为它是解决我的问题的简短方法,但任何建议或建议对我来说,如果这种方式有任何缺点或问题?< /强>
答案 0 :(得分:0)
编辑答案:重新阅读后,我发现你的意思是......
我的文本文件的一部分是:
21 35 393939
22 33 4c4c4c
73 31 191717
73 32 100e0e
73 33 151414
73 34 121212
73 35 c0c0c //<---needs fixing as c0c0c0??
73 36 272727
您可以使用空格(字节0x20
)作为分隔符,以了解所需值的结束/开始。
首先设置 vars ,如下所示:
public var iStr:String;
public var kStr:String;
public var pixelValue:uint;
public var Xcord:Vector.<int> = new Vector.<int>();
public var Ycord:Vector.<int> = new Vector.<int>();
public var PixVal:Vector.<uint> = new Vector.<uint>();
//add these
public var temp_BA :ByteArray = new ByteArray; //holds some byte values of file
public var byteVal :int = 0;
public var pos_Start :int = 0;
public var pos_End :int = 0;
之后您可以使用while
循环来更新:
fs.position = 0; //important!!
var idx:uint = 0; //your index/pos within your Vector arrays
while (true)
{
if ( ( (pos_Start+1) > fs.length ) || (fs.position >= fs.length) )
{ trace("### Reached end of file... breaking"); break; }
else
{
//# get X-coords
find_Space_delimiter(pos_Start);
temp_BA.position = 0;
Xcord[idx] = int( String(temp_BA) );
trace("Xcord["+idx+"] : " + Xcord[idx]);
//# get Y-coords
pos_Start += 1; //update pos
find_Space_delimiter(pos_Start);
temp_BA.position = 0;
Ycord[idx] = int( String(temp_BA) );
trace("Ycord["+idx+"] : " + Ycord[idx]);
//# get PIXel-VALue
pos_Start += 1; //update pos
find_Space_delimiter(pos_Start);
temp_BA.position = 0;
PixVal[idx] = int( "0x" + String(temp_BA) );
trace("PixVal["+idx+"] : " + PixVal[idx].toString(16) );
pos_Start += 1; idx++; //update positions
}
}
你需要这个辅助函数来扫描任何字节,直到在空格(0x20
)字节停止...
public function find_Space_delimiter(inPos:int) : void
{
temp_BA.clear(); //reset
fs.position = pos_Start = inPos;
while(true)
{
if (fs.position < fs.length)
{ byteVal = fs.readUnsignedByte(); } //position is now +1 (auto after any READ)
else{ break; }
//# is space
if (byteVal == 0x20)
{
//trace("got entry at : " + fs.position + " ... breaking");
temp_BA.position=0; break;
}
else
{
//trace("byteVal : " + byteVal.toString(16).toUpperCase() );
temp_BA.writeByte(byteVal);
pos_Start++;
}
}
}
原始回答
我的文本文件的一部分是:
21 35 39 39 39 22 33 4c 4c ....
所以你的文字中有十六进制值,你想将它们转换为ByteArray
?
试试这个:
var my_text :String = "your text file contents";
var my_bytes_Array :ByteArray = new ByteArray;
//# update the Array with values converted from text
my_bytes_Array = string_toBytes (my_text);
//# the converter function (returns/updates data type of... ByteArray)
public function string_toBytes( hex:String ) :ByteArray
{
// CONVERT STRING OF HEX CODES INTO A BYTEARRAY //
/////////////////////////////////////////////////
hex = hex.split(" ").join(""); //remove white spaces in bytes string
var ba:ByteArray = new ByteArray(); ba.position = ba.length;
var len:uint = hex.length; //trace("writeBytes. len: " + len);
for (var i:uint = 0; i < len; i += 2)
{
var byte:uint = uint("0x" + hex.substr(i, 2));
ba.writeByte(byte);
}
return ba;
}
答案 1 :(得分:0)
我可能会遗漏一些东西但是如果fs是文件流,它应该更容易吗?
var myString:String = fs.readUTF();
var lines:Array = myString.split("\n"); // split text file by newlines. Your textfile do have the values on each line right?
for(var i:int; i < lines.length; i++)
{
var lineArray:Array = lines[i].split(" "); // split each line by spaces. if you have tabs split by "\t"
var x:int = trim(lineArray[0]) as int;
var y:int = trim(lineArray[1]) as int;
var pixVal:int = trim("0x" + lineArray[2]) as int; // prepend with 0x so it will cast to an integer. Untested though
}
private function trim(value:String):String
{
// remove all spaces
return value.reaplce(/ /gi, value);
}