golang基础-终端读(Scanln\bufio)、bufio文件读、、ioutil读读压缩、缓冲区读写、文件写入、文件拷贝
2017-11-05 16:47
531 查看
终端读写Scanln、Sscanf
package main import ( "fmt" ) var ( firstName, lastName, s string i int f float32 input = "56.12 / 5212 / Go" format = "%f / %d / %s" ) func main() { fmt.Println("Please enter your full name: ") fmt.Scanln(&firstName, &lastName) fmt.Printf("Hi %s %s!\n", firstName, lastName) // Hi Chris Naegels fmt.Sscanf(input, format, &f, &i, &s) fmt.Println("From the string we read: ", f, i, s) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go Please enter your full name: hello go lagn Hi hello go! From the string we read: 56.12 5212 Go PS E:\golang\go_pro\src\safly>
func Sscanf
func Sscanf(str string, format string, a …interface{}) (n int, err error)
Scanf 扫描实参 string,并将连续由空格分隔的值存储为连续的实参, 其格式由 format 决定。它返回成功解析的条目数。
func Scanln
func Scanln(a …interface{}) (n int, err error)
Scanln 类似于 Scan,但它在换行符处停止扫描,且最后的条目之后必须为换行符或 EOF。
bufio带缓冲区的读
ReadString读取换行func (*Reader) ReadString
func (b *Reader) ReadString(delim byte) (line string, err error)
ReadString读取输入到第一次终止符发生的时候,返回的string包含从当前到终止符的内容(包括终止符)。 如果ReadString在遇到终止符之前就捕获到一个错误,它就会返回遇到错误之前已经读取的数据,和这个捕获 到的错误(经常是 io.EOF)。当返回的数据没有以终止符结束的时候,ReadString返回err != nil。 对于简单的使用,或许 Scanner 更方便。
package main import ( "bufio" "fmt" "os" ) var inputReader *bufio.Reader var input string var err error func main() { inputReader = bufio.NewReader(os.Stdin) fmt.Println("Please enter some input: ") input, err = inputReader.ReadString('\n') if err == nil { fmt.Printf("The input was: %s\n", input) } }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go Please enter some input: wyf The input was: wyf PS E:\golang\go_pro\src\safly>
bufio文件读(1)
1、os.Open2、bufio.NewReader
3、reader.ReadString
package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("output.dat") if err != nil { fmt.Println("read file err:", err) return } defer file.Close() reader := bufio.NewReader(file) str, err := reader.ReadString('\n') if err != nil { fmt.Println("read string failed, err:", err) return } fmt.Printf("read str succ, ret:%s\n", str) }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go read file err: open test: The system cannot find the file specified. PS E:\golang\go_pro\src\safly>
运行结果有问题,但是找不出问题所在
bufio文件读(2)
练习,从终端读取一行字符串,统计英文、数字、空格以及其他字符的数量。package main import ( "bufio" "fmt" "io" "os" ) type CharCount struct { ChCount int NumCount int SpaceCount int OtherCount int } func main() { file, err := os.Open("output.dat") if err != nil { fmt.Println("read file err:", err) return } defer file.Close() var count CharCount reader := bufio.NewReader(file) for { str, err := reader.ReadString('\n') //读取完毕 if err == io.EOF { break } //读取失败 if err != nil { fmt.Printf("read file failed, err:%v", err) break } /* 一个字符串可以可以用一个rune(又名int32)数组来表示, 每个rune都表示一个单一的字符。如: */ runeArr := []rune(str) for _, v := range runeArr { switch { case v >= 'a' && v <= 'z': fallthrough case v >= 'A' && v <= 'Z': count.ChCount++ case v == ' ' || v == '\t': count.SpaceCount++ case v >= '0' && v <= '9': count.NumCount++ default: count.OtherCount++ } } } fmt.Printf("char count:%d\n", count.ChCount) fmt.Printf("num count:%d\n", count.NumCount) fmt.Printf("space count:%d\n", count.SpaceCount) fmt.Printf("other count:%d\n", count.OtherCount) }
通过ioutil实现读
package main import ( "fmt" "io/ioutil" "os" ) func main() { inputFile := "products.txt" outputFile := "products_copy.txt" buf, err := ioutil.ReadFile(inputFile) if err != nil { fmt.Fprintf(os.Stderr, "File Error: %s\n", err) return } fmt.Printf("%s\n", string(buf)) err = ioutil.WriteFile(outputFile, buf, 0x644) if err != nil { panic(err.Error()) } }
在项目下创建2个文件
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go sfds PS E:\golang\go_pro\src\safly>
读取压缩文件
1、os.Open压缩文件
2、gzip.NewReader(fi)
3、bufio.NewReader(fz)
4、bufio.ReadString
package main import ( "bufio" "compress/gzip" "fmt" "os" ) func main() { fName := "output.dat.gz" var r *bufio.Reader fi, err := os.Open(fName) if err != nil { fmt.Fprintf(os.Stderr, "%v, Can’t open %s: error: %s\n", os.Args[0], fName, err) os.Exit(1) } fz, err := gzip.NewReader(fi) if err != nil { fmt.Fprintf(os.Stderr, "open gzip failed, err: %v\n", err) return } r = bufio.NewReader(fz) for { line, err := r.ReadString('\n') if err != nil { fmt.Println("Done reading file") os.Exit(0) } fmt.Println(line) } }
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! Done reading file PS E:\golang\go_pro\src\safly>
文件写入
文件写入1、OpenFile打开文件(没有文件就创建)
1、创建bufio.NewWriter对象
2、WriteString写入操作
3、刷新Flush
package main import ( "bufio" "fmt" "os" ) func main() { outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666) if outputError != nil { fmt.Printf("An error occurred with file creation\n") return } defer outputFile.Close() outputWriter := bufio.NewWriter(outputFile) outputString := "hello world!\n" for i := 0; i < 10; i++ { outputWriter.WriteString(outputString) } outputWriter.Flush() }
文件拷贝
简单的三步骤1、 os.Open(srcName)
2、os.OpenFile
3、io.Copy(dst, src)
package main import ( "fmt" "io" "os" ) func main() { CopyFile("target.txt", "source.txt") fmt.Println("Copy done!") } func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { fmt.Println("src open err") return } defer src.Close() dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644) if err != nil { fmt.Println("dst open err") return } defer dst.Close() return io.Copy(dst, src) }
相关文章推荐
- golang文件读写三种方式——bufio,ioutil和os.create
- java IO 字节流、字节流读写文件、字节流缓冲区、文件拷贝、装饰设计模式
- Java基础——IO(拷贝文件+字节流-字符流缓冲区(装饰设计)-转换流-IO操作规律-异常日志-系统信息列表输出)
- Golang 文件读写之 os, bufio, io/ioutil 初体验
- golang基础-模板渲染(终端、浏览器)、渲染输出文件、自定义io.Writer渲染
- java:带有缓冲区的读写拷贝BufferedInputStream,BufferedOutputStream 读取写入文件
- Java IO 操作基础2---操作 ZIP 压缩文件
- IO流三:字节流文件读写操作、拷贝图片、带缓冲区的字节流、read()原理、读取键盘录入
- 【Java基础专题】IO与文件读写---Java的IO流架构
- 文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
- golang基础(golang压缩文件gzip)
- Java-基础 文件操作IO-文件写入
- io基础学习-拷贝文件(一)
- (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
- 文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
- golang基础-生成_拷贝exe文件、多包管理、init函数及其执行顺序
- (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
- Java基础之IO流,创建文件并写入内容与IO异常的标准处理方法
- JAVA进行基础的文件IO读写
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)