Error opening file: Invalid argument



  • #define ___dbg
    
    #include <stdio.h>
    #include <string.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        bool fileexists = false;
        while(fileexists == false)
        {
            while(argc < 2)
            {
                printf("What's the name of the file?\n");
                char *bigbuf = (char *)malloc(250 * sizeof(char*));
                if(fgets(bigbuf, 250, stdin) == NULL)
                {
                    printf("reading error\n");
                }
                else
                {
                    #ifdef ___dbg
                    printf("bigbuf: %s\n", bigbuf);
                    #endif
                    unsigned char filename_size = strlen(bigbuf);
                    argv[1] = (char*)malloc(filename_size * sizeof(char*));
                    strncpy(argv[1], bigbuf, filename_size);
                    #ifdef ___dbg
                    printf("filename_size: %d\n", filename_size);
                    #endif
                    free(bigbuf);
                    #ifdef ___dbg
                    printf("argv[1]: %s\n",argv[1]);
                    #endif
                    argc = 2;
                }
            }
            #ifndef ___dbg
            if(fopen(argv[1], "r+b") == NULL)
            #endif
            #ifdef ___dbg
            if(fopen("test.exe", "r+b") == NULL)
            #endif
            {
                perror("Error opening file: ");
                fflush(stdin);
                argc -= 1;
            }
            else
            {
                //To be filled soon
            }
        }
    
        return 0;
    }
    

    Das hier ist mein Code. Wenn ich beim Aufrufen des Programms den Namen der zu öffnenden Datei übergebe funktioniert alles. Wenn ich allerdings keinen Dateinamen beim Aufruf übergebe, sondern ihn während der Laufzeit des Programms eingebe erhalte ich die Fehlermeldung "Error opening file: Too many arguments".

    Folglich ist vermutlich ein Fehler in meinem String-Einlese-Algorithmus. Allerdings kann ích keinen finden.

    edit durch SeppJ: Cpp-Tags korrigiert.



  • Was soll denn dein Programm machen?
    Öffnest du die gerade ausgeführte Datei nochmal mit fopen?
    (char*)malloc Cast ist komplett überflüssig.
    schreibender Zugriff auf argv[1] ist undefiniert (kann gültiger Speicherbereich sein oder auch nicht)
    fflush(stdin) ist undefiniert
    Lässt du das Programm nun mit oder ohne ___dbg laufen?
    ...



  • Wutz schrieb:

    Was soll denn dein Programm machen?

    Derzeit nur eine Datei öffnen. Den Code, der ausgeführt wird, sobald die Datei geöffnet ist füge ich hinzu sobald das funktioniert.

    Wutz schrieb:

    Öffnest du die gerade ausgeführte Datei nochmal mit fopen?

    Nein, es handelt sich um eine andere Datei.

    Wutz schrieb:

    schreibender Zugriff auf argv[1] ist undefiniert (kann gültiger Speicherbereich sein oder auch nicht)

    Wenn man es vorher mit mallco alloziiert sollte der Speicherbereich doch gültig sein?

    Wutz schrieb:

    fflush(stdin) ist undefiniert

    Wird aus dem Code entfernt, das war noch ein Überrest aus einer alten Version.

    Wutz schrieb:

    Lässt du das Programm nun mit oder ohne ___dbg laufen?

    Mit



  • Das newline-Zeichen wird ebenfalls in den String kopiert und muss deshalb vor dem Öffnen entfernt werden.

    int main()
    {
        char c[512];
        int len;
        fgets(c,512,stdin);
        len = strlen(c);
        if(!len)
            return 0;
        c[len-1]=0;
        // öffnen
        return 0;
    }
    

    Da du unter Windows arbeitest, kannst du mit folgendem Code auch sehr einfach feststellen, ob eine Datei existiert:

    typedef enum _FileInfo
    {
        FI_INVALID,
        FI_DIR,
        FI_FILE
    }FileInfo;
    
    FileInfo FileExists(const char* c)
    {
        WIN32_FIND_DATA data;
    	HANDLE hdl = FindFirstFile(c,&data);
    	if(hdl==INVALID_HANDLE_VALUE)
    		return(FI_INVALID);
    	FindClose(hdl);
        return ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)?FI_DIR:FI_FILE);
    }
    


  • THE_Error schrieb:

    Wutz schrieb:

    schreibender Zugriff auf argv[1] ist undefiniert (kann gültiger Speicherbereich sein oder auch nicht)

    Wenn man es vorher mit mallco alloziiert sollte der Speicherbereich doch gültig sein?

    Du hast Zeiger nicht verstanden. Du schreibst einen Verweis auf deinen neu allozierten Speicherbereich in einen undefinierten Speicherbereich. Das ist wie gesagt undefiniert. Warum schreibst du überhaupt in argv rum? Wo hast du das denn her? Hab ich lange nicht mehr gesehen. Obwohl argv auf beiden Ebenen nicht als const deklariert ist, würde ich es trotzdem nicht drauf ankommen lassen, nur um eine Variable zu sparen.


Anmelden zum Antworten