Go语言系列(七)- 读写操作

终端读写

1. 终端读写

操作终端相关文件句柄常量

  • os.Stdin:标准输入
  • os.Stdout:标准输出
  • os.Stderr:标准错误输出

2. 终端读写示例

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.Scanf("%s %s", &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)
}

package main

import "fmt"

type student struct {
    Name  string
    Age   int
    Score float32
}

func main() {
    var str = "stu01 18 89.92"
    var stu student
    fmt.Sscanf(str, "%s %d %f", &stu.Name, &stu.Age, &stu.Score)
    fmt.Println(stu)
}

终端读写示例

3. 带缓冲区的读写

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)
	}
}

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    str, err := reader.ReadString(‘\n‘)
    if err != nil {
        fmt.Println("read string failed, err:", err)
        return
    }

    fmt.Printf("read str success, ret: %s\n", str)
}

//  go run go_dev/day7/example/example3/main

带缓冲区的读写

文件读写

1. os.File封装所有文件相关操作,之前讲的 os.Stdin,os.Stdout, os.Stderr都是*os.File

  • 打开一个文件进行读操作: os.Open(name string) (*File, error)
  • 关闭一个文件:File.Close()

2. 文件操作示例

package main

import (
	"bufio"
	"fmt"
	"os"
)

func file_write() {
	// 文件读写
	file, err := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY, 0664)
	if err != nil {
		fmt.Println("open file err,:", err)
		return
	}
	fmt.Fprintf(file, "do balance error\n")
	file.Close()
}

func main() {
	// file_write()
	file, err := os.Open("test.log")
	if err != nil {
		fmt.Println("read file failed, 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 success, ret: %s\n", str)
}

3. 读取整个文件示例

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())
	}
}

4. 读取压缩文件示例

package main

import (
	"bufio"
	"compress/gzip"
	"fmt"
	"os"
)
func main() {
	fName := "MyFile.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)
	}
}

5. 文件写入

os.OpenFile(“output.dat”, os.O_WRONLY|os.O_CREATE, 0666)

第二个参数:文件打开模式

  • 1. os.O_WRONLY:只写
  • 2. os.O_CREATE:创建文件
  • 3. os.O_RDONLY:只读
  • 4. os.O_RDWR:读写
  • 5. os.O_TRUNC :清空

第三个参数:权限控制:

    r --> 004w --> 002x --> 001

6.文件写入示例

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()
}

7. 拷贝文件

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 {
		return
	}
	defer src.Close()
	dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		return
	}
	defer dst.Close()
	return io.Copy(dst, src)
}

8 读取文件,统计英文、数字、空格以及其他字符的数量。

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

type CharCount struct {
	ChCount    int
	NumCount   int
	SpaceCount int
	OtherCount int
}

func main() {
	file, err := os.Open("test.log")
	if err != nil {
		fmt.Println("read file failed, 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%s", err)
			break
		}
		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)
}

9. 带缓冲区的文件读写

package main

import (
	"bufio"
	"flag"
	"fmt"
	"io"
	"os"
)

func cat(r *bufio.Reader) {
	for {
		buf, err := r.ReadBytes(‘\n‘)
		if err == io.EOF {
			break
		}
		fmt.Fprintf(os.Stdout, "%s", buf)

		return
	}
}

func main() {
	flag.Parse()
	if flag.NArg() == 0 {
		cat(bufio.NewReader(os.Stdin))
	}
	for i := 0; i < flag.NArg(); i++ {
		f, err := os.Open(flag.Arg(i))
		if err != nil {
			fmt.Fprintf(os.Stderr, "%s:error reading from %s: %s\n",
				os.Args[0], flag.Arg(i), err.Error())
		}
		continue
	}
	cat(bufio.NewReader(f))
}

10. 带缓冲区的终端读写

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	fmt.Fprintf(os.Stdout, "%s\n", "hello world! - unbuffered")
	buf := bufio.NewWriter(os.Stdout)
	fmt.Fprintf(buf, "%s\n", "hello world! - buffered")
	buf.Flush()
}

命令行参数

os.Args是一个string的切片,用来存储所有的命令行参数

1. flag包的使用,用来解析命令行参数:

  • flag.BoolVar(&test, "b", false, "print on newline")
  • flag.StringVar(&str, "s", "", "print on newline")
  • flag.IntVar(&count, "c", 1001, "print on newline")

2. 命令行参数解析

package main

import (
	"flag" // command line option parser
	"fmt"
)

func main() {

	var test bool
	var str string
	var count int
	flag.BoolVar(&test, "b", false, "print on newline")
	flag.StringVar(&str, "s", "", "print on newline")
	flag.IntVar(&count, "c", 1001, "print on newline")
	flag.Parse()

	fmt.Println(test)
	fmt.Println(str)
	fmt.Println(count)
}

3. 示例

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Printf("len of args:%d\n", len(os.Args))
    for i, v := range os.Args {
        fmt.Printf("args[%d]: %s\n", i, v)
    }
}

示例一

package main

import (
    "flag"
    "fmt"
)

