Golang实现用户输入的文件读写操作代码示例

Golang实现用户输入的文件读写操作代码示例

package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"os"
	"strings"
	//"log"
)

type data struct {
	name    string
	surname string
	contact string
	id      string
	count   int
}

var stringsetWM = " <<<<>>>>"
var stringsetMM = " <<<>>>"
var stringsetBE = " <<<<<	    >>>>>"
var stringsetOM = " <<<< Options >>>>"
var stringsetIM = " <<>>"

// 我需要一个用户控制的接口,用于多个应用程序
// ||我创建了一个简单稳定的用户界面
// 现在我需要3个可用的内部应用程序:控制、读取和写入

func input(in string) (out string) {
	fmt.Scanln(&in)
	out = in
	return out
}

func main() {

	subMain()

}

func subMain() {

	var in string

	// 考虑使用一些if和switch代码//目前for switch语句运行良好

	fmt.Println(stringsetBE)
	fmt.Println(stringsetWM+"\n", stringsetBE+"\n", stringsetIM+"\n", stringsetBE+"\n")

	// for循环应该从这里开始

	for {
		fmt.Println(stringsetOM)
		sInput := input(in)
		switch sInput {

		case "1":

			option1()
			// 如果只有读取、写入和构建逻辑
			// 这个选项必须与构建逻辑相关
		case "2":
			// 这将是选项二。我不知道是否有选择
			option2()

		case "3":
			// 控制台应用程序的3个选项,使用fmt包而不是http包

			option3()
			// 这样我可以读取文件,可能还可以读取端口
			// 我可以写入文件和端口
		default:
			// 如果输入任何其他键,将显示此消息并再次等待
			fmt.Println("抱歉,命令无效。")
		}
	}

}

// 这些选项作为应用程序基础核心的一部分
// 从那时起,选项可能是无限的

func option1() {
	// 第一个选项是控制系统的一部分
	fmt.Println("这是特别的功能,它依赖于命令提示符的强大功能")
	// 让我们思考!控制台最重要的功能是与端口通信!!
}

func option2() {
	// 第二个选项是读取部分
	fmt.Println("欢迎使用选项2。在这里您可以读取文本文件")
	readfile()

}

func option3() {
	// 第三个选项是写入部分
	fmt.Println("此选项用于以某种方式将内容写入文件")
	writefile()
}

func readfile() {

	// readfile是我前几天编写的代码,然后粘贴到这里
	// 过程:从用户输入接收文件名
	// 过程:读取用户指向的文件
	// 过程:读取数据并以某种方式处理

	var filepath string
	fmt.Println("请输入您要查找的文件名?")
	fileinput := input(filepath) + ".txt" // 现在可以工作

	file, err := ioutil.ReadFile(fileinput)
	if err != nil {
		fmt.Println("查找文件时出错。", err)
	}

	var sFile = string(file)
	// string将目标数据转换为字符串数据

	var theCount int
	var unSpec int
	var sKey string
	var oKey string

	// 首先我们创建扫描器作为NewScanner,并将其指向sFile
	scanner := bufio.NewScanner(strings.NewReader(sFile))
	// 在这里我们将扫描器数据文件分割为逐词扫描
	scanner.Split(bufio.ScanWords)
	// 声明oKey数据并要求用户输入
	fmt.Println("请输入您要查找的单词?")
	oKey = input(sKey)
	// for scanner.Scan()将遍历文本数据的每一行并循环

	// 直到达到EOF条件为真。
	for scanner.Scan() {

		var stringScan = scanner.Text()

		switch stringScan {

		case oKey:
			// 单词计数器
			// 单词查找器和计数器
			theCount++
		default:

			unSpec++

		}

	}

	if theCount < 1 {
		fmt.Println("抱歉,找不到您要查找的单词")
	}
	if theCount > 0 {
		fmt.Printf("单词 %s 被找到 %d 次。\n", oKey, theCount)
	}

}

