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!!!
-
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.htmMfG BabCom
Edit Hatte bei der bezeichnung der Dateinamen die "" vergessen.