簡體   English   中英

如何將ac程序的輸出重定向到文件?

[英]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的系統下重定向實際文件描述符,則需要了解dupdup2系統調用。 它們允許您復制文件描述符。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM