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

从文件中读取并检查文件结尾

从文件中读取并检查文件结尾

Go
PIPIONE 2023-05-15 14:56:34
我正在尝试在 Go 中执行以下任务;从文件中读取备份文件根据逐字符输出的文件覆盖和执行操作(例如,可能包括换行符或“b”)不幸的是,我卡在了第 3 步,希望获得有关“换行”字符(即“/n”)的帮助。我尝试使用filesText, err := ioutil.ReadFile(fileNameAndDirectory)但不幸的是,如果我在转换为字符串后尝试检查文件结尾,filesText我将无法检测到换行符(即如果文件文本为“/nhello/n”,则以下代码片段将不会打印字符串“匹配”filesText, err := ioutil.ReadFile(fileNameAndDirectory) if (string(filesText)[:2]) == "/n") {    fmt.Println("match")}).我可以做些什么来检测新行而无需手动逐行读取文件?例子:如果文件内容是“r/n3$/n;” 那么当我从左到右移动文件内容时,我应该能够执行 6 个预定义的操作(每个字符一个)。
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

我们只能猜测。你没有清楚地定义你的问题。请阐明您的具体问题或添加其他详细信息以准确突出您的需求。提供示例输入和输出。


Go 编程语言规范

在反斜杠之后,某些单字符转义表示特殊值:

\n   U+000A line feed or newline

这是一个猜测:

lines.go:

package main


import (

    "fmt"

    "io/ioutil"

    "os"

    "strings"

)


func lines(data []byte) {

    text := string(data)

    for i, j := 0, 0; j >= 0; i += j + 1 {

        var line string

        j = strings.IndexByte(text[i:], '\n')

        if j < 0 {

            line = text[i:]

            if len(line) == 0 {

                continue

            }

        } else {

            line = text[i : i+j+1]

        }

        // process line

        fmt.Printf("%d %q\n", len(line), line)

    }

}


func main() {

    filename := `test.file`

    data, err := ioutil.ReadFile(filename)

    if err != nil {

        fmt.Fprintln(os.Stderr, err)

        return

    }

    fmt.Printf("%d %q\n", len(data), data)

    lines(data)

}

输出:


$ cat test.file

line1

line2

line3

$ go run lines.go

18 "line1\nline2\nline3\n"

6 "line1\n"

6 "line2\n"

6 "line3\n"

评论:


我会尝试通过一个例子来阐明它。假设我有一个内容为“ara/n;>$g9s”的文件,我的应用程序将在文件内容中移动时执行由该输入字符定义的操作。也就是说,如果“a”执行操作 1,“r”执行操作 2,“/n”执行操作 3 等等,那么上面的输入将按顺序执行以下操作 1,2,1,3...。但是,如果将字节数组转换为字符串,那么我将无法识别“/n”字符,因为尽管打印出来或将其连接到文件中时字符串的格式与以前相同,但它们似乎已被删除。– 埃利奥特史密斯


你为什么要写/n一个换行符!正如我已经指出的那样,换行符 U+000A 写为\n.


例如,


package main


import "fmt"


func es(s string) {

    for _, r := range s {

        switch r {

        case 'a':

            fmt.Printf("action 1 for %q\n", r)

        case 'r':

            fmt.Printf("action 2 for %q\n", r)

        case '\n':

            fmt.Printf("action 3 for %q\n", r)

        default:

            fmt.Printf("action ? for %q\n", r)

        }

    }

}


func main() {

    b := []byte("ara\n;>$g9s")

    s := string(b)

    es(s)

}

游乐场:https://play.golang.org/p/3J0pxXh3Wkc


输出:


action 1 for 'a'

action 2 for 'r'

action 1 for 'a'

action 3 for '\n'

action ? for ';'

action ? for '>'

action ? for '$'

action ? for 'g'

action ? for '9'

action ? for 's'

修改后的问题:


例子:如果文件内容是“r/n3$/n;” 那么当我从左到右移动文件内容时,我应该能够执行 6 个预定义的操作(每个字符一个)。埃利奥特·史密斯


你为什么要写/n一个换行符!正如我已经指出的那样,换行符 U+000A 写为\n.


例如,


package main


import "fmt"


func es(s string) {

    for _, r := range s {

        switch r {

        case 'a':

            fmt.Printf("action for %q\n", r)

        case 'r':

            fmt.Printf("action for %q\n", r)

        case '\n':

            fmt.Printf("action for %q\n", r)

        default:

            fmt.Printf("action for %q\n", r)

        }

    }

}


func main() {

    file := []byte("r\n3$\n;")

    s := string(file)

    es(s)

}

游乐场:https://play.golang.org/p/X1gtrPRmlqq


输出:


action for 'r'

action for '\n'

action for '3'

action for '$'

action for '\n'

action for ';'


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

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