Dateioperation unter Linux



  • Hallo, ich benötige für ein programm eine funktion, die "einfach" nur einen string in eine datei schreibt und genau hier liegt der knackpunkt ich habe schon einige möglichkeiten für dateioperationen ausprobiert, aber entweder stehen in der datei nur kryptische zeichen(was vermutlich an unicode lag) oder es wird irgend ein müll an den eigentlichen string rangehängt.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <time.h>
    #include <locale.h>
    using std::string; 
    
    string getTime(void) {
       time_t zeit;
       char *strzeit;//[255];
       struct tm *zeitinfo;
       /* damit die Datumsausgabe deutsch ist (Systemeinstellung) */
       setlocale(LC_ALL, "");
       /* aktuelle Kalenderzeit abrufen und speichern */
       time(&zeit);
       /* als lokale Zeit in Elemente der Struktur zerlegen */
       zeitinfo = localtime(&zeit);
       /* Zeichenkette generieren */
       strftime(strzeit, 255, "s%H", zeitinfo);
    
       return (string)strzeit;
    }
    
    int main(void) {
       FILE *datei;
       int fh;
       unsigned int actTime = static_cast<unsigned int>(std::time(NULL));
       int number;
       char data[6];
       char test[1024];// = "asdfghjklqwertzuioass";
    
       if((fh=creat("rcon.cfg",S_IREAD|S_IWRITE)) == -1) {
          printf("Fehler beim anlegen der Datei\n");
          return EXIT_FAILURE;
       }
       else {
          std::srand (actTime);
          number = (std::rand()) / 5000;
          //sprintf(data, "%d", number);
          //test = "rcon_password \"", data, "\"";
          strcpy(test,"rcon_password \"");
          strcat(test,data);
          strcat(test,"\"");
          if((write(fh,&test,sizeof(test))) == -1) {
             printf("Fehler beim schreiben des rCon\n");
             return EXIT_FAILURE;
          } else std::cout << number << " " << getTime()[1]  << "\n";
       }
       close(fh);
    
       return EXIT_SUCCESS;
    }
    

    und die ausgabe ist z.B.: rcon_password "" "@  p@Ô"@bt @ €@¼¿º¿  À¿º¿<‰@̉@ LÁº¿<Ê!@ ̉@ …ß @dÁº¿ú@ Ê!@(Áº¿Àº¿…ß @ Àº¿  „ß @ Àº¿(Áº¿Ì‰@Àº¿®Ö @ Ê!@„ß @ìo@ xÀº¿_} @‡§@ö3@ˆÀº¿ J¨@LX@Ó@˜@ ´@0@8h@3›
    ï@ìo@¸|@ ,Áº¿Ü~ @èÀº¿ðt@_} @m3@m3@ 4@¸@8S@{@ ´@@Ê@fRÀ%@ìo@¸|@ ŒÁº¿ ... usw.

    hat jemand ne idee was ich falsch mache?

    MfG Felix



  • ähem, geht auch mit Standard C++:

    #include <iostraem>
    #include <fstream>
    
    int main() {
      std::ofstream ofs("test.txt");
      if (!ofs)
        return 1;
    
      ofs<<"Hallo Welt.";
    
      ofs.close();
    
      return 0;
    };
    

    MfG

    GPC



  • Ja, sizeof liefert dir die Größe der Struktur in Byte, also 1024. Damit schreibt er 1024 Byte (egal was drinsteht). Versuch mal strlen (oder noch besser gleich std::string und std::fstream)



  • Ja, du hast vergessen, "data" zu initialisieren, d.h. dort steht nur Datenmüll drin. (und außerdem solltest du als Längenangabe für fwrite lieber "strlen(test) verwenden - hinter dem Stringende steht auch nur Datenmüll in deinem Array)



  • Das ging ja super schnell, vielen Dank! Ich werde das gleich mal ausprobieren.
    Das mit dem initialisieren klingt logisch 💡 , bin ich nicht drauf gekommen...

    MfG Felix


Log in to reply