我有一个例程可以打开查找表文件,以在写入文件之前查看是否已存在某个条目。每行包含大约2500列数据。我需要检查每行的前2列,以确保该条目不存在。
我不想为了检查2个条目而每行都必须阅读2500列。我试图使用该fscanf
函数,但是Invalid size
当我尝试仅读取2列时,它给我一个错误。有没有办法只读取输入文件每一行的一部分?
if(exist(strcat(fileDirectory,fileName),'file'))
fileID = fopen(strcat(fileDirectory,fileName),'r');
if(fileID == -1)
disp('ERROR: Could not open file.\n')
end
% Read file to see if line already exists
dataCheck = fscanf(fileID, '%f %f', [inf 2]);
for i=1:length(dataCheck(:,1))
if(dataCheck(i,1) == sawAnglesDeg(sawCount))
if(dataCheck(i,2) == sarjAnglesDeg(floor((sawCount-1)/4)+1))
% This line has already been written in lookup table
lineExists = true;
disp('Duplicate lookup table line found. Skipping...\n')
break;
end
end
end
fclose(fileID);
end
好吧,不是真的。
您应该可以循环执行前两个双打的fscanf,然后是fgetl以读取行的其余部分,即形式:
while there_are_more_lines
dataCheck = fscanf(fileID, '%f', 2);
fgetl(fileID); % Read remainder of line, discarding it
% Do check here for each line
end
由于它是一个文本文件,因此您不能真正跳过从文件中读取字符的操作。对于二进制文件,您可以执行一次fseek,它可以基于字节数在文件中跳转-如果您确切知道下一行的开始位置(以字节数为单位),则可以使用它。但是对于文本文件,您并不知道,因为每一行的长度都会有所不同。如果将数据保存在二进制文件中,则可以执行类似的操作。
我可能会做的事情:创建两个文件,第一个文件包含两个“校验值”,可以快速读取它们,另一个文件包含2500列数据,有或没有两个“校验值” 。它们应该同步更新;将一行添加到第一个文件时,也将一行添加到第二个文件。
而且我肯定会做一个checkData矩阵变量,并将其尽可能长地保存在内存中;在向文件添加新行时,还需要更新checkData矩阵,因此您最初只需要读取一次文件,并在程序的余下时间使用checkData矩阵即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句