找回密码
 注册
Simdroid-非首页
查看: 218|回复: 3

【求助】数据的输入问题

[复制链接]
蝈蝈 该用户已被删除
发表于 2002-8-16 12:08:10 | 显示全部楼层 |阅读模式 来自 四川成都
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2002-8-16 12:19:39 | 显示全部楼层 来自 北京

Re:【求助】数据的输入问题

Simdroid开发平台
直接用ASCII文件完全可以!我曾经这样用过,而且可以在其他的软件中编辑,当然由于是大型的,所以最好用底层的I/O语句写成二进制文件,速度会更快,mat文件就是一种,不过mat如果与其他语言交换数据比较麻烦!

评分

1

查看全部评分

蝈蝈 该用户已被删除
 楼主| 发表于 2002-8-16 22:33:59 | 显示全部楼层 来自 四川成都
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2002-8-16 23:07:44 | 显示全部楼层 来自 北京

回复: 【求助】数据的输入问题

我现在给你一个读取带文件头的txt文件的例子,这是我再写论文时经常用到的,你先看明白了,有什么问题在来问我!
  
function [header, data] = hdrload(file)
  
% HDRLOAD Load data from an ASCII file containing a text header.
%     [header, data] = HDRLOAD('filename.ext') reads a data file
%     called 'filename.ext', which contains a text header.  There
%     is no default extension; any extensions must be explicitly
%     supplied.
%
%     The first output, HEADER, is the header information,  
%     returned as a text array.
%     The second output, DATA, is the data matrix.  This data  
%     matrix has the same dimensions as the data in the file, one
%     row per line of ASCII data in the file.  If the data is not
%     regularly spaced (i.e., each line of ASCII data does not  
%     contain the same number of points), the data is returned as
%     a column vector.
%
%     Limitations:  No line of the text header can begin with
%     a number.  Only one header and data set will be read,
%     and the header must come before the data.
%
%     See also LOAD, SAVE, SPCONVERT, FSCANF, FPRINTF, STR2MAT.
%     See also the IOFUN directory.
  
% check number and type of arguments
if nargin < 1
  error('Function requires one input argument');
elseif ~isstr(file)
  error('Input must be a string representing a filename');
end
  
% Open the file.  If this returns a -1, we did not open the file  
% successfully.
fid = fopen(file);
if fid==-1
  error('File not found or permission denied');
  end
  
% Initialize loop variables
% We store the number of lines in the header, and the maximum  
% length of any one line in the header.  These are used later  
% in assigning the 'header' output variable.
no_lines = 0;
max_line = 0;
  
% We also store the number of columns in the data we read.  This  
% way we can compute the size of the output based on the number  
% of columns and the total number of data points.
ncols = 0;
  
% Finally, we initialize the data to [].
data = [];
  
% Start processing.
line = fgetl(fid);
if ~isstr(line)
  disp('Warning: file contains no header and no data')
  end;
[data, ncols, errmsg, nxtindex] = sscanf(line, '%f');
  
% One slight problem: If the first character of the line is 'e',  
% then this will scan as 0.00e+00. We can trap this case specifically  
% by using the 'next index' output: in the case of a stripped 'e' the next  
% index is one, indicating zero characters read.  See the help  
% entry for 'sscanf' for more information on this output  
% parameter. We loop through the file one line at a time until  
% we find some data.  After that point we stop checking for  
% header information. This part of the program takes most of the  
% processing time, because fgetl is relatively slow (compared to  
% fscanf, which we will use later).
  
while isempty(data)|(nxtindex==1)
  no_lines = no_lines+1;
  max_line = max([max_line, length(line)]);
  % Create unique variable to hold this line of text information.
  % Store the last-read line in this variable.
  eval(['line', num2str(no_lines), '=line;']);
  line = fgetl(fid);
  if ~isstr(line)
    disp('Warning: file contains no data')
    break
    end;
  [data, ncols, errmsg, nxtindex] = sscanf(line, '%f');
  end % while
  
% Now that we have read in the first line of data, we can skip  
% the processing that stores header information, and just read  
% in the rest of the data.  
data = [data; fscanf(fid, '%f')];
fclose(fid);
  
% Create header output from line information. The number of lines
% and the maximum line length are stored explicitly, and each  
% line is stored in a unique variable using the 'eval' statement  
% within the loop. Note that, if we knew a priori that the  
% headers were 10 lines or less, we could use the STR2MAT  
% function and save some work. First, initialize the header to an
% array of spaces.
header = setstr(' '*ones(no_lines, max_line));
for i = 1:no_lines
  varname = ['line' num2str(i)];
  % Note that we only assign this line variable to a subset of  
  % this row of the header array.  We thus ensure that the matrix
  % sizes in the assignment are equal.
  eval(['header(i, 1:length(' varname ')) = ' varname ';']);
  end
  
% Resize output data, based on the number of columns (as returned
% from the sscanf of the first line of data) and the total number
% of data elements. Since the data was read in row-wise, and  
% MATLAB stores data in columnwise format, we have to reverse the
% size arguments and then transpose the data.  If we read in  
% irregularly spaced data, then the division we are about to do  
% will not work. Therefore, we will trap the error with an EVAL  
% call; if the reshape fails, we will just return the data as is.
eval('data = reshape(data, ncols, length(data)/ncols)'';', '');
  
% And we're done!
      

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-7 09:34 , Processed in 0.052388 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表