如何用Go实现DIC文件追加写入:不覆盖不删除原有内容
解决Go程序中字符比对与追加写入DIC文件的问题
针对你需要实现的屏幕阅读器DIC文件安装需求——提取file1中存在但file2中没有的字符,追加到目标文件且不覆盖原有内容,以下是修正后的完整实现方案:
核心实现思路
- 读取file2的所有字符,存入map集合以实现快速查找
- 遍历file1的字符,筛选出未在file2中出现过的字符
- 以追加模式打开目标文件,将筛选出的字符写入
完整可运行代码
package main import ( "bufio" "fmt" "os" ) func main() { // 替换为实际文件路径 file1Path := "file1.dic" file2Path := "file2.dic" targetPath := "target.dic" // 读取file2,构建字符存在性映射 file2CharMap := make(map[rune]bool) file2, err := os.Open(file2Path) if err != nil { fmt.Printf("打开file2失败: %v\n", err) return } defer file2.Close() scanner := bufio.NewScanner(file2) scanner.Split(bufio.ScanRunes) // 按单个字符扫描,兼容多字节字符 for scanner.Scan() { char := []rune(scanner.Text())[0] file2CharMap[char] = true } if scanner.Err() != nil { fmt.Printf("读取file2出错: %v\n", scanner.Err()) return } // 读取file1,筛选缺失字符 var missingChars []rune file1, err := os.Open(file1Path) if err != nil { fmt.Printf("打开file1失败: %v\n", err) return } defer file1.Close() scanner = bufio.NewScanner(file1) scanner.Split(bufio.ScanRunes) for scanner.Scan() { char := []rune(scanner.Text())[0] if !file2CharMap[char] { missingChars = append(missingChars, char) file2CharMap[char] = true // 标记已处理,避免重复追加 } } if scanner.Err() != nil { fmt.Printf("读取file1出错: %v\n", scanner.Err()) return } // 追加写入目标文件 if len(missingChars) == 0 { fmt.Println("无需要追加的字符") return } targetFile, err := os.OpenFile(targetPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Printf("打开目标文件失败: %v\n", err) return } defer targetFile.Close() writer := bufio.NewWriter(targetFile) _, err = writer.WriteString(string(missingChars)) if err != nil { fmt.Printf("写入目标文件出错: %v\n", err) return } writer.Flush() fmt.Printf("成功追加%d个字符到目标文件\n", len(missingChars)) }
关键细节说明
- 文件打开模式:使用
os.O_APPEND|os.O_CREATE|os.O_WRONLY确保:- 目标文件不存在时自动创建
- 存在时仅在末尾追加内容,完全不会覆盖原有数据
- 字符处理兼容性:通过
bufio.ScanRunes按单个字符扫描,支持UTF-8编码的多字节字符(如中文、特殊符号) - 去重逻辑:将已筛选的字符标记到map中,避免file1内的重复字符被多次追加
- 错误处理:每个IO操作都包含错误检查,确保程序在文件异常时能给出明确提示
DIC文件适配注意事项
如果你的DIC文件是按词条行存储(而非单字符),只需将扫描方式改为bufio.ScanLines,并将map的键类型改为string即可,核心逻辑保持一致。
内容的提问来源于stack exchange,提问作者Aliakbar SMMS
相关产品推荐
相关产品推荐

