Vergleich mit Substrings...? - Hilfe -



  • strncpy



  • Du meinst wohl eher strncmp und außerdem verwendet stylewarz3 strings und keine char-Arrays.



  • Hallo Vellas,

    kannst mir viell. den Code versuchen einzubauen, habs versucht aber bin gescheitert, nur wenns keine Umstände macht?



  • habs auch ohne strcmp gelöst, danke!!!

    [cpp]#include <windows.h>
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    int main()
    {	
    	string array;
    	string arr[100];
    	string array_name[100];
    	string array_endung[100];
    	int i=0;
    
    		cout << 
    		"\n"
    		"------------------------------------------------------------------\n"
    		"Traingsprojekt C++ / *** / Version 1.1\n"
    		"------------------------------------------------------------------\n"
    		"\n"
    		"Nach der Eingabe von Enter startet die Datenpruefung..............\n";
    		fflush(stdin);
    		getchar();
    
    HANDLE fHandle; 
    WIN32_FIND_DATA wfd; 
    
    fHandle=FindFirstFile("O:\\Daten\\Trainingsprojekt_C++\\dfue_eingang\\*",&wfd); 
    
    do 
    { 
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
        { 
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            { 
            } 
            	else 
            	{ 
               	fopen("wfd.cFileName","r");
            	}
    
    				if(fopen==NULL)
    				{
    				cout << "Datei konnte nicht geoeffnet werden!";
    				fflush(stdin);
    				getchar();	
    				}
    					else
    					{
    					cout << "Die Datei ";
    					cout << wfd.cFileName;
    					cout << " wurde erfolgreich geoeffnet!\n"; 
    					}
    
    // Einlesen bis zur 8. Stelle des Dateinamens
    
    	array=wfd.cFileName;
    
    	arr[i]=wfd.cFileName;
    	string FileName = arr[i].substr(0,8);
    	i++;
        }
    }
    
    while (FindNextFile(fHandle,&wfd)); 
    
    cout << endl << endl;
    
    for (int x = 0; x < i; x++) 
    {
    	// durchlaufe alle bisherigen Werte
    	for (int j=0; j<i; j++)
    	{  
    
    		 array_name[x]=arr[x].substr(0,8);
    		 array_endung[x]=arr[x].substr(8,11);
    		 array_name[j]=arr[j].substr(0,8);
    		 array_endung[j]=arr[j].substr(8,11);
    
              if (arr[j]==array_name[x])
              { // Hier wurde ein doppelter Name entdeckt
    
              		if (array_endung[x]!=array_endung[j]) {
    
    				cout << arr[j] << " und " << arr[x]<< " sind gleich!" << endl;
    
              		}
    //          		else
    //                {
    //               	cout << arr[j] << " und " << arr[x]<< " sind nicht gleich!" << endl;
    //                }
              }
    
        }			
    }
    
    FindClose(fHandle); 
    
        cout << 
    	"\n"
    	"Um fortzufahren druecken Sie Enter!";
    	fflush(stdin);
    	getchar();
    
    cout << 
    		"\n"
    		"------------------------------------------------------------------\n"
    		"> Korrekte Datensaetze befinden sich im Verzeichnis 'dfue-ausgang'\n"
    		"> Fehlerhafte Datensaetze befinden sich im Verzeichnis 'fehler'\n"
    		"> Protokolldaten befinden sich im Verzeichnis 'protokoll'\n"
    		"------------------------------------------------------------------\n"
    		"\n"
    		"*** Die Datenpruefung ist nun abgeschlossen ***\n"
    		"\n"
    		"Mit der Eingabe von Enter beenden Sie das Programm ...............";
    		fflush(stdin);
    		getchar();
    
    return 0;
    }[/cpp]
    


  • Vellas schrieb:

    Du meinst wohl eher strncmp und außerdem verwendet stylewarz3 strings und keine char-Arrays.

    tschuldigung 😕



  • Ich dachte du hättest in dem if-Statement (s. Code-Zitat) aus deinem ersten Beitrag den Fehler (habe beim if ein Kommentar eingefügt):

    for (int x = 0; x < i; x++)
    {
        // durchlaufe alle bisherigen Werte
        for (int j=0; j<i; j++)
        {         
             array_name[x]=arr[x].substr(0,8);
             array_name[j]=arr[j].substr(0,8);
    
              if (array_name[j]==arr[x]) // <---- arr_name[x] statt arr[x]
              {
                  // Hier wurde ein doppelter Name entdeckt
                    cout << arr[j] << " und " << arr[x]<< " sind gleich!" << endl;
    
              }
                    else
                    {
    //                   cout << arr[j] << " und " << arr[x]<< " sind nicht gleich!" << endl;
                    }
        }           
    }
    

    Aber da du die Lösung bereits gefunden zu haben scheinst, ist's ja gut. ^^

    Aber wenn wir schon dabei sind, noch ein Hinweis. Du solltest die neuen C++-Header verwenden (ohne .h; außer windows.h) und bei den C-Headern ein c davor machen und das .h ebenfalls weglassen.



  • Danke für die hilfreichen Tipps an dieser Stelle.

    Hätte da jetzt aber ein neues Problem. Und zwar möchte ich jetzt die Dateien mit dem identischen Dateinamen bis zur 8. Stelle öffnen, kann aber ja nicht das Array dafür öffnen. Demnach brauche ich wahrscheinlich einen Zeiger nur wo, und wie positioniere ich diesen? Oder gibt es eine andere Möglichkeit?

    Vielen Dank im Voraus!



  • Hallo

    Ich habe mir jetzt nicht genau alles durchgelesen, aber kann es sein, dass du den falschen Header einbindest? Wenn du mit std::strings arbeiten willst, solltest du

    #include <string> //ohne h, weil es sich sonst um c-strings
    

    einbinden.

    chrische



  • Das C++Pendant zu string.h heiß allerdings cstring und hat nichts mit der string zu tun.
    In der cstring (bzw. string.h) sind die Funktionen für char* drin (strcpy u.a.).
    In string befindet sich die Klasse std::string. Die wird bei vielen Compilern aber auch über die iostream mit eingebunden.
    Natürlich sollten hier stdio.h durch cstdio und string.h (oder weglassen) durch cstring ersetzt werden.



  • eine hilfe zu dem thema ist es aber nicht



  • Wenn du fopen verwenden möchtest, kannst du dir ein Array von FILE* Zeigern halten (besser vector). fopen gibt genau so einen Zeiger zurück. Den mußt du zum Schluß dann mit fclose schließen.
    Was soll das denn hier bedeuten?

    else
    {
       fopen("wfd.cFileName","r"); // öffnet eine Datei zum Lesen, der Zeiger auf diese Datei wird aber nicht gespeichert
    }
    if(fopen==NULL)...
    

    So könnte es etwa aussehen

    vector<FILE*> filevect;
    if (array_name[j]==arr[x]) // <---- arr_name[x] statt arr[x]
    {
       FILE* file = fopen(arr[x].c_str(),r); // Datei öffnen
       if( file ) filevect.push_back(file); // wenn erfolgreich zum Vektor hinzufügen
    }
    // dann weiter und schliessen nicht vergessen
    


  • Hallo Barunstein,

    der Teil des Programms ist schon nicht mehr aktuell, waren die ersten Versuche! Werd deine Variante mal ausprobieren und mich gleich rückmelden...

    Vielen Dank schonmal


Anmelden zum Antworten