如何捕获输出并将其发送到文件

时间:2019-01-09 02:14:33

标签: go

我有一个进行一些处理的程序,我想提供将输出保存到文件的选项,但是,我找不到最佳的方法。

if (strings.ToLower(input2) == "y") || (strings.ToLower(input2) == "yes") {
    fmt.Println("\nOutputting to file, please wait... ")
    oldSt := os.Stdout //Create backup of old Stdout
    newFil, _ := os.Create(input+"txt")

    os.Stdout = newFil
    table.Render()

    os.Stdout = oldSt
    fmt.Println("\nComplete!")
}

这是我当前的代码,但似乎只是在打印到控制台而不重定向到文件。

我正在使用此程序包创建一个表,这正是我要输出到文件的表。

https://github.com/olekukonko/tablewriter

是否有更好的输出到文件的方法,或者因为我正在调用库函数,这将是另一种编写方法?

2 个答案:

答案 0 :(得分:2)

为什么要将os.Stdout更改为图书馆的文件?您正在使用的tablewriter软件包似乎接受了您希望使用的io.Writer

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/olekukonko/tablewriter"
)

func main() {
    fmt.Println("Outputting to file, please wait...")
    f, err := os.Create("mahfile.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    table := tablewriter.NewWriter(f)
    table.Render()
}

https://play.golang.org/p/4L5Qu2SA4Uy

很显然,您可能需要以不同的顺序声明事物,但是我不建议您更改os.Stdout的预期功能来实现您的目标。他们只是将其用作占位符供您覆盖。


但是,要回答您的问题:初始化tablewriter.NewWriter(os.Stdout)时,向它提供了STDOUT的io.Writer的副本-稍后在应用程序中替换os.Stdout不会撤消此操作。

要完成您想要的工作,您将需要提供其他作家,如果需要的话,它可以在可能发生这种变化时意识到这一变化(请参阅第一个答案)

答案 1 :(得分:1)

由于tablewriter.NewWriter将输出文件作为参数

tablewriter.NewWriter(os.Stdout)

os.Stdout本身只是一个*File,您可以将另一个文件传递给NewWriter。

var outputFile = os.Stdout

if userWantsToOutputToFile {
    var userFile, fileErr = os.Create(desiredOutputFilename)
    if fileErr != nil {
        outputFile = userFile
    }
}

// do your initialization

// then
tablewriter.NewWriter(outputFile)

顺便说一句,(仅供参考)如果您正在运行自己的进程,则只需将输出重定向到Shell上的文件

$ your_program -some-flags > output.txt