Dateien Konvertieren



  • Hallo,
    ich möchte Dateien aus einem Verzeichnis auslesen und konvertieren.
    Ich hab einen Codeabschnitt der die Dateien Konvertieren soll bekommen und suche die Dateien mit einer FindFirsFile-Funktion aus dem Verzeichnis.
    Allerdings schaffe ich es nicht die Funktionen zu verknüpfen.

    #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 charOutput (ifstream& stream);
    void copyChar4Char (ifstream& stream, ofstream& stream);
    
    #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 
                        {                   
                        // Eintrag nur behandeln, wenn es nicht . oder .. ist (werden nur bei Unterverzeichnissen mit zurückgeliefert) 
    
                           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 
                                ifstream f1(wfd.cFileName);
                                  //charOutput( f1 );
    
                              } 
                              } 
                              } 
                         while (FindNextFile(fHandle,&wfd)); 
              FindClose(fHandle); 
    
           cin.get();
    }
    
    int Konvert(int argc, _TCHAR* argv[])
    {
    
        _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;
    
    }
    

    Ich bin für jede Hilfe dankbar!!
    Bin am verzweifeln, bitte helft mir!!



  • main() ist die erste Funktion, die aufgerufen wird - und wenn jemand die Eingabeparameter überprüft, sollte das am besten main() sein. Von dort aus kannst du dann alle anderen Funktionen aufrufen, die dein Programm benötigt.



  • Das heißt, also ich sollte die Konvert Funktion zur main() machen?
    Oder welche Eingabeparameter meinst du?



  • Oder der main() die Parameter übergeben, die du bei Konvert() eingehängt hast.



  • Wie stelle ich das am besten an?

    Ich weiß, ich weiß, dumm wie Brot und so...



  • Ich würde die eigentliche Konvertierung in der Funktion Konvert() lassen und die Suche nach der "richtigen" Datei (wenn das überhaupt nötig ist) in die main() auslagern:

    int Konvert(const string& fname) //könnte auch "const CString&" sein
    {
      ...
    }
    
    int main(int argc,char*argv[])
    {
      if(argc!=2)
        printf("Bitte Dateinamen angeben");
      else
        Konvert(argv[1]);//hier könntest du die Zieldatei auch mit FinfFirstFile() und Co. suchen lassen
    }
    


  • Danke schonmal, das Problem ist nur, dass ich nicht eine, sondern ca. 14000 Dateien Konvertieren muss, die stehen zwar alle im selben Verzeichnis, nur mus die Konvertierung eigentlich in der Schleife der FindFirst funktion geschehen denke ich.



  • 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 constant

    bei 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 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*)'


Anmelden zum Antworten