function structdlmwrite(filename, m, dlm, r, c) 
%STRUCTDLMWRITE Write ASCII delimited file of structures. 
%   STRUCTDLMWRITE(FILENAME,M,DLM) writes structure matrix M into FILENAME using the 
%   character DLM as the delimiter.  Specify '\t' to produce 
%   tab-delimited files. 
% 
%   STRUCTDLMWRITE(FILENAME, M, DLM, R, C) writes structure matrix M starting at 
%   offset row R, and column C in the file.  R and C are zero-based, 
%   that is R=C=0 specifies first number in the file. 
% 
%   Example: 
%   clear a 
%   a(1,1).f1 = 1.11, a(1,1).f2 = 'a11f2', a(1,1).f3 = 1.13 
%   a(1,2).f1 = 1.21, a(1,2).f2 = 'a12f2', a(1,2).f3 = 1.23 
%   a(2,1).f1 = 2.11, a(2,1).f2 = 'a21f2', a(2,1).f3 = 2.13 
%   a(2,2).f1 = 2.21, a(2,2).f2 = 'a22f2', a(2,2).f3 = 2.23 
%   structdlmwrite('teststructdlmwrite.txt',a) 
% 
%   See also DLMREAD, DLMWRITE, CSVWRITE, CSVREAD, WK1WRITE, WK1READ. 
% 

%   Brian M. Bourgault 10/22/93 wrote DLMWRITE, which was the starting 
%   point for Mark Jones in creating STRUCTDLMWRITE 2/17/2004 
%   Copyright 1984-2004 The MathWorks, Inc. 

% 
% test for proper filename 
% 
if ~isstr(filename), 
    error('FILENAME must be a string.'); 
end; 

if nargin < 2, error('Requires at least 2 input arguments.'); end 

NEWLINE = sprintf('\n'); 

% delimiter defaults to Comma for CSV 
if nargin < 3, dlm = ','; end 
dlm = sprintf(dlm); % Handles special characters. 


% open the file 
if strncmp(computer,'MAC',3) 
    fid = fopen(filename ,'wt'); 
else 
    fid = fopen(filename ,'wb'); 
end 

if fid == (-1), error(['Could not open file ' filename]); end 

% check for row,col offsets 
if nargin < 4, r = 0; end 
if nargin < 5, c = 0; end 

% dimensions size of matrix 
[br,bc] = size(m); 
m=reshape(m,br*bc,1); 
[br,bc] = size(m); 
% bc is 1 now 
fields=fieldnames(m); 
bc=length(fields); 
for i=1:length(fields) 
    fields(i); 
    classes{i}=eval(['class(m(1).' fields{i} ')']); 
end 

% start with offsetting row of matrix 
for i = 1:r 
    for j = 1:bc+c-1 
        fwrite(fid, dlm, 'uchar');     
    end 
    fwrite(fid, NEWLINE, 'char'); 
end 

% start dumping the array, for now number format float 
for i = 1:br 
    
    % start with offsetting col of matrix 
    for j = 1:c 
        fwrite(fid, dlm, 'uchar');     
    end 
    
    for j = 1:bc 
        if ~strcmp(classes(j),'char') 
            str = num2str(eval(['m(i).' fields{j} ])); 
        else         
            str = eval(['m(i).' fields{j} ]); 
        end 
        fwrite(fid, str, 'uchar');     
        if(j < bc) 
            fwrite(fid, dlm, 'uchar');     
        end 
    end 
    fwrite(fid, NEWLINE, 'char'); 
end 

% close files 
fclose(fid); 