使用Golang编写程序从现有文件中读取行
在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)
该方法返回两个值:实际读取的字符数(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("读取文件时出错:", err)
return
}
lines := strings.Split(string(contents), "\n")
fmt.Println("从指定文件中读取行后接收到的数据为:\n")
for _, line := range lines {
fmt.Println(line)
}
}
输出
从指定文件中读取行后接收到的数据为:
计算机的历史
很难找到计算机的确切起源。
但根据一些专家的说法,计算机存在于二战时期。
同时,当时它们被用于保留数据。但是,它只是用于政府,而不是公众使用。
总之,一开始计算机是一台非常大且沉重的机器。
例子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("打开文件时出错:", 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("读取文件时出错:", 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))
}
}
}
输出
编程语言的历史跨越了早期机械计算机的文献、现代软件开发工具。早期的编程语言高度专业化,依赖于数学符号和类似模糊的语法。在20世纪,编译器理论的研究导致高级编程语言的创造。
结论
我们已经成功地编译并执行了一个Go语言程序,以读取现有文件中的行,并提供了示例。我们在这里使用了三个示例以实现结果。根据用例,其中一个示例可能比其他示例更合适。无论使用哪种方法,当在Golang中读取文件时,正确处理错误非常重要。