1 回答
TA贡献1811条经验 获得超5个赞
解决方案是打开文件两次,第一次是读取,第二次是覆盖内容。
请参阅下面的代码。
请注意,我使用reader.ReadString('\n')而不是ReadLine. 另请注意,我在测试错误之前写入输出。这是因为没有以 '\n' 结尾的最后一行与io.EOF错误一起返回。
func main() {
inFile, _ := os.Open("file.txt")
defer inFile.Close()
outFile, _ := os.OpenFile("file.txt", os.O_RDWR, 0777)
defer outFile.Close()
reader := bufio.NewReaderSize(inFile, 10*1024)
for {
line, err := reader.ReadString('\n')
outFile.WriteString(changeData(line))
if err != nil {
if err != io.EOF {
fmt.Println("error:", err)
}
break
}
}
}
我用这个changeData函数测试了代码,将小写字母变为大写字母,将大写字母变为小写字母。然后我们可以通过重复调用函数来测试更改。
func changeData(data string) string {
o := make([]rune, 0, len(data))
for _, r := range data {
if unicode.IsLetter(r) {
if unicode.IsUpper(r) {
o = append(o, unicode.ToLower(r))
} else {
o = append(o, unicode.ToUpper(r))
}
} else {
o = append(o, r)
}
}
return string(o)
}
此代码将覆盖文件的每一行。该行是否被修改取决于做什么changeData。
如果您想避免覆盖每一行,因为例如大多数行不需要更改,那么您必须寻找要覆盖数据的位置。
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报