Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化;“实时”;C#写入文件&;MATLAB文件读取操作_C#_Matlab_Optimization_Asynchronous_Read Write - Fatal编程技术网

如何优化;“实时”;C#写入文件&;MATLAB文件读取操作

如何优化;“实时”;C#写入文件&;MATLAB文件读取操作,c#,matlab,optimization,asynchronous,read-write,C#,Matlab,Optimization,Asynchronous,Read Write,我试图找到一种好方法,将数据从网络流(通过C#)写入文本文件,同时“准同时”将新写入的数据从文本文件读取到Matlab中 基本上,是否有一种很好的方法或技术来协调写/读操作(来自不同的程序),从而使读操作不会阻止写操作(反之亦然),并且使连续写/读之间的延迟最小化 目前,我只是通过WriteLine循环将网络流中的数据写入(附加)文本文件,并通过循环Matlab的fscanf函数读取数据,该函数还标记读取的最后一个元素,并将文件指针重新定位到该点 C#代码的相关部分: (注意:我使用的循环条件是

我试图找到一种好方法,将数据从网络流(通过C#)写入文本文件,同时“准同时”将新写入的数据从文本文件读取到Matlab中

基本上,是否有一种很好的方法或技术来协调写/读操作(来自不同的程序),从而使读操作不会阻止写操作(反之亦然),并且使连续写/读之间的延迟最小化

目前,我只是通过WriteLine循环将网络流中的数据写入(附加)文本文件,并通过循环Matlab的fscanf函数读取数据,该函数还标记读取的最后一个元素,并将文件指针重新定位到该点

C#代码的相关部分:

(注意:我使用的循环条件是任意的,我只是想看看现在什么是有效的。)

NetworkStream network\u stream=tcp\u client.GetStream();
字符串路径=@“C:\Matlab\serial_data.txt”;
FileInfo file\u info=新文件信息(路径);
使用(StreamWriter writer=file_info.CreateText())
{
字符串foo=”“;
作家,作家(foo);
}
使用(StreamWriter=File.AppendText(路径))
{
字节[]缓冲区=新字节[1];
int最大线=100000;
int行=0;

虽然(行看起来有一个问题,那就是如何在Matlab端的阅读器中使用
fscanf

读卡器代码看起来每次通过循环时都会重新读取整个文件,因为每次通过循环时都会打开它。这是有意的吗?如果要跟踪文件的结尾,可能需要保持文件句柄打开,只需不断检查是否可以通过重复
fscanf
对同一打开的文件句柄调用

另外,该调用看起来可能总是返回一个零填充的1000元素数组,而不管它读取的文件有多大。也许这就是你的“假零”所在来自。有多少将随文件中实际有多少数据以及Matlab代码在写入之间读取数据的频率而变化。从
fscanf
中抓取第二个参数,查看它实际读取了多少元素

[b,nRead] = fscanf(a, '%g', [1000 1]);
fprintf('Read %d numbers\n', nRead);
b = b(1:nRead);
检查“输出参数”部分中的。如果输入包含的元素少于sizeA,则MATLAB®用零填充A


然后您可能想看看这个问题:。保持写操作短于输出流的缓冲区(就像现在一样)将使它们原子化,每次写入后刷新将使它们及时对读者可见。

没有到字符类型的隐式转换,但有一个从字节到int的转换。未测试,但通过该逻辑,您将获得WriteLine(Int32)call.Okay,这意味着这不是我在第一段中所想的转换问题;可能只是一个
fscanf
使用问题。@Voo:删除了关于byte->int32 vs char转换的内容。@Andrew:感谢您的输入-结果是StreamWriter.WriteLine()隐式地将字节类型转换为字符串。我预期必须进行显式转换,因此使用了名称错误的byte2string变量(很抱歉出现任何混淆).据我所知,C#code将文本文件写出来没有问题。这是一个ECG波形,如果我随后通过Matlab绘制文本文件数据,我可以看出存在间隙/不正确的转换。好的。是的,听起来可能是
fscanf
零填充,每次都会重新读取整个文件。我对答案进行了一些编辑,以进一步扩展那;再看一眼。
i=0;

while i<100;
    a = fopen('serial_data.txt');
    b = fscanf(a, '%g', [1000 1]);
    fclose(a);
    i=i+1;
end
[b,nRead] = fscanf(a, '%g', [1000 1]);
fprintf('Read %d numbers\n', nRead);
b = b(1:nRead);