func writefile() {

	var name string

	var in = input(name)

	file, err := os.Create(in + ".txt") // 这段代码应该创建一个名为...的文件
	if err != nil {
		fmt.Println("创建文件失败。", err)
	}
	if err == nil {
		fmt.Println("成功创建文件。")
	}
	defer file.Close()
	// 创建文件后,我现在需要向其中写入一些数据

	var path = in + ".txt"
	// 使用读取和写入权限打开文件
	var oFile, error = os.OpenFile(path, os.O_RDWR, 0644)
	if error != nil {
		return
	}
	defer oFile.Close()

	var person data
	person.name = "姓名\n"
	person.surname = "姓氏\n"
	person.id = "身份证号\n"
	person.contact = "电话号码\n"

	oFile.WriteString("注意:\n")
	oFile.WriteString(person.name)
	oFile.WriteString(person.surname)
	oFile.WriteString(string(person.id))
	oFile.WriteString(string(person.contact))

	// 逐行向文件写入一些文本
	var hello, _ = oFile.WriteString("你好Golang程序员\n")
	fmt.Println("这里你好,那里你好", hello)
	//if err != nil { return }

	var message = "仅作示例。想象更多内容\n"
	var msg, _ = oFile.WriteString(message)
	fmt.Println("正在打印..", msg)

	_, err = oFile.WriteString("这是结尾\n")
	if err != nil {
		return
	}

	// 保存更改
	err = file.Sync()
	if err != nil {
		return
	}

	fmt.Println("==> 完成文件写入 <==")

}

// 很可能将被称为writefile()

// 然后之后会有

更多关于Golang实现用户输入的文件读写操作代码示例的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

能否请您提出一个恰当的问题,并以更易读的方式格式化您的代码?本论坛使用 Markdown 来格式化帖子。

更多关于Golang实现用户输入的文件读写操作代码示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是针对您提供的Golang文件读写操作代码的专业分析和改进建议。代码整体结构清晰,但存在一些潜在问题,如输入处理逻辑、错误处理不完整以及文件操作冗余。我将通过示例代码展示如何优化这些部分。

1. 输入函数优化

原代码中的input函数通过fmt.Scanln读取输入,但参数传递方式可能导致问题。建议直接读取并返回输入值,避免不必要的参数。

func input() string {
    reader := bufio.NewReader(os.Stdin)
    in, _ := reader.ReadString('\n')
    return strings.TrimSpace(in)
}

此版本使用bufio.Reader读取整行输入,并去除换行符,确保输入完整性。

2. 读取文件功能改进

readfile函数中,文件读取和单词计数逻辑可以优化错误处理和资源管理。

func readfile() {
    fmt.Println("请输入文件名(不含扩展名):")
    filename := input() + ".txt"

    content, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Printf("读取文件失败:%v\n", err)
        return
    }

    text := string(content)
    fmt.Println("请输入要查找的单词:")
    targetWord := input()

    words := strings.Fields(text)
    count := 0
    for _, word := range words {
        if word == targetWord {
            count++
        }
    }

    if count == 0 {
        fmt.Printf("未找到单词 '%s'\n", targetWord)
    } else {
        fmt.Printf("单词 '%s' 出现 %d 次\n", targetWord, count)
    }
}

此代码使用strings.Fields分割单词,简化逻辑,并明确错误处理。

3. 写入文件功能优化

writefile函数创建文件后重复打开,造成冗余。以下示例直接使用创建的文件句柄进行写入:

func writefile() {
    fmt.Println("请输入新文件名(不含扩展名):")
    filename := input() + ".txt"

    file, err := os.Create(filename)
    if err != nil {
        fmt.Printf("创建文件失败:%v\n", err)
        return
    }
    defer file.Close()

    data := data{
        name:    "姓名\n",
        surname: "姓氏\n",
        id:      "身份证号\n",
        contact: "电话号码\n",
    }

    lines := []string{
        "注意:\n",
        data.name,
        data.surname,
        data.id,
        data.contact,
        "你好Golang程序员\n",
        "仅作示例。想象更多内容\n",
        "这是结尾\n",
    }

    for _, line := range lines {
        _, err := file.WriteString(line)
        if err != nil {
            fmt.Printf("写入文件失败:%v\n", err)
            return
        }
    }

    err = file.Sync()
    if err != nil {
        fmt.Printf("同步文件失败:%v\n", err)
        return
    }

    fmt.Println("文件写入完成")
}

此版本通过切片批量写入内容,减少重复代码,并确保错误处理覆盖所有操作。

4. 主循环和选项处理

主循环中的input调用需更新为无参数版本:

for {
    fmt.Println(stringsetOM)
    sInput := input()  // 移除参数
    switch sInput {
    case "1":
        option1()
    case "2":
        option2()
    case "3":
        option3()
    default:
        fmt.Println("无效命令,请重新输入。")
    }
}

总结

以上优化解决了输入处理、错误管理和代码冗余问题。关键改进包括:

  • 使用bufio.Reader实现可靠输入。
  • 通过strings.Fields简化单词分割。
  • 消除文件操作中的重复打开。
  • 统一错误处理并提供详细反馈。

示例代码可直接替换原函数,提升程序的健壮性和可维护性。

回到顶部