与find.exe错误?

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

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

  • 该文件是unicode类型(BOM = FFFE)
  • 该文件是完全4096字节
  • 您正在搜索的文本是文件中的最后一个文本
  • 要重新创建,你可以这样做:

  • 打开记事本
  • 最后插入2046 X然后是A
  • 另存为test.txt,encoding =“unicode”
  • 验证该文件是完全4096字节
  • 打开命令提示符并输入:find“A”/ c test2.txt - > No hit
  • 我也试过这个:

  • 添加或删除一个X,你会得到一个命中(文件不是4096字节了)
  • 保存为UTF-8(并添加足够多的X,以使文件再次为4096个字节),并获得一个命中
  • 在文件中间搜索一些东西(文件仍然是unicode和4096字节),然后你会得到一个命中。
  • 这是一个错误,还是有什么我失踪?


    非常有趣的错误。

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

    XP

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

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

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

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

    窗口7

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

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

    由于Unicode字节长度始终是2的倍数,并且最大ANSI可显示长度是奇数,所以对于Unicode,最大可显示行长度(以字节为单位)比ANSI小1。

    但是,那么也有怪异的Unicode错误。 如果Unicode文件长度是4096字节的精确倍数,则不能搜索或打印最后一个字符。 如果文件包含单行或多行,则无关紧要。 它只取决于文件的总长度。

    我觉得有趣的是,4096错误的倍数在最大可打印行长度之内(以字节为单位)。 但我不知道这些行为之间是否存在关系,或者这只是巧合。

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

    链接地址: http://www.djcxy.com/p/70873.html

    上一篇: Bug with find.exe?

    下一篇: Best way in REST api to request a summary representation of a resource?