WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ITX-Data lesen und in Matlab-file konvertieren, Error!!

 

Faboston
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 27.04.16
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 27.04.2016, 10:41     Titel: ITX-Data lesen und in Matlab-file konvertieren, Error!!
  Antworten mit Zitat      
Hola. Ich habe ein Problem mit folgender Funktion:

Code:
function read_ITX(ITX_filename,matfile,delfile)

ITX_name=ITX_filename;
setnumber=ITX_name(1:1:end-4);

fid=fopen(ITX_name,'r');
Line_data = textscan(fid, '%s', 'delimiter', '\n');
fclose(fid);

LD=Line_data{1,1};
format('long');

for a_loop=1:1:(length(LD)-15)/19; % A-Loop
    GWK_data{1,a_loop}=cellstr('Number');
        dummy=cell2mat(LD((a_loop-1)*19+17,1));
        GWK_data{2,a_loop}=str2double(dummy(8:1:end));
    GWK_data{3,a_loop}=cellstr('Description');
        dummy=cell2mat(LD((a_loop-1)*19+18,1));
        GWK_data{4,a_loop}=cellstr(dummy(13:1:end));
    GWK_data{5,a_loop}=cellstr('Unit');
        dummy=cell2mat(LD((a_loop-1)*19+34,1));
        GWK_data{6,a_loop}=dummy(9:1:end);
    GWK_data{7,a_loop}=cellstr('GWK_data');
        GWK_data{8,a_loop}=NaN;
    GWK_data{9,a_loop}=cellstr('F [Hz]');
        dummy=cell2mat(LD((a_loop-1)*19+19,1));
        GWK_data{10,a_loop}=str2double(dummy(11:1:end));
    GWK_data{11,a_loop}=cellstr('CalFactor');
        dummy=cell2mat(LD((a_loop-1)*19+33,1));
        GWK_data{12,a_loop}=str2double(dummy(11:1:end));
    GWK_data{13,a_loop}=cellstr('Delay [s]');
        dummy=cell2mat(LD((a_loop-1)*19+20,1));
        GWK_data{14,a_loop}=str2double(dummy(7:1:end));
end; % A-Loop

clear dummy;
[r c]=size(GWK_data);
for ch_loop=1:1:c; % ch-Loop
    ch_num=GWK_data{2,ch_loop};
    if ch_num<10; clear Ch_num; Ch_num=(['00',num2str(ch_num)]); % A-if
        elseif 9<ch_num<100; clear Ch_num; Ch_num=(['0',num2str(ch_num)]);
        elseif ch_num>99; clear Ch_num; Ch_num=([num2str(ch_num)]);
    end; % A-if
       
    fid=fopen([setnumber,'.',Ch_num],'r');
    dummy=fread(fid,'int16=>double','ieee-le');
    fclose(fid);
   
    GWK_data{8,ch_loop}=dummy;
end; % ch-Loop

save([setnumber,'.mat'], 'GWK_data');

if delfile == 1;
   for idel=0:1:9; delete ([setnumber,'.*',num2str(idel)]); end;
end;

disp(' ');
disp(' ');
disp(['Test program "',setnumber,'" converted.']);
disp(' ');
disp(' ');

return;


Die ITX-Datei soll gelesen und die Daten konvertiert werden. Leider tritt beim einlesen folgende Fehlermeldung auf:

Code:
>> read_ITX('2016033001.itx',1,0)
Error using fread
Invalid file identifier.  Use fopen to generate a valid file identifier.
Error in read_ITX (line 62)
    dummy=fread(fid,'int16=>double','ieee-le');


In anderen Beiträgen wird empfohlen fid zu prüfen, um zu wissen ob auf die Datei überhaupt zugegriffen werden kann. Mein fid liegt bei 3 (und nicht wie angenommen bei -1) und dürfte daher nicht das Problem sein?!

Ich würde mich sehr über Tipps und Tricks oder Lösungen freuen!!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2016, 11:53     Titel:
  Antworten mit Zitat      
Hallo,

ich würde in dem Fall auch fid = -1 erwarten.
Überprüfe aber doch trotzdem mal, ob die Datei, die an der Stelle einzulesen versucht wird, überhaupt existiert. Falls vorherige Dateien eingelesen werden:
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.04.2016, 13:12     Titel: Re: ITX-Data lesen und in Matlab-file konvertieren, Error!!
  Antworten mit Zitat      
Hallo Faboston,

Ein paar Kommentare zum Code:
Code:
function read_ITX(ITX_filename,matfile,delfile)
ITX_name=ITX_filename;  % Überflüssig?! Nenne die Variable doch gleich richtig
setnumber=ITX_name(1:end-4);

format('long');  % Das ändert nur den Output im CommandWindow

for a_loop=1:1:(length(LD)-15)/19; % A-Loop
    GWK_data{1,a_loop} = {'Number'};  % Einfacher als CELLSTR
        dummy = LD{(a_loop-1)*19+17,1)};  % {} einfacher als CELL2MAT
        GWK_data{2,a_loop} = str2double(dummy(8:end));
   
end % A-Loop

clear dummy;  % Überflüssig
[r c]=size(GWK_data);
for ch_loop = 1:c % ch-Loop
    ch_num = GWK_data{2,ch_loop};
    if ch_num<10   % Besser *ein* Befehl pro Zeile
        clear Ch_num;  % Überflüssig
        Ch_num = (['00',num2str(ch_num)]); % A-if
    elseif 9<ch_num<100  % !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        clear Ch_num
        Ch_num = (['0',num2str(ch_num)]);  % Überflüssige runde Klammern
    elseif ch_num>99;
         clear Ch_num;
         Ch_num=([num2str(ch_num)]);
    end; % A-if
   
    % Besser:
    Ch_num = sprintf('%03d', ch_num);

    file = fullfile(cd, [setnumber, '.', Ch_num]);
    fid = fopen(file,'r');
    if fid == -1   % *Immer* überprüfen
       error('Cannot open file: %s', file)
    end
    dummy=fread(fid,'int16=>double','ieee-le');
    fclose(fid);
    GWK_data{8,ch_loop}=dummy;
end; % ch-Loop
 

Das Debugger ist viel einfacher, wenn immer nur ein Befehl pro Zeile verwendet wird. Dann funktioniert auch Matlab's JIT-Acceleration besser.

Ich habe so viele Codes gesehen, die an einem gescheiterten FOPEN straucheln, dass ich grundsätzlich rate, die Rückgabe immer zu testen und eine eindeutige Fehlermeldung auszugeben. Die Verwendung absoluter File-Namen mit Pfad ist ebenfalls sehr nützlich, denn z.B. ein Timer- oder GUI-Callback kann ja mal kurz das aktuelle Verzeichnis ändern. Wenn man dann relative File-Namen verwendet, stoppt das Programm, aber man hat keine Chance den Grund dafür heraus zu finden.

"9<ch_num<100" macht etwas anderes, als Du erwartest: Matlab rechnet von links nach rechts. Zuerst wird "9<ch_num" ausgewertet. Das ist entweder 0 oder 1. Für beide Werte gilt aber "1<100" und "0<100". Du meinst:
Code:
if 9 < ch_num && ch_num < 100

Abver mit dem sprintf Befehl kann man das komplizierte Anfügen von Nullen ja sowieso elegant lösen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.