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

关键修改:

  1. 使用字符串拼接或strings.Builder累积字符
  2. 使用fmt.Fprint()替代fmt.Fprintln()避免自动换行
  3. 修正数组索引从0开始
  4. 添加defer f.Close()确保文件正确关闭
回到顶部