Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 首次写入后,写入终止符字符(即ox1e)失败_Go - Fatal编程技术网

Go 首次写入后,写入终止符字符(即ox1e)失败

Go 首次写入后,写入终止符字符(即ox1e)失败,go,Go,我有一些数据(实际上是MARC记录),我正试图使用go(1.9.2版)创建这些数据,但我不知道如何将定界字符写入输出文件 下面的片段是我能想到的最接近的例子。第一项使用适当的终止符写入,但之后没有其他内容 在围棋中写这类终止符的最佳/正确方法是什么 const fieldTerminator = 0x1e func main() { data := []string{"item one", "item two", "item tre"} writer, err := os.C

我有一些数据(实际上是MARC记录),我正试图使用go(1.9.2版)创建这些数据,但我不知道如何将定界字符写入输出文件

下面的片段是我能想到的最接近的例子。第一项使用适当的终止符写入,但之后没有其他内容

在围棋中写这类终止符的最佳/正确方法是什么

const fieldTerminator = 0x1e

func main() {
    data := []string{"item one", "item two", "item tre"}

    writer, err := os.Create("x.out")
    if err != nil {
        log.Fatalf("Could not open file: %q\n", err)
    }
    defer writer.Close() // per biosckon

    ft := make([]byte, 2)
    binary.LittleEndian.PutUint16(ft, uint16(fieldTerminator))

    for _, d := range data {
        // this just proves to me that the loop is working
        //os.Stderr.WriteString(fmt.Sprintf("d is %q\n", d))
        fmt.Fprintf(os.Stderr, "d is %q\n", d) // per Andy Schweig

        _, err := writer.Write([]byte(d))
        if err != nil {
            log.Fatalf("%q\n", err)
        }

        // This prints the correct character at the end of the first item
        // and nothing after that (items 2 and 3 not printed, no errors):
        _, err = writer.Write(ft)
        if err != nil {
            log.Fatalf("%q\n", err)
        }
    }
}

编辑:更新了代码片段,以解决Andy Schweig和biosckon的建议。

问题在于binary.LittleEndian.PutUint16的使用方式

字段终止符需要一个字节。PutUint16的结果是两个字节,即终止符字节和空字节(如果将
ft
定义为一个字节且没有PutUint8,则PutUint16不起作用)。因此,修复方法是在删除空字节后截断
ft

按要求进行以下工作:

const fieldTerminator = 0x1e

func main() {
    data := []string{"item one", "item two", "item tre"}

    writer, err := os.Create("x.out")
    if err != nil {
        log.Fatalf("Could not open file: %q\n", err)
    }
    defer writer.Close()

    ft := make([]byte, 2)
    binary.LittleEndian.PutUint16(ft, uint16(fieldTerminator))
    ft = ft[:1] // Truncate ft to a single byte

    for _, d := range data {
        _, err := writer.Write([]byte(d))
        if err != nil {
            log.Fatalf("%q\n", err)
        }

        _, err = writer.Write(ft)
        if err != nil {
            log.Fatalf("%q\n", err)
        }
    }
}

它对我有用。你确定那些字节不在文件中吗?@andy schweig Gah
hextumpx.out
确实显示了它们(但我的“可靠”编辑器没有显示)。所以,作为新手,我的方法被认为是做这种事情的正确方法吗?是的,我觉得还可以。那个
os.Stderr.WriteString
调用最好写成
fmt.Fprintf(os.Stderr,“d是%q\n”,d)
@andy schweig谢谢。要学的东西太多了。奇怪的是,事情没有正确显示,但这是一个不同的问题a.t.m.@gsiems和
延迟writer.Close()
就在
Create()
和if检查之后