Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 字节数组到字符串的转换_Go - Fatal编程技术网

Go 字节数组到字符串的转换

Go 字节数组到字符串的转换,go,Go,我的目的是读取一个文本文件,并在控制台上打印记录。示例文本文件格式 abc 123 测试zzz 你好,世界 我正在使用字节数组初始化我的结构。 但是,当我尝试在拆分读取行后打印时,会为拆分后获得的第二个令牌打印空白值 package main import ( "fmt" "bufio" "os" "strings" "io/ioutil" ) type person struct { fName [20]byte lName [20]byte } func mai

我的目的是读取一个文本文件,并在控制台上打印记录。示例文本文件格式

abc 123

测试zzz

你好,世界

我正在使用字节数组初始化我的结构。 但是,当我尝试在拆分读取行后打印时,会为拆分后获得的第二个令牌打印空白值

  package main 


import (
"fmt"
"bufio"
"os"
"strings"
"io/ioutil"
)

type person struct {
    fName [20]byte
    lName [20]byte
}

func main(){

reader := bufio.NewReader(os.Stdin)

fmt.Printf("Enter Name ")
fname, _ := reader.ReadString('\n')
fname = strings.Replace(fname, "\n", "", -1)
fname = strings.Replace(fname, "\r", "", -1)

readFile, err := ioutil.ReadFile(fname)
 if err != nil {
        panic(err)
    }

s := string(readFile)
fileTextLines := strings.Split(s, "\n")



sli := make([]person, len(fileTextLines))
    for _, eachline := range fileTextLines {
        res1 := strings.Split( eachline, " ")

        var fname [20]byte  

        copy( fname[:], []byte(res1[0] ))
        fmt.Println(string(fname[:]))


        var lname [20]byte  
        copy( lname[:], []byte(res1[1] ) )
        fmt.Println(string(lname[:]))

        p := person{fname ,lname}
        sli = append(sli,p)
    }

// print the slice 

//   for _,object  := range sli {
//       fmt.Printf("First Name: %s Last Name: %s\n", string(object.fName[:]), string(object.lName[:]))
//    }

}
使用建议的方法,我得到了以下输出

                             Last Name: 123
                             Last Name: zzz
名字:hello姓氏:world

使用以下代码:

readFile, err := ioutil.ReadFile(fname)
if err != nil {
    panic(err)
}

fileTextLines := bytes.Split(readFile, []byte("\n"))

sli := make([]person, 0, len(fileTextLines))
for _, eachline := range fileTextLines {
    res1 := bytes.Split(eachline, []byte(" "))
    if len(res1) < 2 {
        continue
    }
    var p person
    copy(p.fName[:], res1[0])
    copy(p.lName[:], res1[1])
    sli = append(sli, p)
}

for _, object := range sli {
    fmt.Printf("First Name: %s Last Name: %s\n", object.fName[:], object.lName[:])
}
readFile,err:=ioutil.readFile(fname)
如果出错!=零{
恐慌(错误)
}
fileTextLines:=字节.Split(readFile,[]字节(“\n”))
sli:=make([]个人,0,len(文件文本行))
对于_,eachline:=范围文件文本行{
res1:=bytes.Split(每条线,[]字节(“”)
如果len(res1)<2{
持续
}
var p人员
副本(p.fName[:],res1[0])
副本(p.lName[:],res1[1])
sli=附加(sli,p)
}
对于u,对象:=范围sli{
fmt.Printf(“名字:%s姓氏:%s\n”,object.fName[:],object.lName[:])
}
这通过使用[]字节而不是字符串来简化代码,并处理行只有一个标记的情况


GoLang游乐场上的工作示例:

一旦您分割了名字和姓氏,值中就有一些额外的空格,因此我添加了字符串。TrimSpace和下面的代码现在正在工作,而且您不需要使用固定长度初始化sli,追加将自动增加切片的大小

package main 

import (
"fmt"
"bufio"
"os"
"strings"
"io/ioutil"
)

type person struct {
    fName [20]byte
    lName [20]byte
}

func main(){

reader := bufio.NewReader(os.Stdin)

fmt.Printf("Enter Name ")
fname, _ := reader.ReadString('\n')
fname = strings.Replace(fname, "\n", "", -1)
fname = strings.Replace(fname, "\r", "", -1)

readFile, err := ioutil.ReadFile(fname)
 if err != nil {
        panic(err)
    }

s := string(readFile)
fileTextLines := strings.Split(s, "\n")



sli := []person{}
    for _, eachline := range fileTextLines {
        res1 := strings.Split( eachline, " ")

        var fname [20]byte  

        copy( fname[:], []byte(strings.TrimSpace(res1[0])))
        fmt.Println(string(fname[:]))


        var lname [20]byte  
        copy( lname[:], []byte(strings.TrimSpace(res1[1])) )
        fmt.Println(string(lname[:]))

        p := person{fname ,lname}
        sli = append(sli,p)
    }

// print the slice 

   for _,object  := range sli {
       fmt.Printf("First Name: %s Last Name: %s\n", string(object.fName[:]), string(object.lName[:]))
    }

}
刚刚发现额外的with space是回车符“\r”,如果您使用的是windows平台,您应该使用下面的行来拆分带有换行符的文本

strings.Split(strings.Replace(windows, "\r\n", "\n", -1), "\n")

thks用于帮助。虽然您的代码使用字节创建的输入文件,但当存在文本输入文件且输出失真时,问题就会出现……如果用户提供txt文件,它是否有效?您可以添加您需要的输出吗got@Eklavya我发布了我的输出