373 Stimmen

Wie man mit Go von/auf eine Datei liest/schreibt

Ich habe versucht, Go auf eigene Faust zu lernen, aber ich war ratlos, als ich versuchte, von normalen Dateien zu lesen und in sie zu schreiben.

Ich kann so weit kommen wie inFile, _ := os.Open(INFILE, 0, 0) aber es macht keinen Sinn, den Inhalt der Datei abzurufen, denn die Lesefunktion benötigt eine []byte als Parameter.

func (file *File) Read(b []byte) (n int, err Error)

10voto

peterSO Punkte 146133

[]byte ist ein Teilstück (ähnlich einer Teilzeichenkette) eines ganzen oder eines Teils eines Byte-Arrays. Stellen Sie sich das Slice als eine Wertstruktur mit einem versteckten Zeigerfeld vor, mit dem das System das gesamte Array oder einen Teil davon (das Slice) lokalisieren und darauf zugreifen kann, sowie mit Feldern für die Länge und die Kapazität des Slice, auf die Sie mit der len() y cap() Funktionen.

Hier ist ein funktionierendes Starterkit für Sie, das eine Binärdatei liest und ausgibt; Sie müssen die inName Literalwert, um auf eine kleine Datei auf Ihrem System zu verweisen.

package main
import (
    "fmt";
    "os";
)
func main()
{
    inName := "file-rw.bin";
    inPerm :=  0666;
    inFile, inErr := os.Open(inName, os.O_RDONLY, inPerm);
    if inErr == nil {
        inBufLen := 16;
        inBuf := make([]byte, inBufLen);
        n, inErr := inFile.Read(inBuf);
        for inErr == nil {
            fmt.Println(n, inBuf[0:n]);
            n, inErr = inFile.Read(inBuf);
        }
    }
    inErr = inFile.Close();
}

8voto

marketer Punkte 37017

Versuchen Sie dies:

package main

import (
  "io"; 
  )

func main() {
  contents,_ := io.ReadFile("filename");
  println(string(contents));
  io.WriteFile("filename", contents, 0644);
}

5voto

A. Bernstein Punkte 31

Können Sie die fmt Paket auch:

package main

import "fmt"

func main(){
    file, err := os.Create("demo.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    fmt.Fprint(file, name)
}

1voto

Hannes Ovrén Punkte 20019

Wenn man sich die Dokumentation ansieht, scheint es, dass man einfach einen Puffer vom Typ []byte deklarieren und ihn an read übergeben sollte, der dann so viele Zeichen liest und die Anzahl der tatsächlich gelesenen Zeichen (und einen Fehler) zurückgibt.

Die Dokumente sagen

Read liest bis zu len(b) Bytes aus der Datei. Es gibt die Anzahl der gelesenen Bytes und einen Fehler zurück, falls vorhanden. EOF wird durch eine Nullzählung signalisiert, wobei err auf EOF gesetzt wird.

Funktioniert das nicht?

EDIT: Außerdem denke ich, dass Sie vielleicht die Reader/Writer-Schnittstellen verwenden sollten, die in der bufio Paket zu verwenden, anstatt os Paket.

1voto

Jeremy Wall Punkte 21945

Die Read-Methode nimmt einen Byte-Parameter an, da dies der Puffer ist, in den sie liest. Es ist eine übliche Idiom in einigen Kreisen und macht durchaus Sinn, wenn man darüber nachdenkt.

Auf diese Weise können Sie bestimmen, wie viele Bytes vom Lesegerät gelesen werden, und die Rückgabe überprüfen, um festzustellen, wie viele Bytes tatsächlich gelesen wurden, und eventuelle Fehler entsprechend behandeln.

Wie andere in ihren Antworten schon gesagt haben, ist bufio wahrscheinlich das, was Sie für das Lesen der meisten Dateien brauchen.

Ich füge noch einen weiteren Hinweis hinzu, da er wirklich nützlich ist. Das Lesen einer Zeile aus einer Datei wird am besten nicht mit der Methode ReadLine, sondern mit der Methode ReadBytes oder ReadString durchgeführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X