Как захватить вывод и отправить его в файл - PullRequest
0 голосов
/ 09 января 2019

У меня есть программа, которая выполняет некоторую обработку, и я хотел бы дать возможность сохранить выходные данные в файл, однако я не могу найти лучший способ сделать это.

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 голосов
/ 09 января 2019

Поскольку 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)

В качестве отступления, (только к вашему сведению) Если вы запускаете свой собственный процесс, вы можете просто перенаправить вывод в файл оболочки

$ your_program -some-flags > output.txt
0 голосов
/ 09 января 2019

Почему вы меняете 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), вы предоставили ему копию io.Writer STDOUT - замена os.Stdout позже в вашем приложении не отменяет этого.

Чтобы выполнить то, что вы хотите, вам потребуется другой писатель, который может знать об этом изменении, как оно может произойти, если это необходимо (см. Первый ответ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...