string <-> char?



  • Hallo,

    char c;
    char save[100000];
    
    FILE *fp;
    	fp = fopen(path, "r");
    
    	if (fp == NULL)
    	{
    		// Datei kann nicht geöffnet werden
    		printf("Can't open file: ");
    		printf("%s", path);
    		printf(" -> Insufficient rights?\n\n");
    		//fp = fopen(".", "r"); ODER:
    		return;
    	}
    
    	while ((c = fgetc(fp)) != EOF)
    	{
    		strcat (save, c);
    		// Now we scan the file
    
    	}
    

    Ich bekomm n Seg Fault bei dem strcat() wie muss ich die save Variable sonst wählen?

    LG



  • Du musst den strcat einen pointer uebergeben, nicht char c selbst. Aendere

    char c ;
    char save[10000]
    strcat(save, c) ;
    

    zu

    strcat(save, &c) ;
    

    siehe auch, fuer mehr info, die man page von strcat.

    Gruss,



  • Zeichenweise einzulesen ist keine gute Idee, da langsam! Und fgetc liefert bewußt einen int und keinen char zurück, weil EOF ein int und kein char sein muss!

    enum { LENGTH = 100000 };
      char save[LENGTH];
    
      // ...  
    
      size_t off = 0;
      while(fgets(save + off, LENGTH - off, fp)) {
        off = strlen(save);
        if(off >= LENGTH) {
          fprintf(stderr, "Datei zu groß\n");
          return;
        }
      }
    

    Schalte am besten auch die Warnungen beim GCC ein (einfach -Wall -W als Flag übergeben. Am besten noch -Wall -W -pedantic -std=c99)

    P.S. Wenn du eine Unix/Linux spezifische Lösung suchst, um eine ganze Datei auf einmal einzulesen, dann solltest du dir man: mmap(2) anschauen.

    @jsbach
    strcat erwartet vor allem einen String => Ein char-array _mit_ einer 0-Terminierung! Daher ist deine Lösung unbrauchbar.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Okay,

    Danke das Script läuft nun, doch noch ein kleines Problem:

    char line2[1000];
    char *dir [1000];
    int j = 0;
    
    char* read_extern (char *path)
    {
    FILE* f = fopen(path, "r");
    
    if (f == 0)
    {
    return 0;
    }
    
    while (fgets(line2, 1000, f))
    {
    strcpy (dir[j], line2);
    ++j;
    }
    }
    
    main ()
    read_extern("/tmp/file");
    

    Ich bekomm bei strcpy() n seg fault!
    line2 liefert mir jedoch nur Werte die maximal eine Länge von 12 Chars haben.

    LG



  • Warum nimmst du nicht den Code von mir, anstelle selbst wieder einen falschen Code zu erzeugen?

    Schau: dir besteht aus 1000 char Zeigern, die _nicht_ initialisiert sind: Sprich die zeigen irgend wo hin => strcpy schreibt einfach irgend wo in den Speicher. Wunderst du dich da wirklich, dass du einen Segfault bekommst?


Anmelden zum Antworten