Dateien Konvertieren
-
Dann mach das doch!
Ruf innerhalb der Schleife nun Konvert(...) mit der jeweiligen Datei auf.
-
Hmmm, stimmt, das müsste gehen.
Könnt ihr aus dem Quellcode von Konvert() erkennen welche Variable ich durch die Datei ersetzen muss?
Wie gesagt, ich hab den Teil nicht selber geschrieben und bin da noch nicht wirklich durchgestiegen.
-
ich schätz mal die variable filename
-
Hab mal versucht, die Konvertierung einzeln vorzunehmen, und nen Dateinamen für filename eingesetzt, da bekomm ich folgende Fehler:
Hier jetzt in Zeile 6-expected primary-expression before string constant
-expected ';' before string constantbei folgendem code:
int _tmain(int argc, _TCHAR* argv[]) { _TCHAR "I0A2A07A.pls"[FILENAME_MAX + 1]; if (argc != 2) { printf("Unzulaessige Parameterzahl!\n"); printf("Aufruf:\n"); printf("DEAConverter <Dateiname>\n"); return 0; } _tcsncpy("I0A2A07A.pls", argv[1], FILENAME_MAX); FILE *f = _tfopen("I0A2A07A.pls", _T("rb")); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); printf("%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday , stm.tm_mon , stm.tm_year , stm.tm_hour , stm.tm_min , stm.tm_sec , DEARecord.Millisec > 0 ? DEARecord.Millisec : 0); printf("DEARecord: Zustand = %d, Kennung = %d, Grund = %c\n", DEARecord.Wert.Zustand , DEARecord.Kennung , DEARecord.Grund); } fclose(f); } system("PAUSE"); return 0; }
-
Was soll die Zeile überhaupt darstellen? Das da hat überhaupt nichts mit C++ zu tun, also dürfte auch klar sein, daß der Compiler es nicht versteht. Eine Variable braucht einen richtigen Namen - und da zählt kein String-Literal.
Wenn du viele Dateien verarbeiten willst, solltest du so vorgehen:
- die main() holt sich den Namen des Zielverzeichnisses aus den Eingabeparametern (argv[1]), hängt ein "\*" hinten dran und durchsucht das Verzeichnis mit FindFirstOf()/FindNextOf()
- für jede gefundene Datei wird dabei Konvert() aufgerufen
- Konvert() bekommt den jeweiligen Dateinamen - und öffnet und konvertiert genau diese Datei
-
Wenn ich Konvert(int argc, _TCHAR*) aufrufen will muss ich doch
Konvert(wfd.cFileName); //wfd.cFileName, hier steht jetzt ja der Dateiname
in die schleife bauen?!
Dann sagt mir der Kompiler ich würde zu wenig Parameter übergeben muss ich das int argc auch haben? Ich wüsste nicht was da rein sollte.
-
Wozu braucht denn Konvert() diese Anzahl? (alle Auswertungen, die du damit machen willst, werden schon im main erledigt) Lass doch den ersten Parameter bei der Funktionsdefinition weg.
-
Hab ich versucht, bei:
#include <windows.h> #include <cstdio> #include <io.h> #include <iostream> #include <fstream> #include <cstdlib> #include <cstring> #include <ctime> #include <tchar.h> #include <shlobj.h> using namespace std; int Konvert(_TCHAR* argv[]); #pragma pack(push,2) typedef float FLOAT; typedef unsigned char UCHAR; typedef char CHAR; typedef short int SHORT; typedef time_t DATE_TIME; typedef union _proz_wert_union { /* Union für den Prozeßwert */ FLOAT Wert; /* für Analogeingänge einen Float */ UCHAR Zustand; /* für Digitaleingänge einen UCHAR */ } PROZ_WERT_UNION; /* 4 Byte entsprechend dem größen Member */ typedef struct _dea_archiv_typ { /* Bytes Bedeutung */ DATE_TIME Startzeit; /* 4 Startzeit des Intervalls */ SHORT Millisec; /* 2 Millisec. bei Echtzeitverarb. sonst. -1 */ PROZ_WERT_UNION Wert; /* 4 union für den Prozeßwert */ UCHAR Kennung; /* 1 Kennung des archivierten Wertes */ CHAR Grund; /* 1 Archivierungsgrund */ } DEA_ARCHIV_TYP; /* 12 Byte pro Archiveintrag */ #pragma pack(pop) int main () { HANDLE fHandle; WIN32_FIND_DATA wfd; fHandle=FindFirstFile("C:\\Osnabrueck\\DEA\\2007\\09\\*",&wfd); do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0); // Datei ist keine, sondern ein Verzeichnis... } else { cout << wfd.cFileName << endl; //Namen der Dateien ausgeben Konvert(wfd.cFileName); } } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); cin.get(); } int Konvert(_TCHAR* argv[]) { _TCHAR wfd.cFileName[FILENAME_MAX + 1]; if (argc != 2) { printf("Unzulaessige Parameterzahl!\n"); printf("Aufruf:\n"); printf("DEAConverter <Dateiname>\n"); return 0; } _tcsncpy(wfd.cFileName, argv[1], FILENAME_MAX); FILE *f = _tfopen(wfd.cFileName, _T("rb")); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); printf("%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday , stm.tm_mon , stm.tm_year , stm.tm_hour , stm.tm_min , stm.tm_sec , DEARecord.Millisec > 0 ? DEARecord.Millisec : 0); printf("DEARecord: Zustand = %d, Kennung = %d, Grund = %c\n", DEARecord.Wert.Zustand , DEARecord.Kennung , DEARecord.Grund); } fclose(f); } cin.get(); return 0; }
Bekomme ich folgende Fehler:
main.cpp: In function
int main()': main.cpp:72: error: cannot convert \
CHAR*' to `_TCHAR**' for argument `1' to `int Konvert(_TCHAR**)'main.cpp: In function `int Konvert(_TCHAR**)':
main.cpp:91: error: expected primary-expression before "wfd"
main.cpp:91: error: expected;' before "wfd" main.cpp:93: error:
argc' undeclared (first use this function)
main.cpp:93: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp error: `wfd' undeclared (first use this function)make.exe: *** [main.obj] Error 1
-
Ich habe ein bisschen rumgespielt, jetzt bekomm ich noch folgende Fehler:
main.cpp:71: error: incompatible types in assignment of `CHAR' to `CHAR[260]'
main.cpp:72: error: expected primary-expression before "int"Habe den Dateinamen als 'CHAR' definiert was hat das `CHAR[260]' zu bedeuten?
-
'CHAR' ist nur ein einzelnes Zeichen wie 'A' oder 'z' oder '.' oder so. Hast du ne Ahnung, wie da ein ganzer Dateiname reinpassen soll
edit: Ups, das Problem liegt woanders.. Guck mal, die Funktion "Konvert" will ein Array von CHAR-Zeigern. Du übergibst ihr in Zeile 71 aber nur einen einzigen. Vielleicht liegt da das Problem
Und wo hast du in der Funktion "Konvert" die Variable "argc" her? Sieht so aus, als hättest du den Inhalt einer main-Funktion einfach da reinkopiert..
-
Die Funktion Konvert() hab ich nicht selber geschrieben (wenn ichs hätte, hätte ich warscheinlich jetzt nicht die Probleme mit diesem banalen Kram )
Ich hab grade mit demjenigen telefoniert ders hat und er meinte argc wäre ein Argument-Counter oder so...Als was müsste ich denn filename deklarieren wenn ich da nen Dateinamen reinschreiben wollte wenn nicht CHAR?
Und das Array ist soweit ich das verstanden habe zum Konvertieren der Datei, das soll so ein Hex verschlüsseltes struct sein, oder so
Was müsste ich denn deiner Meinung nach übergeben damit das laufen könnte?
-
Für jegliche Zeichenketten bietet sich eigentlich immer "string" an
Die Funktion "Konvert" braucht ja, so wie es aussieht, nur einen string als Argument. Also z.B. "void Konvert( const string& filename )". Die Prüfung, ob argc ungleich 2 ist, kannst du rausnehmen. In normalen main-Funktionen bekommt man halt so einen Array von CHAR-Zeigern geliefert, plus deren Anzahl (die steht dann in argc). In argv[0] steht dann der Pfad zu deiner Exe-Datei und in argv[1] bis argv[argc-1] stehen die Kommandozeilenparameter. Nunja, da du weißt, dass die Funktion einfach nur einen String übergeben bekommt, kannst du die Prüfung weglassen. Und den Rückgabewert "int" kannst du auch in den Wind schießen, die Funktion "Konvert" gibt ja immer 0 zurück, und das ganz am Ende. Damit ist keinerlei Information verbunden, kannste den Rückgabewert gleich wegmachen
Und was zur Hölle ist das hier:
_TCHAR wfd.cFileName[FILENAME_MAX + 1];
?? Eine Variablendeklaration mit dem Namen "wfd.cFileName"? Was isn das für ein Name? Namen sind sowas wie "fn", "filename", "path" oder sonstwas..
-
Erstmal: DANKE!!! Super erklärt, so hab sogar ich das meist verstanden was du geschrieben hast!
Dann: Das meiste scheint zu klappen, allerdings mault er noch etwas wegen dem string.
#include <windows.h> #include <cstdio> #include <io.h> #include <iostream> #include <fstream> #include <cstdlib> #include <cstring> #include <ctime> #include <tchar.h> #include <shlobj.h> using namespace std; void Konvert(const string& filename); #pragma pack(push,2) typedef float FLOAT; typedef unsigned char UCHAR; typedef char CHAR; typedef short int SHORT; typedef time_t DATE_TIME; typedef union _proz_wert_union { /* Union für den Prozeßwert */ FLOAT Wert; /* für Analogeingänge einen Float */ UCHAR Zustand; /* für Digitaleingänge einen UCHAR */ } PROZ_WERT_UNION; /* 4 Byte entsprechend dem größen Member */ typedef struct _dea_archiv_typ { /* Bytes Bedeutung */ DATE_TIME Startzeit; /* 4 Startzeit des Intervalls */ SHORT Millisec; /* 2 Millisec. bei Echtzeitverarb. sonst. -1 */ PROZ_WERT_UNION Wert; /* 4 union für den Prozeßwert */ UCHAR Kennung; /* 1 Kennung des archivierten Wertes */ CHAR Grund; /* 1 Archivierungsgrund */ } DEA_ARCHIV_TYP; /* 12 Byte pro Archiveintrag */ #pragma pack(pop) int main () { string filename; HANDLE fHandle; WIN32_FIND_DATA wfd; fHandle=FindFirstFile("C:\\Osnabrueck\\DEA\\2007\\09\\*",&wfd); do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0); // Datei ist keine, sondern ein Verzeichnis... } else { cout << wfd.cFileName << endl; //Namen der Dateien ausgeben wfd.cFileName=filename; Konvert(filename); } } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); cin.get(); } void Konvert(const string& filename) { // _TCHAR filename[FILENAME_MAX + 1]; //if (argc != 2) { //printf("Unzulaessige Parameterzahl!\n"); //printf("Aufruf:\n"); //printf("DEAConverter <Dateiname>\n"); //return 0; //} _tcsncpy(filename, /*argv[1]*/, FILENAME_MAX); FILE *f = _tfopen(filename, _T("rb")); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); printf("%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday , stm.tm_mon , stm.tm_year , stm.tm_hour , stm.tm_min , stm.tm_sec , DEARecord.Millisec > 0 ? DEARecord.Millisec : 0); printf("DEARecord: Zustand = %d, Kennung = %d, Grund = %c\n", DEARecord.Wert.Zustand , DEARecord.Kennung , DEARecord.Grund); } fclose(f); } cin.get(); //return 0; }
Fehler:
main.cpp: In function
int main()': main.cpp:71: error: incompatible types in assignment of \
std::string' to `CHAR[260]'main.cpp: In function
void Konvert(const std::string&)': main.cpp:100: error: no matching function for call to
strncpy(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int)'C:/Dev-Cpp/include/string.h:52: note: candidates are: char* strncpy(char*, const char*, size_t)
main.cpp:101: error: cannot convert `const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `const char*' for argument `1' to `FILE* fopen(const char*, const char*)'
-
argv kommt eigentlich aus der main-Funktion. Wenn du also einen Parameter erwartest, sollte man diese auch dem Programm übergeben können und dann an die zu verarbeitende Funktion weiterreichen.
main.cpp:71: error: incompatible types in assignment of `std::string' to `CHAR[260]'
Wenn du einen string in ein char-Array kopieren willst, solltest du das mit c_str() von string (liefert einen char const*) und strncpy machen, also statt:
wfd.cFileName=filename;
dies:
strncpy(wfd.cFileName, filename.c_str(), 259); // 1 Zeichen für die Endekennung
Greetz
-
Habe dann jetzt:
else { cout << wfd.cFileName << endl; //Namen der Dateien ausgeben strncpy(wfd.cFileName, filename.c_str(), 259); // 1 Zeichen für die Endekennung Konvert(filename); } } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); cin.get(); } void Konvert(const string& filename) { //_TCHAR filename[FILENAME_MAX + 1]; //if (argc != 2) { //printf("Unzulaessige Parameterzahl!\n"); //printf("Aufruf:\n"); //printf("DEAConverter <Dateiname>\n"); //return 0; //} char* strncpy(filename/*, argv[1], FILENAME_MAX*/); FILE *f = _tfopen(filename, _T("rb")); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); printf("%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday
Und "nur" noch 2 Fehler die ich allerdings nicht verstehe:
Zeile 34: error: cannot convert `const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `char*' in initialization
Zeile 35: error: cannot convert `const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `const char*' for argument `1' to `FILE* fopen(const char*, const char*)'
-
Vellas schrieb:
main.cpp:71: error: incompatible types in assignment of `std::string' to `CHAR[260]'
Wenn du einen string in ein char-Array kopieren willst, solltest du das mit c_str() von string (liefert einen char const*) und strncpy machen, also statt:
wfd.cFileName=filename;
dies:
strncpy(wfd.cFileName, filename.c_str(), 259); // 1 Zeichen für die Endekennung
Wobei - eigentlich benötigst du ja die andere Richtung - filename=wfd.cFileName (bzw. kannst gleich wdf.cFileName an die Funktion übergeben)
Die Warnung besagt, daß du einer lokalen Variablen den selben Namen gegeben hast wie dem Parameter - ergo kommst du nicht mehr an den Parameter heran. Du brauchst da auch kein zusätzliches char-Array in der Funktion mehr anzulegen:
void Konvert(const string& filename) { FILE *f = _tfopen(filename.c_str(), _T("rb")); if (f) { DEA_ARCHIV_TYP DEARecord; ... //der Rest wie gehabt } }
PS: Bitte entscheide dich für eine einheitliche Zeichen-Repräsentation - das bunte Mischen von 'char' (ANSI-Zeichen) und 'TCHAR' (je nach Optionen ANSI- oder UNICODE-Zeichen) bereitet später nur Probleme.
-
Danke an alle, die mir hierbei geholfen haben!
Compilieren und ausführen klappt jetzt.
Die Konvertierung haut noch nicht hin, es gibt zumindest hinterher keine Dateien die lesbaren Text enthalten. Aber da schau ich mal ob ich da noch was übers WE hinbekomme
Falls ich Probleme habe weiß ich ja nun wo ich kompetente Hilfe bekomme.Ein schönes Wochenende!
gruß Sebastian