我认为您的流媒体概念是错误的。当您流式传输到文件时,在toStream() 命令的末尾,流位置已经在末尾em>。所以你不设置位置。
您的脚本实际上是告诉计算机将流返回设置到该起始位置,然后写入文本 - 覆盖数据。
当您想在阅读过程中跳过某些部分时,您只需要“StreamSetPos()”命令(例如,在为特定文件格式定义导入脚本时很有用。或者仅从文件中提取特定子集。 )。
如果您只想“流出一些原始数据”,您可以这样做:只需依次调用命令即可:
void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
number endian = 0
number encoding = 0
img.ImageWriteImageDataToStream(fStream,endian)
fStream.StreamWriteAsText(encoding,dateStr)
}
同样,您只需按照相同的顺序“流入”:
void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
number endian = 0
number encoding = 0
img.ImageReadImageDataFromStream(fStream,endian)
fStream.StreamReadTextLine(encoding,dateStr)
}
这里有两件事很重要:
在ImageReadImageDataFromStream 中,它是图像img 的大小和数据类型,它定义了从流中读取多少字节以及如何解释它们。因此img 必须是预先创建的并且具有合适的大小和文件类型。
在StreamReadTextLine 中,流将继续以文本形式读入,直到遇到行尾字符 (\n) 或流的末端。因此,请确保在流出时写入这个行尾字符。或者,您可以确保字符串始终具有特定大小,然后使用 StreamReadAsText 并指定适当的长度。
使用上述两种方法,您可以使用以下测试脚本作为起点:
void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
number endian = 0
number encoding = 0
img.ImageWriteImageDataToStream(fStream,endian)
fStream.StreamWriteAsText(encoding,dateStr)
}
void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
number endian = 0
number encoding = 0
img.ImageReadImageDataFromStream(fStream,endian)
fStream.StreamReadTextLine(encoding,dateStr)
}
void writeTest(string path)
{
Result("\n Writing to :" + path )
image testImg := RealImage("Test",4,100)
string dateStr;
number loop = 5;
number doAutoClose = 1
object fStream = NewStreamFromFileReference( CreateFileForWriting(path), doAutoClose )
for( number i=0; i<loop; i++ )
{
testImg = icol * random()
dateStr = GetDate(1)+"@"+GetTime(1)+"|"+Format(GetHighResTickCount(),"%.f") + "\n"
fStream.WriteDataPlusDateToStream(testImg,dateStr)
sleep(0.33)
}
}
void readTest(string path)
{
Result("\n Reading form :" + path )
image testImg := RealImage("Test",4,100)
string dateStr;
number doAutoClose = 1
object fStream = NewStreamFromFileReference( OpenFileForReading(path), doAutoClose )
while ( fStream.StreamGetPos() < fStream.StreamGetSize() )
{
fStream.ReadDataPlusDateFromStream(testImg,dateStr)
result("\n time:"+dateStr)
testImg.ImageClone().ShowImage()
}
}
string path = "C:/test.dat"
ClearResults()
writeTest(path)
readTest(path)
请注意,当像这样流式传输“二进制数据”时,您定义了文件格式。您必须确保写入和读取代码匹配。