Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 防止ReadFile或ReadAll读取EOF_Go_Readfile - Fatal编程技术网

Go 防止ReadFile或ReadAll读取EOF

Go 防止ReadFile或ReadAll读取EOF,go,readfile,Go,Readfile,我开始学习Go,我对它在使用函数时包含EOF的事实有点困惑。例如,我希望读取一个文件并在字段分隔符上解析其所有行 示例输入文件: CZG;KCZG;some text EKY;KEKY;some text A50;KA50;some text UKY;UCFL;some text MIC;KMIC;some text K2M;K23M;some text 以下是我读取和解析该文件的步骤: import( "fmt" "log" "io/ioutil" "stri

我开始学习Go,我对它在使用函数时包含EOF的事实有点困惑。例如,我希望读取一个文件并在字段分隔符上解析其所有行

示例输入文件:

CZG;KCZG;some text
EKY;KEKY;some text
A50;KA50;some text
UKY;UCFL;some text
MIC;KMIC;some text
K2M;K23M;some text
以下是我读取和解析该文件的步骤:

import(
    "fmt"
    "log"
    "io/ioutil"
    "strings"
    )

func main() {  
    /* Read file */
    airportsFile := "/path/to/file/ad_iata"
    content, err := ioutil.ReadFile(airportsFile)
    if err != nil {
        log.Fatal(err)
    }

    /* split content on EOL */
    lines := strings.Split(string(content), "\n")

    /* split line on field separator ; */
    for _, line := range lines {
        lineSplit := strings.Split(line, ";")
        fmt.Println(lineSplit)
    }
}
当函数看到无需解析的EOF时,它会在lineSplit切片的末尾添加一个空元素。因此,如果我想访问该切片lineSplit[1]的第二个索引,我会遇到一个恐慌:运行时错误:索引超出范围。我必须这样做来限制射程

/* split line on field separator ; */
lenLines := len(lines) -1
for _, line := range lines[:lenLines] {
    lineSplit := strings.Split(line, ";")
    fmt.Println(lineSplit[1])
}
如果我想继续使用ReadFile以保持其简洁性,有没有更好的方法


当使用没有EOF字节或EOF字符时,也会出现同样的问题。您看到的可能是由文件末尾的换行符“\n”引起的

要逐行读取文件,更惯用的方法是使用bufio.Scanner:


这实际上解决了您的问题,因为扫描器将在不开始新行的情况下读取最后的换行符,这一点可以从中得到证明。

没有EOF字节或EOF字符。您看到的可能是由文件末尾的换行符“\n”引起的

要逐行读取文件,更惯用的方法是使用bufio.Scanner:

这实际上解决了您的问题,因为扫描器将在不开始新行的情况下读取最后的换行符,这可以从中得到证明。

您可以使用它来检查文件读取的错误

// Err returns the first non-EOF error that was encountered by the Scanner.
func (s *Scanner) Err() error {
    if s.err == io.EOF {
        return nil
    }
    return s.err
}
一般来说,读取和解析文件的惯用方法是使用bufio.NewScanner,它接受要读取的文件作为输入参数,并返回一个新的扫描仪

考虑到上述备注,这里是一种读取和解析文件的方法:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    input, err := os.Open("example.txt")

    if err != nil {
        panic("Error happend during opening the file. Please check if file exists!")
        os.Exit(1)
    }

    defer input.Close()

    scanner := bufio.NewScanner(input)
    for scanner.Scan() {
        line := scanner.Text()
        fmt.Printf("%v\n", line)
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading input:", err)
    }    
}
您可以使用检查文件读取时的错误

// Err returns the first non-EOF error that was encountered by the Scanner.
func (s *Scanner) Err() error {
    if s.err == io.EOF {
        return nil
    }
    return s.err
}
一般来说,读取和解析文件的惯用方法是使用bufio.NewScanner,它接受要读取的文件作为输入参数,并返回一个新的扫描仪

考虑到上述备注,这里是一种读取和解析文件的方法:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    input, err := os.Open("example.txt")

    if err != nil {
        panic("Error happend during opening the file. Please check if file exists!")
        os.Exit(1)
    }

    defer input.Close()

    scanner := bufio.NewScanner(input)
    for scanner.Scan() {
        line := scanner.Text()
        fmt.Printf("%v\n", line)
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading input:", err)
    }    
}

您的输入文件看起来是CSV文件,因此可以使用编码/CSV

这看起来足够简洁,并提供正确的输出


[[CZG KCZG some text][EKY KEKY some text][A50 KA50 some text][UKY UCFL some text][MIC KMIC some text][K2M K23M some text]]

您的输入文件看起来是CSV文件,因此您可以使用编码/CSV

这看起来足够简洁,并提供正确的输出


[[CZG KCZG some text][EKY KEKY some text][A50 KA50 some text][UKY UCFL some text][MIC KMIC some text][K2M K23M some text][K2M K23M some text]

文件末尾没有尾随符\n。您使用bufio.Scanner的解决方案确实很好,但我只是想知道是否有一个选项可以防止ioutil.ReadFile在看到EOF时添加空切片。如果没有,我就用bufio。谢谢。你是如何确认没有尾随的换行符的?有些编辑器实际上不会将它们显示为空行,而是以静默方式添加它们。试试od-tc/path/to/file/ad_iata,看看。我的观点是正确的。最后一行末尾有一个尾随符\n。这使得ioutil.ReadFile的行为对我来说更符合逻辑。我从你的回答中学到了一些东西。再次感谢。文件结尾没有尾随\n。您使用bufio.Scanner的解决方案确实很好,但我只是想知道是否有一个选项可以防止ioutil.ReadFile在看到EOF时添加空切片。如果没有,我就用bufio。谢谢。你是如何确认没有尾随的换行符的?有些编辑器实际上不会将它们显示为空行,而是以静默方式添加它们。试试od-tc/path/to/file/ad_iata,看看。我的观点是正确的。最后一行末尾有一个尾随符\n。这使得ioutil.ReadFile的行为对我来说更符合逻辑。我从你的回答中学到了一些东西。再次感谢。