我试图在Go中编写一个扫描程序,以扫描连续行,并在返回之前清理掉行,以便您可以返回逻辑行。因此,给定以下SplitLine函数(Play):
func ScanLogicalLines(data []byte, atEOF bool) (int, []byte, error) {
if atEOF && len(data) == 0 {
return 0, nil, nil
}
i := bytes.IndexByte(data, '\n')
for i > 0 && data[i-1] == '\\' {
fmt.Printf("i: %d, data[i] = %q\n", i, data[i])
i = i + bytes.IndexByte(data[i+1:], '\n')
}
var match []byte = nil
advance := 0
switch {
case i >= 0:
advance, match = i + 1, data[0:i]
case atEOF:
advance, match = len(data), data
}
token := bytes.Replace(match, []byte("\\\n"), []byte(""), -1)
return advance, token, nil
}
func main() {
simple := `
Just a test.
See what is returned. \
when you have empty lines.
Followed by a newline.
`
scanner := bufio.NewScanner(strings.NewReader(simple))
scanner.Split(ScanLogicalLines)
for scanner.Scan() {
fmt.Printf("line: %q\n", scanner.Text())
}
}
我希望代码返回类似以下内容:
line: "Just a test."
line: ""
line: "See what is returned, when you have empty lines."
line: ""
line: "Followed by a newline."
但是,它在返回第一行后停止。第二个电话返回1, "", nil
。
任何人有任何想法,还是一个错误?
我认为这是一个错误,因为即使返回的令牌为nil(bufio.SplitFunc),也不会将Advance
value> 0用作进一步的读取调用:
如果数据尚未持有完整的令牌,例如,如果在扫描行时没有换行符,则SplitFunc可以返回(0,nil),以指示扫描程序将更多数据读入切片,并尝试以更长的切片开始于输入中的相同点。
bufio.Scanner
默认的输入缓冲区为4096字节。这意味着它会一次读取最多此数量的内容,然后执行split功能。在您的情况下,扫描器可以一次读取所有输入,因为它远低于4096字节。
这意味着下一次读取将产生结果,EOF
这是这里的主要问题。
scanner.Scan
读取您的所有数据nil
通过从比赛中删除换行符来作为令牌返回scanner.Scan
假设:用户需要更多数据scanner.Scan
尝试阅读更多EOF
发生scanner.Scan
尝试最后一次标记化"Just a test."
scanner.Scan
尝试最后一次标记化nil
通过从比赛中删除换行符来作为令牌返回scanner.Scan
看到nil
令牌并设置错误(EOF
)任何非null的令牌都将阻止这种情况。只要您返回非零令牌,扫描程序就不会检查EOF
并继续执行令牌生成器。
您的代码返回nil
令牌的原因是什么也没做就bytes.Replace
返回
。。你可以阻止这种通过用容量返回片并没有元素,因为这将是非零:。nil
append([]byte(nil), nil...) == nil``make([]byte, 0, 1) != nil
问题内容: 我的Java作业有问题。我遇到了意外的异常,特别是: java.util.NoSuchElementException:找不到行 我正在使用,该程序不断读取任何内容,并重复“无效格式”异常文本。如果输入正确的值,则第一部分通过,然后该部分立即进入此异常。如果输入的值不正确,则它将开始循环异常。 这是我的代码: 问题答案: 您关闭了多个库,这些库关闭了底层库,因此另一个库将不再从同一库和
问题内容: 使用Scanner类中的useDelimiter时遇到一些问题。 如果我有这个输入 美国广播公司 输出将是 AB 然后等到我键入另一个“-”以打印出最后一个字符 但是,如果我没有用户输入数据,而是将字符串插入到Scanner中,则代码将起作用。原因是什么?如何解决?我不想使用StringTokenzier 问题答案: 如果没有等待您输入另一个,则将错误地假定您已完成输入。 我的意思是,
我做了一个程序,要求3个整数来输出三角形的类型。所有内容都成功运行和编译,但是,在要求用户查看是否要再次循环的部分,联机编译器会输出错误: 异常线程"main"java.util.NoSuchElement异常在java.util.Scanner.throwFor(Scanner.java:838)在java.util.Scanner.next(Scanner.java:1347)在Assignm
只是想知道在我完成输入后如何终止程序?因为在几次“输入”之后扫描仪仍然会继续,假设我要继续输入...我试过了: 和 它们不起作用....程序继续运行,打乱了初衷,
问题内容: 如何将扫描仪的定界符设置为;或换行? 我试过: 但这不起作用。 问题答案: 通常,在模式中,您需要将翻倍。 所以,尝试 要么 编辑 :如果是问题,则可能要尝试以下操作: 它匹配的一个或多个,和。 注意 :我还没有尝试过这些。
问题内容: 我有一个创建多个对象并将其放入一个类的类,如下所示: 我有一个从控制台扫描输入“ add”的应用程序,如果找到该应用程序,则调用如下所示的方法: 该应用程序应允许用户根据需要多次输入“添加”,但是在add调用该方法后将出现错误“找不到行” 。 我猜这是因为方法中的尚未关闭,然后在需要时重新打开。这是程序的问题吗?如果是,我将如何修复它? 请注意,该程序尚未完成,因为我将添加一种出售这些