首页 文章

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

提问于
浏览
2

我想在Go中做以下任务;

  • 从文件中读取

  • 备份文件

  • 基于逐个字符输出的文件(可能包括newLine字符或"b")覆盖并执行操作

不幸的是,我坚持第3步,希望得到一些"new line"字符的帮助(即"/n") . 我已经尝试使用 filesText, err := ioutil.ReadFile(fileNameAndDirectory) ,但不幸的是,如果我在将 filesText 转换为字符串后尝试检查文件结尾我无法检测新行字符(即如果文件文本是"/nhello/n"则以下代码片段将不会打印字符串"match"

filesText, err := ioutil.ReadFile(fileNameAndDirectory) 
if (string(filesText)[:2]) == "/n") {
    fmt.Println("match")
}

) .

有没有什么可以检测新行而无需手动逐行读取文件?

示例:如果文件内容为“r / n3 $ / n;”然后,当我从左到右移动文件内容时,我应该能够执行6个预定义的动作(每个角色一个) .

1 回答

  • 2

    我们只能猜测 . 您没有明确定义问题 . 请澄清您的具体问题或添加其他详细信息以突出您需要的内容 . 提供样本输入和输出 .


    Go编程语言规范反斜杠后,某些单字符转义表示特殊值:\ n U 000A换行或换行符


    这是一个猜测:

    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 ';'
    

相关问题