2
def get_avail_mb(): int

    f: FILE = FILE.open("/proc/meminfo","r")
    s: string = ""
    while s.length < 200 do s += " "
    f.read(s, 200, 1)

    var a = s.split("\n")
    s = a[2]
    t: string = ""
    for var i = 0 to s.length
        if s[i] <= '9' && s[i] >= '0'
            t += s[i].to_string()
    return int.parse(t)/1000

请注意我如何将字符串分配给 200while s.length < 200 do s += " "个字符并从文件中将字节读入该字符串?除了追加空格字符 N 次之外,有没有更好的方法在 Genie 中将字符串的长度设置为 N 个字符?

4

2 回答 2

4

可能最好的方法是创建一个固定大小的数组作为缓冲区并将缓冲区转换为字符串。这避免了编译时的一些 C 警告。编译valac --pkg posix example.gs

[indent=4]
uses
    Posix

init
    print( @"Available memory: $(get_avail_mb()) MB" )

def get_avail_mb():int
    f:FILE = FILE.open("/proc/meminfo","r")
    buffer:uint8[200]
    f.read(buffer, 200, 1)

    result:int = 0
    match_result:MatchInfo
    if ( /^MemAvailable:\s*([0-9]*).*$/m.match(
                                            (string)buffer,
                                            0,
                                            out match_result
                                            ))
        result = int.parse( match_result.fetch( 1 ))/1000
    return result

或者,您可以尝试string.nfill ()

[indent=4]
uses
    Posix

init
    print( @"Available memory: $(get_avail_mb()) MB" )

def get_avail_mb():int
    f:FILE = FILE.open("/proc/meminfo","r")
    s:string = string.nfill( 200, ' ' )
    f.read(s, 200, 1)

    result:int = 0
    match_result:MatchInfo
    if ( /^MemAvailable:\s*([0-9]*).*$/m.match(
                                            s,
                                            0,
                                            out match_result
                                            ))
        result = int.parse( match_result.fetch( 1 ))/1000
    return result
于 2017-03-23T17:54:04.443 回答
0

是的,只是避免无法处理某些极端情况的可怕 for 循环!

于 2019-02-23T00:41:17.467 回答