Golang 读取现有文件中的行
在Go编程语言中,将使用Bufio和io包的函数来读取给定文件中的文本。在本文中,我们将使用三个示例来从现有文件中读取行。在第一个示例中,我们将使用bufio包的NewReader函数,在第二个示例中,我们将使用ioutil包的ReadFile函数,而在第三个示例中,我们将分别使用file.Read函数。
语法
func Split(str, sep string) []string
Split()函数用于通过提供的分隔符分割字符串。该函数存在于字符串包中,它接受要分割的字符串作为参数,以及一个分隔符。然后,该函数将返回最终的字符串数组作为结果。
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语言程序,用于从现有文件中读取行以及示例。我们在这里使用了三个示例来实现结果。根据使用情况,其中一个示例可能比其他示例更合适。无论使用哪种方法,在读取Go语言文件时正确处理错误非常重要。