- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小问题。我正在尝试从文件中读取一个程序,然后在另一个文件中写入完全相同的内容。我已经使它工作了,但是我发现如果我使用goroutines对其进行了一点修改,它应该会运行得更快。我将读写分为不同的功能,并试图使它们进行通信。他们似乎可以正常通信,但是写入功能似乎实际上并未将任何内容写入目标文件。问题是,当我选择一个比简单的短文本文件大得多的文件时,它确实会写,但不是全部,它会丢失东西。
谁能确切告诉我这怎么可能出错?我的代码在这里:
func main() {
// Creating channels
messages := make(chan byte)
status := make(chan bool)
finished := make(chan bool)
fmt.Printf("Reporting from main thread. Created the channels, go routines will follow.\n")
go readFileRoutine("file", messages, status, finished)
fmt.Printf("Reporting from main thread, readFileRoutine has been let go.\n")
go writeFileRoutine("destination", messages, status)
fmt.Printf("Reporting from main thread, writeFileRoutine has been let go. Waiting on status message\n")
<-finished
close(status)
fmt.Printf("Success!\n")
}
func readFileRoutine(filename string, messages chan byte, status chan bool, finished chan bool) {
file, err := os.Open(filename)
check(err)
buff := bufio.NewReader(file)
fmt.Printf("Reporting from readFileRoutine, initialised. Will start reading now!\n")
for {
byti, err := buff.ReadByte()
fmt.Printf("Read character %c\n", byti)
if err == io.EOF { //If EOF break for loop and finish off
readFinished = true
break
}
<-status // Waiting for status message from writeFileRoutine
messages <- byti //Putting next message on channel, then buffering next character
}
fmt.Printf("Reporting from readFileRoutine, finished reading and putting messages on channel, will now wait on writer to finish\n")
//fmt.Printf("Reporting from readFileRoutine, finished with reading. Closing file and messages channel now\n")
file.Close()
<-status
fmt.Printf("Reporting from readFileRoutine, moving on to closing messages channel. Received status from writer correctly!\n")
close(messages)
<-status
fmt.Printf("Reporting from readFileRoutine, closed messages channel, will report status on the finished channel.\n")
finished <- true
}
func writeFileRoutine(filename string, messages chan byte, status chan bool) {
file, err := os.Create(filename) // Creates a new file
check(err)
buf := bufio.NewWriter(file) //New file writer
fmt.Printf("Reporting from writeFileRoutine, initialised. Will start writing now!\n")
status <- true
for readFinished == false {
bit := <-messages // Wait for receiving
fmt.Printf("Received message %c\n", bit)
buf.WriteByte(bit)
fmt.Printf("Written byte %c\n", bit)
status <- true //Sending status to readFileRoutine, done writing and waiting for next character
}
fmt.Printf("Reporting from writeFileRoutine, read all messages from reader and put them in a file\n")
file.Close()
fmt.Printf("Reporting from writeFileRoutine, closed file, will put true on status channel and exit\n")
status <- true
}
最佳答案
正如Martin在评论中指出的那样,我只是忘记了Writer.Flush()函数。我将buf.Flush()紧接在buf.WriteByte(bit)之后,并对其进行了修复。
关于go - Golang Bufio WriteByte未写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61457833/
代码如下所示: package main import ( "bufio" "fmt" "io" "log" "os" ) func main() {
我在互联网上看到过几条宣传语,它们松散地谈论了为什么应该使用 bufio.Scanner 而不是 bufio.Reader。 我不知道我的测试用例是否相关,但我决定在从文本文件中读取 1,000,00
我想通过尝试再读取一个字节(并捕获 EOF)来确认没有更多的字节可以从缓冲读取器(既不是来自内部缓冲区,也不是来自底层文件对象)中读取。 使用 bufio.Read 或 bufio.ReadByte
我正在使用 bufio.Scanner,我不确定是否应该给它一个由 bufio.Reader 包装的阅读器。 即,f 是一个 os.File,我应该: scanner := bufio.NewScan
我有 2 个进程通过 TCP 套接字进行通信。 A 方向 B 方发送一个字符串,该字符串有时使用标准加密/密码包进行加密。结果字符串可能包含一个换行符,但 B 端的 bufio 扫描器将其解释为请求的
我有一个小问题。我正在尝试从文件中读取一个程序,然后在另一个文件中写入完全相同的内容。我已经使它工作了,但是我发现如果我使用goroutines对其进行了一点修改,它应该会运行得更快。我将读写分为不同
我有下一个代码: resp, err := http.Get("https://www.google.com") if err != nil{ panic(err) } r := bufio.
我试图了解 bufio ReadBytes 在接收大数据包时的行为。我在 MTU=9001 的 unix 机器的 eth0 上运行一个简单的 Golang TCP 服务器。客户端是一台单独的机器(没有
我对 Golang 还很陌生;以前使用过 Python。 我很难在对象中应用 bufio。 type fout struct { filename string fo File
我使用 golang 接收 mtr 信息,并在一些工作后将其发送到 os.stdout但是输出是无序的。下面的代码 scanner := bufio.NewScanner(os.Stdin)
以免我提供an XY problem ,我的目标是在多个 goroutine 之间共享一个内存映射文件 as recommended .每个 goroutine 都需要逐行遍历文件,所以我希望先将完整
我正在尝试调整 bufio.ScanLines,以便它知道转义的新行 \\n。 输入: line1 \ continues on line2 预期输出: ["line1 continues on li
我需要模拟 bufio Reader用于检测。特别是 ReadString API。 func NewReader(rd io.Reader) *Reader func (b *Reader) Rea
多个goroutines可以同时调用bufio Read函数吗?我阅读了 bufio 的源代码,看起来它没有适当的方法来保护缓冲区只能由一个 goroutine 读取。 最佳答案 不,从缓冲区读取不是
我正在使用 bufio 为文本文件中的每一行执行一个 for 循环。我不知道如何计算行数。 scanner := bufio.NewScanner(bufio.NewReader(file)) 上面是
我有这个代码: var scanner = bufio.NewScanner(os.Stdin) func readInt() int { scanner.Scan() ans, _
我用它来收集输入并显示输入,但是当我这样做时,“something”文本将显示在新行中,但我希望文本显示在同一行中,有什么想法吗? func main() { fmt.Println("Exa
如何使用 bufio.ScanWords 和 bufio.ScanLines 函数来计算字数和行数? 我试过: fmt.Println(bufio.ScanWords([]byte("Good day
我有此监听器功能,可在网络上监听来自其对等方的消息。 它必须在一定时间内可以正常工作,但是当它同时接收到两条消息时,出现以下错误: “💬消息解码错误-缓冲区中有多余数据” 可以将其修改为同时允许多消
我有以下代码片段 package main import ( "os/exec" "bufio" "fmt" ) func main() { cmd := exec.Command("
我是一名优秀的程序员,十分优秀!