Zum Inhalt springen

Dateiendung auslesen


Fufialk

Empfohlene Beiträge

Hallo,

Ich habe mehrere kleine Programme geschrieben, die Messdaten auslesen und auswerten. Die Messdaten liegen als Dateien mit unterschiedlichen Dateiendungen vor (*.dat und *.msg). Ich möchte nun meine Vielen einzelnen Programme als Unterfunktionen eines einzigen Programmes zusammenfassen, um den Anwendern das Arbeiten zu erleichtern. Hierzu muss ich die per Drag & Drop übergebenen Dateien nach Ihren Endungen sortieren, wofür ich folgenden Code geschrieben habe:


#include <iostream.h> // cin, cout
#include <fstream.h> // ifstream, ofstream
#include <stdlib.h> // exit, rand
#include <iomanip.h> // setw
#include <conio.h> // getch
#include <sys/types.h> // off_t
#include <sys/stat.h> // stat
#include <time.h> // ctime, time
#include <stdio.h>
#include <string.h> //strcmp

//void meldungen ();
//void daten ();
int main(int argc, const char* argv[])
{
if (argc < 2)
{
printf("Starten Sie das Programm indem Sie die umzuwandelnden Daten");
printf("\nper Darg & Drop auf das Programmicon ziehen.");
printf("\nBeenden mit Tastendruck.");
getch();
exit(0);
}
int f;
int nendung;
for (f = 1; f < argc; f++)
{
cout << "\nFolgende Datei wird verarbeitet : " << argv[f];
char endung [3];
const char* find = strrchr(argv[f], '.'); //letztes "." finden
strncpy(endung,find+1, 3); //3 Zeichen ab "." kopieren und "filewrite zuweisen
cout << "\nEndung : " << endung;
if ( strcmp ( endung , "dat" ) == 0 )
nendung = 0;
else if ( strcmp ( endung , "msg" ) ==0 )
nendung = 1;
else
nendung = 2;
switch (nendung)
{
case 0 : cout << "\nDatendatei"; break;
case 1 : cout << "\nMeldungsdatei"; break;
case 2 : cout << "\nEs handelt sich nicht um ein Messfile!"; break;
}
}
getch();
}
[/PHP]

Mein Problem ist, daß nach der Dateiendung noch Leer bzw. Sonderzeichen an [b]char[/b] endung übergeben werden, obwohl hier nur 3 Zeichen stehen sollten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du solltest dich entscheiden, ob du die C-Dateifunktionen (printf) oder die C++-Streams (cout) benutzt. Mischen ist nicht so gut.

Außerdem benutzt du veraltete C++-Headerdateien.

#include <iostream>            // cin, cout 
#include <fstream> // ifstream, ofstream
#include <cstdlib> // exit, rand
#include <iomanip> // setw
#include <conio.h> // getch
#include <sys/types.h> // off_t
#include <sys/stat.h> // stat
#include <ctime> // ctime, time
//#include <cstdio> // NICHT MISCHEN
#include <cstring> //strcmp
[/code]

So müsste das aussehen, wenn du nicht gerade einen sehr alten Compiler benutzt.

Jetzt aber zum eigentlichen Problem: Du hast nur drei Zeichen für die Dateierweiterung. Da passt kein Nullzeichen mehr rein, wenn die Erweiterung selbst schon drei Zeichen hat. Ohne Nullterminierung werden die Daten, die im Speicher hinter deinem Array stehen, als Bestandteil des Strings interpretiert. Das kommt daher, dass strncpy keine Nullterminierung anhängt, wenn der Quellstring mehr Zeichen hat, als maximal kopiert werden sollen. Darum musst du dich also selbst kümmern, wenn du strncpy benutzt.

Du solltest auch bedenken, dass Dateierweiterungen auch mehr als drei Zeichen haben können, ".jpeg" und ".html" zum Beispiel.

Dein Programm wird außerdem wohl abstürzen, wenn du eine Datei ohne Erweiterung darauf ablegst. Was passiert, wenn du eine Datei benutzt, die selbst keine Erweiterung hat, die aber in ihrem Verzeichnispfad einen Punkt hat, will ich mir grad nicht ausmalen ;)

Ich frage mich allerdings, warum du dich überhaupt so mit char-Array abplagst. Warum nicht std::string?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das mit den veralteten Schreibweisen liegt sicherlich an der Lieteratur, die ich verwende, und auch daran, daß ich immer nur so weit an dem Programm arbeite, bis es das macht, was ich will. Sicherlich keine sehr gute Einstellung, ich kann mir aber leider nicht viel mehr Zeit nehmen.

Die Sache mit den Arrays ist für mich sehr einfach zu verstehen, bsonders, da es hierzu auch sehr viel Dokumentation gibt. Während ich mit Funktionen wie std::string noch gar nicht gearbeitet habe.

Was mir nicht ganz einleuchtet ist:

Ich deklariere char endung [3] es dürften doch also gar nicht mehr als drei Zeichen dort stehen. Außerdem sage ich:

strncpy(endung,find+1, 3); es sollen nur 3 Zeichen kopiert werden.

Mit strlen kann ich die Länge meines Strins auslesen. Gibt es auch einen Befehl, um sie festzulegen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich deklariere char endung [3] es dürften doch also gar nicht mehr als drei Zeichen dort stehen.
Es stehen auch nicht mehr drin. Aber die String- und Ausgabefunktionen wissen nichts von Arrays. Die Größeninformation geht sowieso verloren, wenn man Arrays an Funktionen übergibt. Für strcmp oder den operator<< ist das nur ein Zeiger auf das erste Element deines Arrays. Um zu ermitteln, wie lang der String ist, müssen diese Funktionen die Nullterminierung suchen. Nach drei Zeichen ist zwar dein Array zuende, aber da ist immer noch keine Nullterminierung. Darum wird in dem dahinterliegenden Speicher weitergesucht, solange, bis entweder durch Zufall ein Nullbyte im Speicher steht, oder das ganze mit einer Zugriffsverletzung abstürzt.

Mit strlen kann ich die Länge meines Strins auslesen. Gibt es auch einen Befehl, um sie festzulegen?
Ja, setz eine Nullterminierung. Wie gesagt, strncpy macht das nicht automatisch für dich.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...