猿问

字节数组转换为字符串

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


美国广播公司 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

名字:你好姓氏:世界


MYYA
浏览 195回答 2
2回答

慕尼黑8549860

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

森栏

使用此代码:readFile, err := ioutil.ReadFile(fname)if err != nil {&nbsp; &nbsp; panic(err)}fileTextLines := bytes.Split(readFile, []byte("\n"))sli := make([]person, 0, len(fileTextLines))for _, eachline := range fileTextLines {&nbsp; &nbsp; res1 := bytes.Split(eachline, []byte(" "))&nbsp; &nbsp; if len(res1) < 2 {&nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; }&nbsp; &nbsp; var p person&nbsp; &nbsp; copy(p.fName[:], res1[0])&nbsp; &nbsp; copy(p.lName[:], res1[1])&nbsp; &nbsp; sli = append(sli, p)}for _, object := range sli {&nbsp; &nbsp; fmt.Printf("First Name: %s Last Name: %s\n", object.fName[:], object.lName[:])}这通过使用 []byte 而不是 string 来简化代码,并处理 line 只有一个标记的情况。GoLang PlayGround 上的工作示例:https: //play.golang.org/p/JFcM1uE3Ywm
随时随地看视频慕课网APP

相关分类

Go
我要回答