golang基础-终端读(Scanln\bufio)、bufio文件读、、ioutil读读压缩、缓冲区读写、文件写入、文件拷贝

本文主要是介绍golang基础-终端读(Scanln\bufio)、bufio文件读、、ioutil读读压缩、缓冲区读写、文件写入、文件拷贝,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        • 终端读写Scanln、Sscanf
        • bufio带缓冲区的读
        • bufio文件读(1)
        • bufio文件读(2)
        • 通过ioutil实现读
        • 读取压缩文件
        • 文件写入
        • 文件拷贝

终端读写Scanln、Sscanf
package mainimport ("fmt"
)var (firstName, lastName, s stringi                      intf                      float32input                  = "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 Naegelsfmt.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 mainimport ("bufio""fmt""os"
)var inputReader *bufio.Reader
var input string
var err errorfunc 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: wyfPS E:\golang\go_pro\src\safly>
bufio文件读(1)

1、os.Open
2、bufio.NewReader
3、reader.ReadString

package mainimport ("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 mainimport ("bufio""fmt""io""os"
)type CharCount struct {ChCount    intNumCount   intSpaceCount intOtherCount int
}func main() {file, err := os.Open("output.dat")if err != nil {fmt.Println("read file err:", err)return}defer file.Close()var count CharCountreader := 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':fallthroughcase 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 mainimport ("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 mainimport ("bufio""compress/gzip""fmt""os"
)
func main() {fName := "output.dat.gz"var r *bufio.Readerfi, 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 mainimport ("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 mainimport ("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基础-终端读(Scanln\bufio)、bufio文件读、、ioutil读读压缩、缓冲区读写、文件写入、文件拷贝的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125214

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、