2

我用 fstream 读取了一个 ascii 文件。一行包含以下模式的至少两次重复(最多 128 次):

 %d %llu %d %d %llu %d %d %llu

对于每一行,我需要该行中每个模式的第三个 %d 的最大值

我找不到使用 sscanf 正确执行此操作的方法。

myFstreams->getline (buffer, MAX_BUFF-1);
while( ... ){
    sscanf (buffer," %*d %*llu %*d %d %*llu %*d %*d %*llu",&number);
    if(number>max) max=number;
    //modify buffer ???
}

任何帮助将不胜感激。

4

3 回答 3

5

您的方法看起来不错,用于%*抑制分配的荣誉。

您需要添加代码来检查 的返回值sscanf(),并循环直到它失败(即它不返回1)。在循环中,通过将每个转换后的值与您迄今为止看到的最大值进行比较来保持最大值。

更新:我意识到我没有考虑同一行方面的重复模式。哦。我认为一种解决方案是%n在模式的末尾使用说明符。这将写入(通过和int *参数)处理的字符数,从而允许您在下一次调用的行中前进sscanf()

于 2012-09-10T12:57:06.537 回答
1

类似的东西怎么样:(未经测试的代码)

#include <limits>
#include <sstream>
...

std::string line;
while(std::getline(input_stream,line))//delimit by /n
{
    auto line_ss = std::stringstream(line);
    std::string token;
    int number = std::numeric_limits<int>::min();
    int k=0;
    while(std::getline(line_ss,token,' '))//delimit by space
    {
        if(k == 3) // 3rd number
        {
            int i3;
            std::stringstream(token) >> i3; 
            number = std::max(number,i3)
        }

        k = k == 7 ? 0: k+1; //8 numbers in the set
    }
}
于 2012-09-10T13:14:16.553 回答
1

有一种“秘密”类型由 使用scanf而不被使用printf,这就是为什么它经常被遗忘:%n

while( ... )
{
    //%n gives number of bytes read so far
    int bytesRead =0;
    sscanf (buffer," %*d %*llu %*d %d %*llu %*d %*d %*llu%n",&number, &bytesRead);
    if(number>max)
        max=number;
    buffer +=bytesRead;//be cautious here if using UTF-8 or other MCBS
}
于 2012-09-10T13:28:29.237 回答