Geraldine
Geraldine

Reputation: 821

Matlab: error using fprintf

This is a script written by someone else, and I don't understand why it is giving me this error (I don't really know Matlab, but this appears to be a fairly straightforward script, so I'm a bit stumped). The file starts with

    clear all
    filein=['Runs/'];
    Namein1=['AIC'];
    Nameout=['Nash'];

It then does a bunch of calculations to get Nash-Sutcliffe coefficients (not important for this issue) and then tries to write the results to one file:

    %Write Nash
       %Output file writing
    %Write file header
    D={'Conbination','Nash with Error','Nash-error','RMSE','RMSE-error',...
    'AIC', 'MinNash', 'MaxNash'};
    NameOut=[filein,Nameout, '.txt'];
    fileID = fopen(NameOut,'w');
    for i=1:length(D)-1
        fprintf(fileID,'%s\t',D{i});

Then more stuff follows, but this is where I get the error message:

    Error using fprintf
    Invalid file identifier.  Use fopen to generate a valid file identifier.

    Error in Nash_0EV_onlyT (line 169)
    fprintf(fileID,'%s\t',D{i});

I don't get what is wrong here? The script specifies the file, and uses fopen...? Isn't it supposed to create the file Nash.txt with the fopen statement (this file currently does not exist in my folder Runs/)? What am I missing? Thanks!

PS I am running Matlab2013a (group license via the university) on a MacBook Pro with OSX 10.8

Upvotes: 4

Views: 5141

Answers (3)

f.BigBro
f.BigBro

Reputation: 139

I am running Win 10 and matlab 2015a, but it happens in mine too.

finally, I realise that the matlab.exe can't write file in the folder /../bin/

so, change to

Nameout=['C:\Users\yourname\DesktopNash'];

try it, then tell me what' going on.

Upvotes: 1

Geraldine
Geraldine

Reputation: 821

Okay, so as I said, I don't know Matlab... I hadn't properly specified the path for writing! So it was reading the input but I guess didn't know where to write to. Thanks for the answers, it did help me narrow down the problem!

Upvotes: 0

Rody Oldenhuis
Rody Oldenhuis

Reputation: 38052

Try using fclose all before calling this script again. Often when testing, the file handle is never released (an error occurs before the file is closed), causing fopen on the same file to fail.

The better way to do this would be to use a more fail-safe construct:

NameOut = [filein Nameout '.txt'];

fileID = fopen(NameOut,'w');

if fileID > 0
    try
        for i = 1:length(D)-1
            fprintf(fileID,'%s\t',D{i});
        end  
        fclose(fileId);  

    catch ME        
        fclose(fileId);
        throw(ME);

    end       

else
    error('Error opening file.');

end

Upvotes: 3

Related Questions