go - Go ReadString 问题:文件名、目录名或卷标语法不正确
问题描述
任何人都可以解决这个问题吗?我认为问题可能出在 readstring() 参数被传递给创建文件函数时。我尝试通过剥离 '\n' 来解决它,但错误仍然存在。除了 readstring() 还有其他解决方法吗?因为我认为这是导致问题的原因。谢谢
package main
import (
"fmt"
"bufio"
"log"
"strings"
//"io/ioutil"
"os"
)
func main() {
fmt.Print("Enter filename to create: ")
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
text = strings.TrimSuffix(text, "\n")
if len(text) > 3 {
//newFile, err := os.Create(text)
fmt.Println("Name:"+text)
createFile(text)
} else {
fmt.Println("invalid filename")
}
}
func createFile(fileName string){
var newFile *os.File
var err error
fmt.Println(fileName)
newFile, err = os.Create(fileName)
if err != nil {
log.Fatal(err)
}
newFile.Close()
}
好的,对于那些不熟悉这个问题的人,我已经设法使用 scanf 找到解决方法。所以认为这个问题解决了。
解决方案
从基本的调试技术开始:检查错误并检查输入。
代替
text, _ := reader.ReadString('\n')
和
text, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q\n", text)
例如,
so1.go
:
package main
import (
"bufio"
"fmt"
"log"
"strings"
//"io/ioutil"
"os"
)
func main() {
fmt.Print("Enter filename to create: ")
reader := bufio.NewReader(os.Stdin)
text, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q\n", text)
text = strings.TrimSuffix(text, "\n")
if len(text) > 3 {
//newFile, err := os.Create(text)
fmt.Println("Name:" + text)
createFile(text)
} else {
fmt.Println("invalid filename")
}
}
func createFile(fileName string) {
var newFile *os.File
var err error
fmt.Println(fileName)
newFile, err = os.Create(fileName)
if err != nil {
log.Fatal(err)
}
newFile.Close()
}
输出:
>go run so1.go
Enter filename to create: test.file
"test.file\r\n"
Name:test.file
test.file
: The filename, directory name, or volume label syntax is incorrect.
exit status 1
在 Windows 上,该行以“ \r\n
”结尾。
代替
text = strings.TrimSuffix(text, "\n")
和
text = strings.TrimSuffix(text, "\n")
text = strings.TrimSuffix(text, "\r")
例如,
so2.go
:
package main
import (
"bufio"
"fmt"
"log"
"strings"
//"io/ioutil"
"os"
)
func main() {
fmt.Print("Enter filename to create: ")
reader := bufio.NewReader(os.Stdin)
text, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q\n", text)
text = strings.TrimSuffix(text, "\n")
text = strings.TrimSuffix(text, "\r")
if len(text) > 3 {
//newFile, err := os.Create(text)
fmt.Println("Name:" + text)
createFile(text)
} else {
fmt.Println("invalid filename")
}
}
func createFile(fileName string) {
var newFile *os.File
var err error
fmt.Println(fileName)
newFile, err = os.Create(fileName)
if err != nil {
log.Fatal(err)
}
newFile.Close()
}
输出:
>go run so2.go
Enter filename to create: test.file
"test.file\r\n"
Name:test.file
test.file
现在程序可以工作了,删除这个调试语句:
fmt.Printf("%q\n", text)
推荐阅读
- mysql - MySql Query-根据日期排除重复记录
- java - 在 HijrahChronology 中配置自定义变体以进行日期校正 jdk 8
- python - 如何在python中交织2个列表?
- c# - C# UWP 按钮没有按照我想要的方式对齐
- python-3.x - 当您不知道文件夹名称是什么时,如何将随机命名文件夹的内容移动到新位置?
- java - 为什么删除功能在我的 jsp 文件中不起作用?
- java - Jaxb2Marshaller 如何保存 JAXBContext
- html - 锚标记在 Outlook 中不可点击
- python - 如何将一个字符串分成多行单独的字符
- bazel - 通过 Bazel 使用 Spark 库的 ClassNotFoundException