我有一个相当奇怪的问题。像往常一样从文本文件中读取一个浮点数,测试文件只包含一个浮点数:
fid = fopen('file.txt','r');
a = fscanf(fid,'%f');
fclose(fid);
如果我省略fclose...
行,然后再次运行fscanf...
,我会得到一个空数组,因为我已经扫描了文件的全部内容;这是正常行为。
我正在使用matlab进行的分析需要四个并行进程(必须是独立的,并且不能在彼此之间传递数据)才能够读取文件。分析花费大约几个小时,并且四个进程不太可能想要在半小时内读取相同的文件,一个进程读取它并在其他任何进程之前关闭它应该没有问题。进程尝试阅读它。我的并行化非常简单 - 四个任务是在matlab GUI中手动启动的。
然而,实际发生的事情是尝试读取文件的第一个进程非常好,其他进程失败,返回空数组,好像文件没有正确关闭一样。我已经花了好几个小时来处理这个问题而没有任何想法?
编辑:如果我使用matlab的fprintf...
命令编写文件,它的表现很好。它只是使用c ++ ofstream
库打印的文件,似乎导致了问题。编写文件所涉及的c ++代码如下:
#include <iostream>
std::ofstream param_file ( "file.txt" );
param_file<<dataval;
答案 0 :(得分:0)
我没有追究它的原因(可能是matlab bug?),但我有一个解决方法:
try
fid = fopen('file_2.txt','r');
a = fscanf(fid,'%f');
fclose(fid);
delete('file_2.txt');
fid2 = fopen('file_2.txt','w');
fprintf(fid2,'%f',a);
fclose(fid2);
catch
fid = fopen('file.txt','r');
a = fscanf(fid,'%f');
fclose(fid);
fid2 = fopen('file_2.txt','w');
fprintf(fid2,'%f',a);
fclose(fid2);
end
此代码将尝试读取新文件(不是原始文件)。如果成功,则表示有问题的线程首先到达那里,因此将读取原始文件并创建具有不同名称的新文件。后续线程将成功读取新文件,并在读取(通过删除并重写)后重置它,以便于后续线程读取同一文件。它很笨重,但不会以任何有意义的方式减慢程序,它可以工作!