2

fstreamでASCIIファイルを読みました。行には、次のパターンの少なくとも2回の繰り返し(最大128回)が含まれます。

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

各行について、行の各パターンの3番目の%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) 必要があります。ループ内で、変換された各値をこれまでに確認した最大値と比較して、最大値を維持します。

更新:同じ行の側面で繰り返しパターンを考慮していないことに気付きました。ああ。%n1 つの解決策は、パターンの最後に指定子を使用することだと思います。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によって使用され、 によってではなく使用される「秘密の」タイプが 1 つあります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 に答える