写点什么

Go- 文件读写 -1

用户头像
HelloBug
关注
发布于: 4 小时前
Go- 文件读写-1

Go 学习笔记,学习内容《Go入门指南》


主要介绍以下内容:

  • 读取键盘和标准输入

  • 读取字符串

  • 利用 bufio 包从标准输入读取数据

  • 利用 bufio 包读文件

  • 读取整个文件

  • 读取压缩文件

  • 写文件

  • 文件拷贝


代码示例可以直接运行

package main
import ( "bufio" "compress/gzip" "fmt" "io" "io/ioutil" "os" "path/filepath")
func printDivider(str ...string) { fmt.Println() fmt.Println("-----------------------------------------------") if len(str) > 0 { fmt.Println(str) }}
var ( firstName, lastName, s string i int f float32)
func main() { /* 读取键盘和标准输入 */ printDivider("读取键盘和标准输入") fmt.Println("Please input your full name: ") //fmt.Scanln(&firstName, &lastName) //fmt.Printf("Hi %s %s\n", firstName, lastName)
/* 读取字符串 Sscan开头的函数都是从字符串读取 */ printDivider("读取字符串") fmt.Sscanf("3.14,100,Hello", "%f,%d,%s", &f, &i, &s) fmt.Printf("From the string, we read %f, %d, %s\n", f, i, s)
/* 利用bufio包从标准输入读取数据 */ printDivider("利用bufio包提供的缓冲读取来读取数据") inputReader := bufio.NewReader(os.Stdin) // 创建一个读取器,并且与标准输入绑定 fmt.Println("Please enter your name: ") input, err := inputReader.ReadString('\n') // 读取到\n结束,返回的input包含\n if err != nil { fmt.Println("There were errors reading, error: ", err) fmt.Println("exiting program.") return }
fmt.Printf("Your name is %s", input) switch input { case "Philip\r\n": fallthrough case "Chris\r\n": fallthrough case "Ivo\r\n": fmt.Printf("Welcome %s\n", input) default: fmt.Printf("You are not welcome here, Goodbye\n") }
/* 利用bufio包读文件 */ printDivider("利用bufio包读文件") inputFile, inputError := os.Open("person.go") // 默认以只读方式打开文件,inputFile类型:*os.File if inputError != nil { fmt.Printf("An error occurred on opening the inputfile\n" + "Does the file exist?\n" + "Have you got access to it?\n") return } defer inputFile.Close()
inputReader = bufio.NewReader(inputFile) // NewReader函数参数类型:*os.File for { inputString, readerError := inputReader.ReadString('\n') // windows和Linux的文件换行符不同,不用关心操作系统类型,直接使用\n就可以 fmt.Printf("The input was: %s", inputString) if readerError == io.EOF { break } }
/* 读取整个文件 */ printDivider("读取整个文件") inFile := "person.go" outFile := "person_copy.go" buf, err := ioutil.ReadFile(inFile) if err != nil { // 若文件不存在,运行错误:File Error: open person-.go: The system cannot find the file specified. fmt.Fprintf(os.Stderr, "File Error: %s\n", err) //fmt.Fprintf(os.Stderr, "File Error: %s\n", err.Error()) }
fmt.Printf("%s\n", string(buf)) err = ioutil.WriteFile(outFile, buf, 0644) // err类型是接口类型,调用接口内的函数Error()输出错误信息 if err != nil { panic(err.Error()) }
filename := filepath.Base("/path/to/golang/") fmt.Println(filename) // 输出:golang
/* 对于各种格式的文件处理,可以从go package中找到对应的包处理,找不到的时候,自己实现处理 */
/* 读取压缩文件 支持压缩文件类型:gzip、flate、bzip2、lzw、zlib */ printDivider("读取压缩文件") fName := "person.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) // 输出:C:\Users\ADMINI~1\AppData\Local\Temp\go-build2880183904\b001\exe\038_Read.exe, Can't open person.zip, error: open person.zip: The system cannot find the file specified. }
fz, err := gzip.NewReader(fi) if err != nil { r = bufio.NewReader(fi) } else { r = bufio.NewReader(fz) }
for { line, err := r.ReadString('\n') if err != nil { fmt.Println("Done reading file") break }
fmt.Println(line) }
/* 写文件 */ printDivider("写文件") outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666) if outputError != nil { fmt.Printf("An error occured with file opening or creation\n") return } defer outputFile.Close()
outputWrite := bufio.NewWriter(outputFile) outputString := "Hello world\n"
for i := 0; i < 10; i++ { outputWrite.WriteString(outputString) } outputWrite.Flush()
outputFile.WriteString(" Hello, GO\n") fmt.Fprintf(outputFile, "Hello, Fprintf\n")
/* 文件拷贝 */ printDivider("文件拷贝") srcFile, err := os.Open("person.go") _, err = io.Copy(outputFile, srcFile) // 追加的方式拷贝 if err != nil { fmt.Println("io.Copy error: ", err) }}
复制代码


发布于: 4 小时前阅读数: 5
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 文件读写-1