func main() {
    var confPath string
    var logLevel int
    flag.StringVar(&confPath, "c", "", "please input conf Path")
    flag.IntVar(&logLevel, "d", 10, "please input log level")

    flag.Parse()

    fmt.Println("path:", confPath)
    fmt.Println("log level:", logLevel)
}

// go run go_dev/day7/example/example7/main -c d:/python -d 1

示例二

Json数据协议

  • 1. 导入包:Import “encoding/json”
  • 2. 序列化: json.Marshal(data interface{})
  • 3. 反序列化: json.UnMarshal(data []byte, v interface{})

json序列化结构体,map,slice和int

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	UserName string `json:"username"`
	Nickname string `json:"nickname"`
	Age      int
	Birthday string
	Sex      string
	Email    string
	Phone    string
}

func testStruct() {
	user1 := &User{
		UserName: "user1",
		Nickname: "超级英雄",
		Age:      18,
		Birthday: "2008/8/8",
		Sex:      "男",
		Email:    "[email protected]",
		Phone:    "110",
	}
	data, err := json.Marshal(user1)
	if err != nil {
		fmt.Println("json.marsha1 failed, err:", err)
		return
	}
	fmt.Printf("%s\n", string(data))
}

func testInt() {
	var age = 100
	data, err := json.Marshal(age)
	if err != nil {
		fmt.Println("json.marsha1 failed, err:", err)
		return
	}
	fmt.Printf("%s\n", string(data))
}

func testMap() {
	var m map[string]interface{}
	m = make(map[string]interface{})
	m["username"] = "user1"
	m["age"] = 18
	m["sex"] = "女"
	data, err := json.Marshal(m)
	if err != nil {
		fmt.Println("json.marsha1 failed, err:", err)
		return
	}
	fmt.Printf("%s\n", string(data))
}
func testSlice() {
	var m map[string]interface{}
	var s []map[string]interface{}
	m = make(map[string]interface{})
	m["username"] = "user1"
	m["age"] = 18
	m["sex"] = "女"

	s = append(s, m)

	data, err := json.Marshal(s)
	if err != nil {
		fmt.Println("json.marsha1 failed, err:", err)
		return
	}
	fmt.Printf("%s\n", string(data))
}
func main() {
	testStruct()
	testInt()
	testMap()
	testSlice()
}  

json序列化示例

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    UserName string `json:"username"`
    Nickname string `json:"nickname"`
    Age      int
    Birthday string
    Sex      string
    Email    string
    Phone    string
}

func testStruct() (ret string, err error) {
    user1 := &User{
        UserName: "user1",
        Nickname: "超级英雄",
        Age:      18,
        Birthday: "2008/8/8",
        Sex:      "男",
        Email:    "[email protected]",
        Phone:    "110",
    }
    data, err := json.Marshal(user1)
    if err != nil {
        fmt.Println("json.marsha1 failed, err:", err)
        return
    }
    ret = string(data)
    return
}
func testMap() (ret string, err error) {
    var m map[string]interface{}
    m = make(map[string]interface{})
    m["username"] = "user1"
    m["age"] = 18
    m["sex"] = "女"
    data, err := json.Marshal(m)
    if err != nil {
        fmt.Println("json.marsha1 failed, err:", err)
        return
    }
    ret = string(data)
    return
}
func test() {
    data, err := testStruct()
    if err != nil {
        fmt.Println("test struct failed, err:", err)
        return
    }
    var user1 User
    err = json.Unmarshal([]byte(data), &user1)
    if err != nil {
        fmt.Println("unmarshal failed", err)
        return
    }
    fmt.Println(user1)
}

func test2() {
    data, err := testMap()
    if err != nil {
        fmt.Println("test map failed, err:", err)
        return
    }
    var m map[string]interface{}
    err = json.Unmarshal([]byte(data), &m)
    if err != nil {
        fmt.Println("unmarshal failed", err)
        return
    }
    fmt.Println(m)
}
func main() {
    test()
    test2()
}

json序列化示例

定义错误

package main

import (
	"errors"
	"fmt"
)

var errNotFound error = errors.New("Not found error")

func main() {
	fmt.Printf("error: %v", errNotFound)
}

自定义错误

type error interface {
        Error() string
} 
package main
import (
//	"fmt"
)
type PathError struct {
	Op   string
	Path string
	err string
}
func (e *PathError) Error() string {
	return e.Op + " " + e.Path + ": " + e.Err.Error()
}
func test() error {
	return &PathError{
		Op:   "op",
		Path: "path",
	}
}
func main() {
	test()
}

判断自定义错误

switch err := err.(type) {
case ParseError:
         PrintParseError(err)
case PathError:
         PrintPathError(err)
... default:
} 

示例

package main

import (
    "fmt"
    "os"
    "time"
)

type PathError struct {
    path       string
    op         string
    createTime string
    message    string
}

func (p *PathError) Error() string {
    return fmt.Sprintf("path=%s op=%s createTime=%s message=%s", p.path, p.op, p.createTime, p.message)
}

