学习记录:go语言中读写文件的小练习

package main

import (
	"os"
	"fmt"
	"bufio"
	"strings"
	"strconv"
)

func main() {
	f, _:=os.OpenFile("a.txt", os.O_RDONLY, 0666)
	defer f.Close()
	m:=bufio.NewReader(f)
	char:=0
	words:=0
	lines:=0
	for{
		s, ok:=m.ReadString('\n')
		fmt.Println(s)
		char+=len(s)
		words+=len(strings.Fields(s))
		lines++
		if  ok!=nil{
			break
		}
	}
	fmt.Println("char:"+toString(char)+",words:"+toString(words)+",lines:"+toString(lines))
}
func toString(a interface{}) string{
	
	 if  v,p:=a.(int);p{
	 	return strconv.Itoa(v)
	 }
	
	if v,p:=a.(float64);  p{
	 return strconv.FormatFloat(v,'f', -1, 64)
	}
	
	if v,p:=a.(float32); p {
		return strconv.FormatFloat(float64(v),'f', -1, 32)
	}
	
	 if v,p:=a.(int16); p { 
	 	return strconv.Itoa(int(v))
	 }
	  if v,p:=a.(uint); p { 
	 	return strconv.Itoa(int(v))
	 }
	  if v,p:=a.(int32); p { 
	 	return strconv.Itoa(int(v))
	 }
	return "wrong"
}

程序的主要目的是读取某文件,输出到屏幕,并输出其中字数,单词数,行数,这是一个来自《学习go语言》的练习题。

f, _:=os.OpenFile("a.txt", os.O_RDONLY, 0666)这一句是建立一个到a.txt的只读的文件流(其实我问高手说叫文件资源句柄。我觉得好像流更好理解,就姑且让我用流来描述)。

defer f.Close() 用到的是go语言中的压后语句defer,确保在此函数结束后关闭流f。

m:=bufio.NewReader(f)在f流外面包一层用来读的缓冲管道,形成新的缓冲流m。

s, ok:=m.ReadString('\n') m读取文件,读到'\n'时停下来,返回之前读到的string

strings.Fields(s) 把s根据空白字符进行分割,得到一个字符串数组还是slice切片?(恩恩,这点没搞清楚,应该是切片,看来还得回去学习。。)

 

你可能感兴趣的:(学习记录:go语言中读写文件的小练习)