[英]How to redirect the output of a c program to a file?
我試圖將ac程序的輸出重定向到文件,即使它由於輸入數據的問題而產生一些錯誤。 我可以將輸出但錯誤消息發送到文件。
有人知道怎么做嗎?
在C源代碼中,您可以使用freopen()
重定向輸出:
一般產出:
freopen("myfile.txt", "w", stdout);
錯誤:
freopen("myfile_err.txt", "w", stderr);
(這個答案適用於bash shell和類似的風格。你沒有指定你的環境,這類問題需要這個細節。)
我假設你知道“>”的基本重定向。 除了STDOUT之外,還要捕獲STDERR,請使用以下語法:
command > file-name 2>&1
有關標准流和數字的更多背景知識:
http://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29
這取決於您的意思以及您正在使用的平台。 通常,您可以從命令行完成此操作,這已在另一個答案中介紹。 如果您使用此方法來完成此操作,您應該知道FILE * stderr
通常是立即寫入的(無緩沖的),而FILE * stdout
可能是緩沖的(通常是行緩沖的),因此您最終可能會看到一些錯誤消息早於其他一些消息打印,但實際上其他消息只是打印得很晚。
在C程序中你也可以使用freopen
在stdio系統中做類似的事情,這會影響FILE *
,所以你可以制作fprintf(stderr, "fungus");
打印到stderr通常會打印到的東西。
但是,如果您想知道如何使程序在類似unix的系統下重定向實際文件描述符,則需要了解dup
和dup2
系統調用。 它們允許您復制文件描述符。
int fd = open("some_file", O_WRONLY);
dup2(2,fd);
close(fd);
此代碼將使“some_file”成為OS級別的新stderr。 dup2調用將關閉並替換文件描述符2(stderr,它通常由FILE * stderr
使用,但如果調用freopen(x,y,stderr)
則不一定freopen(x,y,stderr)
因為這可能使FILE *stderr
使用不同的文件描述符)。
這就是shell程序重定向程序輸入和輸出的方式。 打開新程序需要的所有文件, fork
,然后子dup2
使用dup2
為新程序設置文件描述符,然后關閉新程序不需要的任何文件(通常只留0, 1,和2打開),然后使用其中一個exec函數成為shell被告知運行的程序。 (其中一些並不完全准確,因為有些shell可能依賴於關閉exe標志)
使用簡單的linux命令,您可以將輸出保存到文件中。 這是一個簡單的linux終端命令。
ls > file.txt
該命令的輸出將存儲到文件中。
就像你可以存儲程序的輸出一樣,假設,對象文件名是a,運行以下命令將輸出保存在文件中:
./a > file.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.