Golang中为什么接收的每个字符都保存为文件新行
Golang中为什么接收的每个字符都保存为文件新行
f, err := os.Create("lines")
if err != nil {
fmt.Println(err)
f.Close()
return
}
for {
var r [10]rune
var s string
var poo int = 1
poo=poo+1
fmt.Scanf("%c",&r[poo])
s = fmt.Sprintf("%c", r[poo])
d := []string{s}
for _, v := range d {
fmt.Fprintln(f, v)
if err != nil {
fmt.Println(err)
return
}
}
更多关于Golang中为什么接收的每个字符都保存为文件新行的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
因为你使用了 Fprintln,它在写入时会为字符串追加一个换行符。
func main() {
fmt.Println("hello world")
}
更多关于Golang中为什么接收的每个字符都保存为文件新行的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题出在fmt.Fprintln(f, v)的使用上,它会在写入的字符串后自动添加换行符。同时,代码中存在逻辑错误,会导致每个字符单独写入并换行。
以下是修正后的代码示例:
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Create("lines")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var r [10]rune
var poo int = 0 // 修正:从0开始索引
var s string
for poo < 10 {
_, err := fmt.Scanf("%c", &r[poo])
if err != nil {
fmt.Println(err)
break
}
s += fmt.Sprintf("%c", r[poo]) // 拼接字符
poo++
}
// 一次性写入所有字符,不自动换行
_, err = fmt.Fprint(f, s)
if err != nil {
fmt.Println(err)
return
}
}
或者使用strings.Builder更高效地拼接:
package main
import (
"fmt"
"os"
"strings"
)
func main() {
f, err := os.Create("lines")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var r [10]rune
var poo int = 0
var builder strings.Builder
for poo < 10 {
_, err := fmt.Scanf("%c", &r[poo])
if err != nil {
fmt.Println(err)
break
}
builder.WriteRune(r[poo])
poo++
}
_, err = fmt.Fprint(f, builder.String())
if err != nil {
fmt.Println(err)
return
}
}
关键修改:
- 使用字符串拼接或
strings.Builder累积字符 - 使用
fmt.Fprint()替代fmt.Fprintln()避免自动换行 - 修正数组索引从0开始
- 添加
defer f.Close()确保文件正确关闭

