Output in Datei schreiben



  • Hallo liebe Leute,

    ich versuche seit Tagen den Output eines C Programms in eine Datei umzuleiten. Ich spreche einen Messverstärker per RS232-Schnittstelle (über USB-RS232 Konverter) über meinen Raspberry PI (Debian Wheezy) an und kriege es einfach nicht hin. Im Moment kriege ich mit meinem Programm genau das hin was ich brauche. Das Programm tut was es soll, jedoch erscheint der Output nur im Terminal. Kann mir jemand helfen und erklären, wie ich den Output in eine .txt oder .csv Datei speichern kann? Ich wäre sehr dankbar.

    #include <stdlib.h> 
    #include <string.h> 
    #include <stdio.h> 
    #include <unistd.h> 
    #include <fcntl.h> 
    #include <termios.h> 
    
    #define MODEM "/dev/ttyUSB0" 
    #define BAUDRATE B9600     
    
    int main(int argc,char** argv) 
    {    
        struct termios tio; 
        struct termios stdio; 
        struct termios old_stdio; 
        int tty_fd, flags; 
        unsigned char c='D'; 
        tcgetattr(STDOUT_FILENO,&old_stdio); 
        printf("Starte bitte %s /dev/ttyUSB0\n",argv[0]); 
        memset(&stdio,0,sizeof(stdio)); 
        stdio.c_iflag=0; 
        stdio.c_oflag=0; 
        stdio.c_cflag=0; 
        stdio.c_lflag=0; 
        stdio.c_cc[VMIN]=1; 
        stdio.c_cc[VTIME]=0; 
        tcsetattr(STDOUT_FILENO,TCSANOW,&stdio); 
        tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio); 
        fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       // make the reads non-blocking 
        memset(&tio,0,sizeof(tio)); 
        tio.c_iflag=0; 
        tio.c_oflag=0; 
        tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information 
        tio.c_lflag=0; 
        tio.c_cc[VMIN]=1; 
        tio.c_cc[VTIME]=5; 
        if((tty_fd = open(MODEM , O_RDWR | O_NONBLOCK)) == -1){ 
            printf("Error while opening\n"); // Just if you want user interface error control 
            return -1; 
        } 
        cfsetospeed(&tio,BAUDRATE);     
        cfsetispeed(&tio,BAUDRATE);            // baudrate is declarated above 
        tcsetattr(tty_fd,TCSANOW,&tio); 
        while (c!='q'){ 
            if (read(tty_fd,&c,1)>0){ 
                write(STDOUT_FILENO,&c,1); // if new data is available on the serial port, print it out 
                printf(""); 
            } 
            if (read(STDIN_FILENO,&c,1)>0){ 
                write(tty_fd,&c,1);//if new data is available on the console, send it to serial port 
                printf(""); 
            } 
        } 
        close(tty_fd); 
        tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio); 
        return EXIT_SUCCESS; 
    }
    

    Vielen Dank!!!


  • Mod

    Indem du write in eine Datei statt stdout schreiben lässt? Wo ist das Problem?



  • Du hast eine Busy-Loop programmiert. Schau Dir mal select(2) oder poll(2) an. Beide Aufrufe lassen sich dazu verwenden, um auf I/O events zu warten ohne die CPU zu blockieren.



  • du kanst z.B. einen fstream anlegen und diesen in eine Datei umlenken.
    Das ganze sähe da ca so aus.

    Die benötigtne includes:

    #include <ftream>
    

    Der Code:

    std::fstream daten;
    std::string logfile; //ein string mit der bezeichnung des Files
    

    Öffnen der Datei:
    daten.open(dateiname,mode);

    daten.open("test.txt", ios::out);
    //oder bei mehreren modi
    daten.open(logfile, ios::out|ios::in|ios::app)
    

    Für mode must du angeben was mit der Datei gemacht werden soll. Z.B.
    ios::out - file zum beschreiben öffen
    ios::in - file zum lesen öffnen
    ios::trunc - file beim öffnen leeren
    ios::app - neue Daten hinten anhängen
    Es gibt noch weitere modi da must du dir dann einfach mal anschauen was du so brauchst.
    Danach kanst du ganz wie gewohnt wie bei cout mittels << und >> sachen in oder aus der Datei leesen.
    Zum Schreiben:

    daten << "dies ist eine Test ausgabe." << 1976 << endl;
    

    Generell ist noch wichtig das man immer noch prüfen muss ob alle operationen erfolgreichwahren etc.

    Das ist jetz nur ein sehr zusammengekürtztes Beispeil. Daher kann ich dir nur empfehlen dir ein entsprechendes tutorial zu gemüte zu führen. wie das hier:
    http://www.willemer.de/informatik/cpp/fileop.htm

    MfG BabCom

    Edit Hatte bei der bezeichnung der Dateinamen die "" vergessen.


Anmelden zum Antworten