Golang 计算文件中的行数
在Go语言中,文件是一个用于存储可以读取或写入数据的命名资源。它为程序提供了一种持久化数据的方式,即使程序执行完毕后仍然存在。在本文中,我们将讨论使用不同方法来计算文件中行数的方法。
方法1:使用用户定义的函数
在此方法中,我们将编写一个Go语言程序,使用bufio、fmt和os包来计算文件中行数。
步骤
- 步骤1 - 首先,我们需要导入fmt、bufio和os包。
-
步骤2 - 现在,在main函数中创建一个新文件,并将其存储在一个变量中。
-
步骤3 - 如果在此过程中发生任何错误,则将其存储在名为err的变量中并打印在屏幕上。
-
步骤4 - 现在,为了写入该文件,使用bufio包中的NewWriter()函数,并使用WriteString()函数向文件中输入字符串值。
-
步骤5 - 现在,使用Open()函数打开该文件,并使用scan()函数读取文件中的数据。
-
步骤6 - 再次使用for循环遍历文件中的数据,并在获取到新行时递增计数变量。
-
步骤7 - 一旦迭代完成,计数变量包含该特定文件中的行数。
-
步骤8 - 最后,使用fmt.Println()函数将结果打印在屏幕上。
示例1
在下面的示例中,我们将使用用户定义的函数计算文件中的行数。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// creating a new file
file, err := os.Create("newFile.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
// writing data in the file
writer := bufio.NewWriter(file)
_, err = writer.WriteString("Hello, World!\n this is the first line\n followed by the second line\n and the third one")
if err != nil {
fmt.Println(err)
return
}
err = writer.Flush()
if err != nil {
fmt.Println(err)
return
}
// fetching the file
file, err = os.Open("newFile.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
// getting the number of lines
var count int
for scanner.Scan() {
count++
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
return
}
fmt.Println("Number of lines in file:", count)
}
输出
Number of lines in file: 4
方法2:使用内部函数
在这个方法中,我们将编写一个Go语言程序来使用内置的库函数计算文件中存在的行数。
语法
func len(v Type) int
len()函数用于获取任何参数的长度。它接受一个参数作为数据类型变量,我们希望找到其长度,并返回整数值,即变量的长度。
func Split(str, sep string) []string
Split()函数用于通过提供的分隔符拆分字符串。该函数存在于字符串包中,并接受要拆分的字符串作为参数以及一个分隔符。然后,该函数将返回最终的字符串数组作为结果。
步骤
- 第一步 - 首先,我们需要导入所需的包。
-
第二步 - 现在,开始主函数。在main()中创建一个新文件并将其存储在一个变量中。
-
第三步 - 现在,为了向该文件写入内容,请使用WriteString()函数并输入字符串值到文件中。
-
第四步 - 现在,使用ioutil包中的ReadFile()函数打开文件以读取文件中的数据。
-
第五步 - 使用split()函数来计算行数并将其打印到屏幕上。
示例1
在这个示例中,我们将学习如何使用类似writestring()的内部函数来计算文件中存在的行数。
package main
import (
"bufio"
"fmt"
"io/ioutil"
"os"
"strings"
)
func main() {
// creating a new file
file, err := os.Create("newFile.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
// writing data in the file
writer := bufio.NewWriter(file)
_, err = writer.WriteString("Hello, World!\n this is the first line\n followed by the second line\n and the third one\n and a new one")
if err != nil {
fmt.Println(err)
return
}
err = writer.Flush()
if err != nil {
fmt.Println(err)
return
}
// fetching the file
data, err := ioutil.ReadFile("newFile.txt")
if err != nil {
panic(err)
}
lines := strings.Split(string(data), "\n")
fmt.Printf("Number of lines: %d\n", len(lines))
}
输出
Number of lines: 5
示例2
在此示例中,我们使用了位于reader包中的ReadLine()内置库函数,以编写一个Go语言程序,用于计算给定文件中的行数。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// creating a new file
file, err := os.Create("newFile.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
// writing data in the file
writer := bufio.NewWriter(file)
_, err = writer.WriteString("Hello, World!\n this is the first line\n followed by the second line\n and the third one\n and a new one")
if err != nil {
fmt.Println(err)
return
}
err = writer.Flush()
if err != nil {
fmt.Println(err)
return
}
file, err = os.Open("newFile.txt")
if err != nil {
panic(err)
}
defer file.Close()
reader := bufio.NewReader(file)
lineCount := 0
for {
_, _, err := reader.ReadLine()
if err != nil {
break
}
lineCount++
}
fmt.Printf("Number of lines: %d\n", lineCount)
}
输出
Number of lines: 5
结论
在第一个示例中,我们使用了一个用户定义的函数,而在第二种方法中,我们使用了两个内部函数的示例来计算文件中存在的行数。