Go 读取文件并检查文件结尾

Go 读取文件并检查文件结尾,go,Go,我尝试在围棋中完成以下任务 从文件中读取 备份文件 覆盖并基于逐个字符输出的文件执行操作(例如,可能包括换行符或“b”) 不幸的是,我仍停留在第3步,希望得到一些关于“新行”字符(即“/n”)的帮助。我曾尝试使用filetext,err:=ioutil.ReadFile(fileNameAndDirectory)但不幸的是,如果在将filetext转换为字符串后尝试检查文件结尾,我无法检测到新行字符(即,如果文件文本为“/nhello/n”,则以下代码段将不会打印字符串“匹配” ) 我可以做些什

我尝试在围棋中完成以下任务

  • 从文件中读取
  • 备份文件
  • 覆盖并基于逐个字符输出的文件执行操作(例如,可能包括换行符或“b”)
  • 不幸的是,我仍停留在第3步,希望得到一些关于“新行”字符(即“/n”)的帮助。我曾尝试使用
    filetext,err:=ioutil.ReadFile(fileNameAndDirectory)
    但不幸的是,如果在将
    filetext
    转换为字符串后尝试检查文件结尾,我无法检测到新行字符(即,如果文件文本为“/nhello/n”,则以下代码段将不会打印字符串“匹配”

    )

    我可以做些什么来检测新行,而不必手动逐行读取文件

    例如:
    如果文件内容是“r/n3$/n;”,那么当我在文件内容上从左向右移动时,我应该能够执行6个预定义操作(每个字符一个)。

    我们只能猜测。你没有清楚地定义你的问题。请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。提供示例输入和输出


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

    \n   U+000A line feed or newline
    

    这里有一个猜测:

    行。转到

    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)
    }
    

    评论:


    我将尝试通过一个例子来阐明这一点。假设我有一个文件 使用内容“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)
    }
    
    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)
    }
    
    游乐场:

    输出:

    $ cat test.file
    line1
    line2
    line3
    $ go run lines.go
    18 "line1\nline2\nline3\n"
    6 "line1\n"
    6 "line2\n"
    6 "line3\n"
    
    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'
    
    action for 'r'
    action for '\n'
    action for '3'
    action for '$'
    action for '\n'
    action for ';'
    

    修订问题:

    示例:如果文件内容为“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 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)
    }
    
    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)
    }
    
    游乐场:

    输出:

    $ cat test.file
    line1
    line2
    line3
    $ go run lines.go
    18 "line1\nline2\nline3\n"
    6 "line1\n"
    6 "line2\n"
    6 "line3\n"
    
    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'
    
    action for 'r'
    action for '\n'
    action for '3'
    action for '$'
    action for '\n'
    action for ';'
    

    不确定您到底在问什么,但是strings包有各种各样的func,它们的名称中有“Index”,可以找到诸如newline之类的内容。如果数据是[]字节的形式,那么字节包会做一些类似的事情。我将尝试通过一个示例来澄清它。假设我有一个内容为“ara/n;>$g9s”的文件,我的应用程序将在文件内容中移动时执行由该输入字符定义的操作。即,如果“a”执行动作1,“r”执行动作2,/n”执行动作3等,则上述输入将执行以下动作1、2、1、3。。。按这个顺序。但是,如果您将字节数组转换为字符串,则我无法识别“/n”字符,因为如果您将其打印出来或压缩到文件中,尽管字符串的格式与以前相同,但它们似乎已被删除。对于之前不清楚,我深表歉意,希望我的更新能使其更清楚。是否可以在不搜索整个字符串以查找新行字符的情况下执行上述操作?