是否有类似于C sscanf的VB6功能?

时间:2011-06-01 09:23:39

标签: vb6 input

我正在尝试读取由以下格式的文本行组成的文件...

first value 1352.2      second value     12      third value    32323
first value 1233.2      second value     22      third value    23333
first value 1233.1      second value     21      third value    64344

所以我正在寻找一个与fscanf或sscanf类似的功能,一次性咀嚼每一行。是否有这样的功能,或者我必须手动分开每一行(有几种不同的行)。

4 个答案:

答案 0 :(得分:5)

没有等同于sscanf。我会用Mid()手动分开线。这很容易。

  • Mid(string, start, length)将返回一个子字符串,从字符start开始,length个字符长。
    • start从1开始 - 字符串中的第一个字符是数字1.
    • 仔细考虑startlength。如果文件包含非常大的数字,该文件会是什么样的?可能数字会进一步向左延伸(如果数字在文件中右对齐,这在我的经验中很常见 - 您的里程可能会有所不同)。
  • 使用Val将子字符串转换为数字

就个人而言,我会避免Input #Input #用于使用Write #读取从VB6编写的文件。如果您尝试使用Input #读取任意文件格式,则可能会遇到奇数边缘情况。

答案 1 :(得分:2)

虽然MarkJ已经为您提供了VB6的处理方式,但您可能需要查看FWIW:

http://www.freevbcode.com/ShowCode.asp?ID=3806

“C字符串函数SScanf和StrTok在VB中实现”

它实现了一个函数ScanString(),它应该是对sscanf()的仿真。

答案 2 :(得分:2)

给定这样的文件,你可以使用你喜欢的任何方法逐行读取文件,然后使用TrimSplit函数创建一个空格分隔字符串的字符串数组每一行。然后通过保留那些从True函数返回IsNumeric的元素来解析结果数组中的数字:

将它放在即时窗口中,看看它是如何工作的:

s = Split(Trim("first value 1352.2      second value     12      third value    32323"))

For x = LBound(s) To UBound(s): _
   ? "'", x, s(x), IsNumeric(s(x)): _
Next x

当您在Next x之后按Enter键时,您会看到这一点,其中每个数字后跟一个“True”:

'              0            first         False
'              1            value         False
'              2            1352.2        True
'              3                          False
'              4                          False
'              5                          False
'              6                          False
'              7                          False
'              8            second        False
'              9            value         False
'              10                         False
'              11                         False
'              12                         False
'              13                         False
'              14           12            True
'              15                         False
'              16                         False
'              17                         False
'              18                         False
'              19                         False
'              20           third         False
'              21           value         False
'              22                         False
'              23                         False
'              24                         False
'              25           32323         True

注意:我在每个打印行上放置了前导双引号,以便语法突出显示不会弄乱输出。

答案 3 :(得分:1)

对于大多数情况,Input语句应该足够了(可能有一些逻辑来检测行的类型并调用相关的输入语句)。

对VB6中的不同文件IO命令进行了相当全面的检查,其中一些很好的例子是读取用文件over here修复的'COBOL样式'。

如果您正在处理输入无法处理的奇怪或不一致的格式,正如您所说,可以手动分开。这可能是最好的选择,因为你提到有不同的格式。