为了账号安全,请及时绑定邮箱和手机立即绑定

字节数组转换为字符串

字节数组转换为字符串

Go
MYYA 2022-06-01 15:49:26
我的意图是读取文本文件,并在控制台上打印记录。示例文本文件格式美国广播公司 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名字:你好姓氏:世界
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

拆分名字和姓氏后,值中有一些额外的空格,所以我添加了字符串。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[:]))

    }


}

刚刚发现多余的空格是回车符"\r",如果您使用的是 Windows 平台,您应该使用下面的行来用换行符分割文本


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


查看完整回答
反对 回复 2022-06-01
?
森栏

TA贡献1810条经验 获得超5个赞

使用此代码:


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[:])

}

这通过使用 []byte 而不是 string 来简化代码,并处理 line 只有一个标记的情况。


GoLang PlayGround 上的工作示例:https: //play.golang.org/p/JFcM1uE3Ywm


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信