2014-01-16 39 views
0

我正在寫一個c程序,它建立了Raspberry PI(Debian Wheezy)和調制解調器之間的串行通信。該程序工作到目前爲止,但我希望輸出也被重定向到一個.txt或.csv文件。將輸出重定向到linux中的文件

#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; 
} 

希望有一個誰可以幫我

回答

1

爲什麼不這樣做你的程序的那個之外?

下面將你的程序的(STD)輸出寫入到文件foo.txt

./myprogram > foo.txt 

,如果你也想看到的輸出,它管道tee(這會寫它的標準輸入到標準輸出文件)

./myprogram | tee foo.txt 

,如果你有絕對的把握要做到這一切,從你的程序中,你可能想編寫自己的write函數的n,它寫入stdout和一個文件。

ssize_t mywrite(int fd, const void *buf, size_t count) { 
    write(fd, buf, count); 
    return write(STDOUT_FILENO, buf, count); 
} 

,然後使用它,而不是write(請注意,應傳遞一個打開的文件的文件描述符,以mywrite;它將寫入stdout)

0

爲什麼你不現在還不清楚」 t只需open()一個新的路徑,而不是寫入標準輸出,而不是write()。如果這不是一個選項(它似乎是一個選項,在您的示例代碼中是最好的選項),您可以使用此僞代碼執行運行時重定向。

#include <unistd.h> 

// first open the new output path 
int new_out = open("/path/to/output", flags_as_needed); 

// next, move the standard output path 
int save_out = dup(STDOUT_FILENO); 
close(STDOUT_FILENO); 

// now copy the new output path to the standard output position 
dup2(STDOUT_FILENO, new_out); 
+0

我已經試過這一點,但它似乎沒有工作。我應該在代碼中插入這個?我很抱歉,但我是編程新手,也許你可以幫助我。新文件被創建,但不會將輸出寫入文件。 – user3147177

+0

由於傳遞給'open()'(_flags_as_needed)的標誌不包括寫入,因此您正在執行此後續失敗。例如,這組標誌將起作用(只要您選擇的路徑沒有其他問題):'O_CREAT | O_WRONLY,S_IRUSR | S_IWUSR' – mah

0

只是打開一個文件,並使用它的文件描述符:

#include <unistd.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdlib.h> 

int main() 
{ 
    char block[1024]; //buffer of data 
    int out; //file deccriptor 
    int nread; //size of data 
    out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); 
    write(out,block,nread); 
    exit(0); 
}