find.exe的错误?

Arv*_*sen 7 windows command-line

在C++中,我们有一种方法来搜索文件中的文本.它通过将文件读取到变量并使用strstr来工作.但是当文件变得非常大时我们遇到了麻烦.

我以为我可以通过使用_popen调用find.exe来解决这个问题.它可以找到,除非这些条件都是真的:

  • 该文件的类型为unicode(BOM = FFFE)
  • 该文件完全是4096字节
  • 您要搜索的文本是文件中的最后一个文本

要重新创建,您可以这样做:

  1. 打开记事本
  2. 插入2046 X,然后插入A
  3. 另存为test.txt,encoding ="unicode"
  4. 验证该文件正好是4096字节
  5. 打开命令提示符并键入:find"A"/ c test2.txt - >无命中

我也试过这个:

  • 添加或删除X,您将获得一个命中(文件不再是4096字节)
  • 保存为UTF-8(并添加足够的X以便文件再次为4096字节),然后您就会受到影响
  • 在文件中间搜索一些东西(文件仍然是unicode和4096字节),你就会受到欢迎.

这是一个错误,还是我缺少的东西?

dbe*_*ham 4

非常有趣的错误。

这个问题促使我在 XP 和 Win 7 上做了一些实验 - 行为是不同的。

XP

ANSI - FIND 无法在单行上读取超过 1023 个字符(1023 个字节)。FIND 可以匹配超过 1023 个字符的行,只要搜索字符串在第 1024 个字符之前匹配即可。匹配行打印输出在 1023 个字符后被截断。

Unicode - FIND 无法在单行上读取超过 1024 个字符(2048 字节)。FIND 可以匹配超过 1024 个字符的行,只要搜索字符串在第 1025 个字符之前匹配即可。匹配行打印输出在 1024 个字符后被截断。

我觉得很奇怪,XP 上 Unicode 和 ANSI 的行限制不是相同的字节数,也不是简单的倍数。以字节表示的 Unicode 限制是 ANSI 限制的 2 倍加 1。

注意:截断匹配的长行也会截断换行符,因此下一个匹配行将显示为附加到上一行。如果使用 /N 选项,您可以看出这是一个新行。

7号窗口

ANSI - 我还没有找到可搜索的最大行长度的限制(尽管我没有非常努力地尝试)。任何超过 4095 个字符(4095 个字节)的匹配行都会在 4095 个字符后被截断。FIND 可以成功搜索一行中超过 4095 个字符,但它无法显示所有字符。

Unicode - 我还没有找到可搜索的最大行长度的限制(尽管我没有非常努力地尝试)。任何超过 2047 个字符(4094 字节)的匹配行都会在 2047 个字符后被截断。FIND 可以成功搜索一行中过去 2047 个字符,但它无法显示所有字符。

由于 Unicode 字节长度始终是 2 的倍数,并且最大 ANSI 可显示长度是奇数,因此 Unicode 的最大可显示行长度(以字节为单位)比 ANSI 少 1,这是有道理的。

但还有一个奇怪的 Unicode 错误。如果 Unicode 文件长度是 4096 字节的整数倍,则无法搜索或打印最后一个字符。文件包含单行或多行并不重要。它仅取决于总文件长度。

我发现有趣的是 4096 bug 的倍数在最大可打印行长度(以字节为单位)之一内。但我不知道这些行为之间是否存在关联,或者仅仅是巧合。

注意:截断匹配的长行也会截断任何换行符,因此下一个匹配行将显示为附加到上一行。如果使用 /N 选项,您可以看出这是一个新行。