Stand alone C file

3 次查看(过去 30 天)
sasha
sasha 2014-12-4
I have my matlab code which is working, but a little slow. I want to write it for C, but I have an error that comes up when I use the Code Generation Rediness test. I am using
y(1) = dlmread('filename.txt');
and
y(n) = dlmwrite('newfilename.txt');
in a for loop that goes from 1 to n. The Readiness test says that these won't work, but I don't know how to read these text files into the code in a way that will be able to convert into C. The files are 201x201 arrays.
If anyone can help me out, it would be much appreciated

回答(2 个)

Ryan Livingston
Ryan Livingston 2014-12-5
One way to do this is to use coder.ceval and the C runtime functions. Alternatively, the MATLAB functions FOPEN, FREAD, FCLOSE are all supported for code generation. So you could use those to read the file in to a MATLAB string, and then use coder.ceval to call sscanf to parse the string.
There is an example in the doc that demonstrates reading a file using coder.ceval.
If you want to use the C runtime, and supposing that the file is named data.txt and that it contains 201-by-201 (201 lines of 201) space-delimited doubles (e.g. output from dlmwrite('data.txt',reshape(1:(201^2),201,201),'delimiter',' '); ) you could use something like:
function y = parsefile
%#codegen
coder.cinclude('<stdio.h>');
f = coder.opaque('FILE*','NULL');
f = coder.ceval('fopen', cstr('data.txt'),cstr('r'));
assert(f ~= coder.opaque('FILE*','NULL'), 'Failed to open file');
% Parse file
N = 201;
y = coder.nullcopy(zeros(N,N));
fmt = cstr('%lf ');
for k = 1:numel(y)
coder.ceval('fscanf', f, fmt, coder.wref(y(k)));
end
coder.ceval('fclose',f);
% File was read in row-major order so transpose
y = y.';
%--------------------------------------------------------------------------
function s = cstr(st)
% Append a \0 (NUL) character to produce a C
% string from a MATLAB string
s = [st, 0];
Just run:
codegen parsefile
y = parsefile_mex;
to use it.

Youssef  Khmou
Youssef Khmou 2014-12-4
编辑:Youssef Khmou 2014-12-5
If you mean reading a file with C, then you need to use pointer as the following, with apriori knowledge of array dimensions :
#include <stdio.h>
int main(void)
{
int x=201;
int y=201;
FILE *yourfile=NULL;
char c;
int i=0,j=0;
double M[x][y];
yourfile = fopen("filename.txt","r");
c = getc(yourfile) ;
while (c!= EOF)
{
M[i][j]=c;
j++;
c = getc(fp);
if(j==201){
i++;
j=0;
}
}
fclose(yourfile);
}

类别

Help CenterFile Exchange 中查找有关 MATLAB Coder 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by