func Open(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return &PathError{
            path:       filename,
            op:         "read",
            message:    err.Error(),
            createTime: fmt.Sprintf("%v", time.Now()),
        }
    }
    defer file.Close()
    return nil
}

func main() {
    err := Open("c:/sasassas.txt")
    switch v := err.(type) {
    case *PathError:
        fmt.Println("get path error,", v)
    default:

    }
}

自定义错误

Panic&Recove

package main

import (
	"fmt"
)

func badCall() {
	panic("bad end")
}

func test() {
	defer func() {
		if e := recover(); e != nil {
			fmt.Printf("Panicking %s\r\n", e)
		}
	}()
	badCall()
	fmt.Printf("After bad call\r\n")
}

func main() {
	fmt.Printf("Calling test\r\n")
	test()
	fmt.Printf("Test completed\r\n")
}

 

原文地址:https://www.cnblogs.com/zhangyafei/p/10709603.html

时间: 2024-10-09 21:27:10

Go语言系列(七)- 读写操作的相关文章

C语言基础文件读写操作

整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 6 /* 7 * EOF: 符号常量,其值为-1. 8 * fgets() 最多读取int-1个字符,遇换行或EOF即返回. 9 * fputs() 写文件时,忽略字符串截止符'\0'. 10 * fread()和fw

Java基础复习笔记系列 七 IO操作

Java基础复习笔记系列之 IO操作 1. 2.

C#拾遗之读写操作

最近一直在学C#语言,在写一些程序的时候难免遇到C#输入输出的问题,除了葛老师讲的一些东西,我也在看网上的一些关于C#程序设计的视频讲解,在看到C#流程控制结构的这一章节,看到了一个很好的关于C#读写操作的一个例子.这个例子就是典型的for迭代语句编写"小九九表". 第一种输出格式的代码: <span style="font-size:18px;"> for (int i = 1; i <=9; i++) { for (int j = 1; j &

【python学习笔记】pthon3.x中的文件读写操作

在学习python文件读写的时候,因为教程是针对python2的,而使用的是python3.想要利用file类时,类库里找不到,重装了python2还是使不了.在别人园子认真拜读了<详解python2和python3区别>(已收藏)之后,才发现python3已经去掉file类. 现在利用python进行文件读写的方法更加类似于C语言的文件读写操作. 如今总结如下: 一 打开文件—— f = open('poem.txt','x+'): 读过open的帮助文档,然后自己翻译了一下,现给大家分享一

Linux学习系列八:操作网口

一些相对高性能的单片机会带以太网接口,网口在MCU里算是比较复杂的外设了,因为它涉及到网络协议栈,通常情况下网络协议栈会运行在一个RTOS中,所以对普通单片机开发者来说网口使用起来相对难度较大一些.在Linux下网口是一个经常使用的接口,由于Linux具备成熟完备的网络通信协议栈,底层驱动厂家也都提供好了,所以使用起来相对方便的多.本篇对Linux下网口使用做个简单总结,希望对大家有所帮助. 内容主要包括使用buildroot来是实现ssh功能,UDP通信的例子,以及实际中容易犯的一个错误. 原

C语言快速入门系列(七)

C语言快速入门系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比如二级指针, 指针数组,内存分配和const修饰指针常量等!下面就请大家跟随笔者的脚步,对 C指针神秘的一面进行进一步的解析吧! 本节学习路线图: 函数与指针: ①指针作为函数的形参: ②指向函数的指针: ③指针函数: ④带参数的主函数 ps:该代码的运行:先要编译生成exe文件后,来到exe所在文件目

C语言文件读写操作,从文件读取数据

很早写的在linux系统下的文件读写操作,从文件中读取数据 #include <stdio.h> int ReadInfoFromFile(const char *strFile) { FILE *fp; char ch; fp = fopen(strFile, "r"); // 只读的方式打开文件 if(fp==NULL) { perror("fopen"); // 打开文件失败 打印错误信息 return -1; } ch = fgetc(fp);

C语言文件读写操作,写入数据到文件

很早写的在linux系统下的文件读写操作,写入数据到文件,很时候初学者学习 #include <stdio.h> int writeInfoToFile(const char *strFile) { int age, i; char name[10]; FILE *fp; fp = fopen(strFile, "w"); // 只读的方式打开文件 if(fp == NULL) { perror("fopen"); // 文件打开失败,打印错误信息 re

C语言的文件的操作(一)

C语言的文件的操作(一) 一.文件定义及分类 概念:文件是指一组相关数据的有序集合,这个数据集有一个名称,即为文件名. §1 普通文件: 普通文件是驻留在磁盘或其他外部介质上的一个有序数据集,可以是源文件.目标文件.可执行程序,也可以是一组带输入的处理的原始独居或者是一组输出结果.对于源文件.目标文件.可执行程序可以称为程序文件,对输入输出程序可称作数据文件. §2 设备文件: 设备文件是指与主机相连的各外部设备,如串行通信接口.显示器.打印机.键盘等.在操作系统中把外部设备也看作一个文件来进行