Dateien Konvertieren



  • 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 tostrncpy(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


Anmelden zum Antworten