如何使用 StreamWriteAsText() 写入 Number 类型的数据?

How can I use the StreamWriteAsText() to write data of the Number type?

我的最终目标是多次写入图像数据和拍摄时间的文件。这可用于生成时间与强度图。

为此,我尝试使用 ImageWriteImageDataToStream() 函数及时将一维图像重复写入文件流。我通过将一个 Listener 对象附加到我正在读出的相机视图来解决这个问题,并且这个 listener 执行一个函数,该函数在每次数据更改时使用 ImageWriteImageDataToStream() (messagemap = "data_changed:MyFunctiontoExecute") 将图像写入文件流。

我的问题是,有没有办法将时间戳也写入同一个文件流?

我能找到的只有 StreamWriteAsText(),它采用 String 数据类型。时间是Number类型可以转换成String类型吗?

有没有人有更好的方法来做到这一点?

我目前的解决方案是同时创建一个单独的文件并使用 WriteFile() 记录时间,所以不使用文件流。

//MyFunctiontoExecute, where Img is the 1D image at the current time
My_file_stream.StreamSetPos(2,0)
ImageWriteImageDataToStream(Img, My_file_stream, 0)

//Write the time to the same file
Number tmp_time = GetHighResTickCount() - start_time
My_file_stream.StreamSetPos(2,0)

My_file_stream.StreamWriteAsText(0,tmp_time) //does not work

//instead using a different file
WriteFile(My_extrafileID,tmp_time+"/n")

我认为你的流媒体概念是错误的。当您流式传输到文件时,在 toStream() 命令的末尾,stream-position 已经在末尾 。所以你不设置位置。

您的脚本本质上是告诉计算机将流 返回 设置到该起始位置,然后写入文本 - 覆盖数据。

只有当你想在阅读过程中跳过某些部分时才需要'StreamSetPos()'命令(例如,在为特定文件格式定义import-scripts时很有用。或者只提取特定的sub-sets 来自文件。).

如果您只想"stream-out some raw-data",您就可以做到:只需依次调用命令即可:

void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
    number endian = 0
    number encoding = 0
    img.ImageWriteImageDataToStream(fStream,endian)
    fStream.StreamWriteAsText(encoding,dateStr) 
}

同样,您只需遵循相同的顺序 "stream-in"

void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
    number endian = 0
    number encoding = 0
    img.ImageReadImageDataFromStream(fStream,endian)
    fStream.StreamReadTextLine(encoding,dateStr)    
}

这里有两点很重要:

  • ImageReadImageDataFromStream中是图像img大小和data-type定义了多少字节从流中读取以及它们是如何被解释的。因此 img 一定是 pre-created 并且大小合适 file-type。

  • in StreamReadTextLine 流将继续读入 作为文本,直到遇到 end-of-line 字符 (\n) 或流的结尾。因此确保在 streaming-out 时 这个 end-of-line 字符。或者,您可以确保字符串始终具有特定大小,然后使用具有指定适当长度的 StreamReadAsText

使用以上两种方法,您可以使用以下test-script作为起点:

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)

请注意,当像这样流式传输 "binary data" 时,是 定义了 file-format。您必须确保写入和读取代码匹配。