代码

  1. // 统计文件中英文、数字、空格和其它字符的数量
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io"
  7. "os"
  8. )
  9. // 定义一个结构体,保存统计的字符以及数量
  10. type CharCount struct {
  11. EnCount int
  12. NumCount int
  13. SpaceCount int
  14. OtherCount int
  15. }
  16. func main() {
  17. // 思路:
  18. // 打开一个文件,创建一个 Reader
  19. // 每读取一行,就去统计不同的字符数量,将结构保存到结构体中
  20. // 定义 CharCount 实例
  21. charCount := CharCount{}
  22. filepath := "d:/test.txt"
  23. file, err := os.Open(filepath)
  24. var reader *bufio.Reader
  25. if err != nil {
  26. fmt.Printf("读取文件:%v 失败", filepath)
  27. } else {
  28. // 创建带缓存的 *reader
  29. reader = bufio.NewReader(file)
  30. // 循环读取内容
  31. for {
  32. // 读到一个换行就结束
  33. str, err := reader.ReadString('\n')
  34. if err == io.EOF {
  35. // 读到文件末尾就退出
  36. break
  37. }
  38. // str2 := []rune(str) // 处理中文字符
  39. for _, v := range str {
  40. // fmt.Printf("%c", v) // 查看字符
  41. switch {
  42. case v >= 'a' && v <= 'z':
  43. fallthrough // 穿透
  44. case v >= 'A' && v <= 'Z':
  45. charCount.EnCount++
  46. case v == ' ' || v == '\t':
  47. charCount.SpaceCount++
  48. case v >= '0' && v <= '9':
  49. charCount.NumCount++
  50. default:
  51. charCount.OtherCount++
  52. }
  53. }
  54. // 输出内容
  55. fmt.Print(str)
  56. }
  57. fmt.Println("文件读取结束")
  58. // 输出统计的结果
  59. fmt.Printf("英文个数:%v, 数字个数:%v, 空格个数:%v, 其它字符个数:%v \n",
  60. charCount.EnCount, charCount.NumCount, charCount.SpaceCount, charCount.OtherCount)
  61. }
  62. // 关闭文件
  63. defer func() {
  64. err = file.Close()
  65. if err != nil {
  66. fmt.Println("关闭文件错误")
  67. } else {
  68. fmt.Printf("文件: %v 已关闭", filepath)
  69. }
  70. }()
  71. }