【问题标题】:How can I use the StreamWriteAsText() to write data of the Number type?如何使用 StreamWriteAsText() 写入 Number 类型的数据?
【发布时间】:2019-05-14 19:06:53
【问题描述】:

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

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

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

我能找到的只有 StreamWriteAsText(),它采用 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")

【问题讨论】:

    标签: dm-script


    【解决方案1】:

    我认为您的流媒体概念是错误的。当您流式传输到文件时,在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)
    

    请注意,当像这样流式传输“二进制数据”时,定义了文件格式。您必须确保写入和读取代码匹配。

    【讨论】:

      猜你喜欢
      • 2013-09-27
      • 2020-10-06
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多