mehrere Dateien lesen



  • Hallo,
    ich versuche ein Programm zu schreiben, dass alles .exe Dateien im Ordner, wo das Programm ist liest und hexadezimal ausgibt. Dazu habe ich auch einen Ansatz:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        FILE *inpt;
        FILE *out;
        inpt=fopen("inptfile.exe","rb");
        int a=0;
    
        getchar();
    
            do
            {
                printf(" %X ",a);
            }while( (a=fgetc(inpt)) != EOF  );
    
        getchar();
        return EXIT_SUCCESS;
    }
    

    Jedoch öffnet das Programm nur die angegebene Datei "inptfile.exe".
    Ich will aber, dass alle exe-Dateien gelesen werden. Versucht habe ich dann folgendes:

    inpt=fopen(*.exe,"rb");
    

    mit und ohne "" , hat aber nicht funktioniert...
    Weiss jemand wie man das in C machen kann?
    Danke im Voraus.

    mit freundlichen Grüßen

    raufaser



  • Wildcards werden von der SHELL abgearbeitet, ansonsten musst du sie selber implementieren, indem du das Verzeichnis ausliest und Datei für Datei liest, die zur Wildcard passt. Ein Haufen Arbeit, die du auch der SHELL überlassen kannst.

    int i;
    for(i=0; i < argc; ++i)
    {
      inpt=fopen(argv[i],"rb");
      ...
      }while( (a=fgetc(inpt)) != EOF  );
      fclose(inpt);
    }
    
    $ ./dein_programm *.exe
    


  • Ist öfter mal Thema, findet man schnell mit der Forensuche
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-238055-and-highlight-is-verzeichnis.html



  • ok,
    Dann muss ich mich wohl durch die Windows Funktionen arbeiten.
    Danke für die Antworten 🙂



  • raufasertapete schrieb:

    ok,
    Dann muss ich mich wohl durch die Windows Funktionen arbeiten.
    Danke für die Antworten 🙂

    aha, du bist einer der Fraktion warum einfach, wenn es deutlich umständlicher geht? 🕶



  • raufasertapete schrieb:
    ok,
    Dann muss ich mich wohl durch die Windows Funktionen arbeiten.
    Danke für die Antworten

    aha, du bist einer der Fraktion warum einfach, wenn es deutlich umständlicher geht?

    Wieso, versteh ich nicht, was kann ich denn sonst machen?



  • raufasertapete schrieb:

    Wieso, versteh ich nicht, was kann ich denn sonst machen?

    Das kannst du machen:

    #include <stdio.h>
    #include <stdlib.h>
    
    void remcrlf(char* buf) // remove carriage-return-linefeed
    {
    	char* p = strchr(buf,'\r');
    	if ( p!=NULL )
    	{
    		*p=0;
    	}
    	else
    	{
    		if ( NULL != (p = strchr(buf,'\n')))
    			*p=0;
    	}
    }
    
    int main(int argc, char* argv[])
    {	
    	char buf [FILENAME_MAX+1] = {0};
    	char* p = NULL;
    	char* fname = "exefiles.txt";
    	FILE* exefiles = NULL, *exefile = NULL;
    
    	if ( argv[0] != NULL )
    	{
    		strncpy (buf, argv[0], FILENAME_MAX);
    		if ( NULL != (p=strrchr(buf,'\\')))
    			*p=0;
    		if ( chdir(buf) )
    			return 1;
    	}
    
    	sprintf ( buf, "dir *.exe /B > %s", fname );
    	system(buf);
    
    	if ( NULL == (exefiles = fopen(fname, "rb")))
    		return 1;
    
    	while (fgets (buf, sizeof(buf), exefiles))
    	{
    		remcrlf(buf);
    
    		if ( NULL == (exefile = fopen (buf,"rb")))
    		{
    			puts(strerror(errno));
    			fclose(exefiles);
    			break;
    		}
    
    		printf ( "Hit enter if you are ready to view %s\n", buf );
    		getch();
    		while (!feof(exefile))
    			printf("%X",fgetc(exefile));
    		fclose(exefile);
    
    	}
    
    	if (ferror(exefiles))
    		puts(strerror(errno));
    	fclose(exefiles);
    
    	return 0;
    }
    

    Es könnte sein, das es auch unter Linux läuft, kann ich gerade nicht testen.
    Wenn du es mit Windowsfunktionen machst, sieht das ganze ready for Unicode so aus, guckst du:

    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    int main()
    {	
    	TCHAR tbuf [FILENAME_MAX+1] = {0};
    	TCHAR* tp = NULL;
    	TCHAR* filter = _T("\\*.exe");
    	FILE *exefile = NULL;
    
    	HANDLE fHandle; 
    	WIN32_FIND_DATA wfd; int c;
    
    	if ( 0 == GetModuleFileName(NULL,tbuf,sizeof(tbuf)))
    		return 1;
    	if ( NULL != ( tp = _tcsrchr(tbuf,_T('\\'))))
    		*tp = 0;
    	if ( _tchdir(tbuf))
    		return 1;
    
    	if ( _tcsclen(filter) + _tcsclen(tbuf) > FILENAME_MAX )
    		return 1;
    	_tcscat ( tbuf, filter);
    
    	if ( NULL == (fHandle = FindFirstFile(tbuf,&wfd)))
    		return 1;
    	do
    	{
    		if ( NULL==(exefile=_tfopen(wfd.cFileName,_T("rb"))))
    			break;
    		_tprintf ( _T("Hit enter if you are ready to view %s\n"),
    			wfd.cFileName );
    		getch();
    		while (!feof(exefile))
    			printf("%X",fgetc(exefile));
    		fclose(exefile);
    	}
    	while (FindNextFile(fHandle,&wfd));
    	return 0;
    }
    

    Etwas kürzer, aber das läuft garantiert nicht unter Linux.

    Gruß,
    B.B. ( yes, the bigger one )
    🙂



  • raufasertapete schrieb:

    raufasertapete schrieb:
    ok,
    Dann muss ich mich wohl durch die Windows Funktionen arbeiten.
    Danke für die Antworten

    aha, du bist einer der Fraktion warum einfach, wenn es deutlich umständlicher geht?

    Wieso, versteh ich nicht, was kann ich denn sonst machen?

    du sagst, du willst dich durch die Windows Funktionen, um Ordner zu lesen, damit du Wildcards (*.exe z.b.) implementieren kannst, wo ich doch dir Stück Code gegeben hab, der das gar nicht braucht, denn er lässt die Auswertung der Wildcards jemanden anderen machen. Hast du überhaupt meinen Code gelesen? 😕

    @bigger brother:

    sprintf ( buf, "dir *.exe /B > %s", fname );
    

    du hast geschummelt 😉



  • @supertux
    sorry, ich dachte Shell bezieht sich auf ein LINUX-basiertes OS...
    deswegen dachte ich, dass ich den windows Krempel lesen muss^^

    Aber das Programm von Bigger Brother scheint zu laufen.
    Ich muss es nur noch verstehen, denn ich bin noch relativ neu in C und programmiere nur hobbyweise, in dem Programm sind einige dinge drin, die ich noch nie gesehen habe xD
    Trotzdem danke euch für die Mühe, die ihr euch für mich macht.
    grüße


Anmelden zum Antworten