Объединить два текстовых файла в Golang - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь объединить два текстовых файла путем объединения fileACopy.txt в tmp1.txt. Ошибка, которую я получаю при попытке сделать это:

Cannot use 'fileACopy' (type *File) as type []byte"

В обоих текстовых файлах есть несколько строк строк, и я хочу сохранить разрывы строк. Я импортировал io, log и os.

Как нужно изменить мой код или какой код использовать?

// Append fileACopy.txt to tmp1.txt
    fileACopy, err := os.Open("./fileACopy.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer fileACopy.Close()

    append, err := os.OpenFile("tmp1.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer append.Close()

    if _, err := append.Write(fileACopy); err != nil {
        log.Fatal(err)
    }

    err := os.Remove("fileACopy.txt")
    if err != nil {
        log.Fatal(err)
    }

1 Ответ

3 голосов
/ 02 февраля 2020

Рассмотрим определения Открыть и Запись :

func Open(name string) (*File, error)
func (f *File) Write(b []byte) (n int, err error)

Итак, строка:

fileACopy, err := os.Open("./fileACopy.txt")

Дает вам fileACopy (a *File), а затем вы передаете это в качестве аргумента append.Write(fileACopy). В соответствии с приведенными выше определениями append.Write занимает []byte, и вы пытаетесь передать ему что-то другое (fileACopy, *File), поэтому возникает ошибка «Невозможно использовать« fileACopy »(тип * File) в качестве типа [] byte ".

Простейший способ добиться того, чего вы хотите, - это, вероятно, использовать io.Copy :

Copy(dst Writer, src Reader) (written int64, err error)

В вашем случае io.Copy(append, fileACopy) должен добиться цели , Менее эффективная альтернатива - читать содержимое файла, используя ioutil.ReadAll (среди других опций), что даст вам []byte, который вы затем можете передать append.Write (это может не сработать) а также потому, что весь файл читается в память, а затем записывается).

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