Go语言程序读取现有文件中的行


在 Go 编程语言中,将使用 Bufio 和 io 包函数从给定文件读取文本。在本文中,我们将使用三个示例从现有文件读取行。在第一个示例中,我们将使用 bufio 包中的 NewReader 函数,在第二个示例中,我们将使用 ioutil 包中的 ReadFile 函数,在第三个示例中,我们将分别使用 file.Read 函数。

语法

func Split(str, sep string) []string

Split() 函数用于通过提供的分隔符分割字符串。此函数存在于 strings 包中,它接受要分割的字符串以及分隔符作为参数。然后,该函数返回最终的字符串数组作为结果。

bufio.NewReader()

此函数属于 Go 的 bufio 包。此函数的主要目标是以较大的块而不是逐行读取数据,并将其存储在缓冲区中。io.reader 和缓冲区大小作为参数传递给此函数。

os.Open()

此函数是 os 包的一部分。它用于打开文件以进行读取。它接收一个输入,即要打开的文件名。

ioutil.ReadFile()

此函数在 ioutil 包中可用,用于读取以文件名作为函数输入的文件内容。

File.Read(file name)

Read 方法返回两个值:实际读取的字符数 (n) 和错误 (err)。我们检查是否存在错误,如果存在,则检查错误是否为 EOF(文件结束)错误。如果不是 EOF 错误,我们将打印错误消息并返回。

算法

  • 在程序中导入所需的包

  • 创建主函数

  • 在主函数中打开文件并读取其内容

  • 如果遇到错误,则在控制台上打印它

示例 1

在此示例中,我们将编写一个 Go 语言程序,通过使用 bufio 包中提供的 NewReader() 函数从现有文件读取行。然后使用 reader 的 ReadString 方法从文件中读取行。

package main

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

func main() {
   file, err := os.Open("file.txt")
   if err != nil {
      fmt.Println("Error opening file:", err)
      return
   }
   defer file.Close()
   reader := bufio.NewReader(file)
   fmt.Println("Data recieved after reading from the file is:\n")	
   for {
      line, err := reader.ReadString('\n')
		if err == io.EOF {
         break
      }
      if err != nil {
         fmt.Println("Error reading line:", err)
         return
      }
      fmt.Println(line)
   }
}

输出

Data received after reading from the file is:

History of Computers

It is very difficult to find the exact origin of computers.

But according to some experts computer exists at the time of world war-II.

Also, at that time they were used for keeping data. But, it was for only government use and not for public use.

示例 2

在此示例中,我们将编写一个 Go 语言程序,通过使用 strings 包中提供的 Split 函数和 ioutil 包中提供的 ReadFile() 函数从现有文件中读取行。

package main

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

func main() {
   contents, err := ioutil.ReadFile("file.txt")
   if err != nil {
      fmt.Println("Error reading file:", err)
      return
   }

   lines := strings.Split(string(contents), "\n")
   fmt.Println("Data received after reading lines from the file specified is:\n")
   for _, line := range lines {
      fmt.Println(line)
   }
}

输出

Data received after reading lines from the file specified is:

History of Computers
It is very difficult to find the exact origin of computers.
But according to some experts computer exists at the time of world war-II.
Also, at that time they were used for keeping data. But, it was for only government use and not for public use.
Above all, in the beginning, the computer was a very large and heavy machine.

示例 3

在 Golang 中读取文件行的第三种方法是使用循环逐行读取文件。os.Open 函数用于打开文件,file.Read 方法用于将文件内容读取到字节切片中。然后使用 bytes.IndexByte 函数在字节切片中查找换行符,并使用 string 函数将切片转换为字符串。

package main

import (
   "bytes"
   "fmt"
   "io"
   "os"
)

func main() {
   file, err := os.Open("file.txt")
   if err != nil {
      fmt.Println("Error opening file:", err)
      return
   }
   defer file.Close()

   var buffer bytes.Buffer
   for {
      b := make([]byte, 1024)
      n, err := file.Read(b)
      if err == io.EOF {
         break
      }
      if err != nil {
         fmt.Println("Error reading file:", err)
         return
      }
      buffer.Write(b[:n])
      for {
         index := bytes.IndexByte(buffer.Bytes(), '\n')
         if index == -1 {
            break
         }
         line := buffer.Next(index + 1)
         fmt.Println(string(line))
      }
   }
}

输出

The history of programming languages spans from documentation of early mechanical computers to modern

tools for software development. Early programming languages were highly specialized, relying on

mathematical notation and similarly obscure Syntax. Throughout the 20th century, research in compiler

theory led to the creation of high-level programming languages.

结论

我们已成功编译并执行了一个 Go 语言程序,用于从现有文件读取行,并附带示例。我们在这里使用了三个示例来实现结果。根据用例,其中一个示例可能比其他示例更合适。无论使用哪种方法,在 Golang 中读取文件时正确处理错误都很重要。

更新时间: 2023年5月3日

127 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告