学习记录:go语言中读写文件的小练习
明述道长 · · 3383 次点击 · · 开始浏览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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
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切片?(恩恩,这点没搞清楚,应该是切片,看来还得回去学习。。)