3

正常に読み取られたアイテムの数を返すなどの関数sscanfは、エラーチェックに役立ちます。たとえば、sscanfは3を返すため、以下のコードは「失敗」と出力します(1、2、3は読み取られましたが、「テキスト」は数値ではありませんでした) 。

QTextStreamエラーチェックのための同等の方法を提供しますか?

const char *text = "1 2 3 text";
int a, b, c, d;
if (4 != sscanf(text, "%d %d %d %d", &a, &b, &c, &d))
    printf("failed");
QString text2 = text;
QTextStream stream(&text2);
stream >> a >> b >> c >> d; // how do I know that d could not be assigned?
4

2 に答える 2

7

読んだ後、次を呼び出すことでストリームのステータスを照会できますstream.status()

if (stream.status() == QTextStream::Ok) 
{
    // succeeded
} 
else
{
    // failed
}
于 2012-11-29T10:16:00.393 に答える
0

とにかく、そのsscanfチェックはおそらく十分ではありませんでした:-(

多くの場合、開発者はオーバーフローなどのエラーをさらに探したいと思うでしょう。

const char *text = "1 2 3 9999999999";
int a, b, c, d;
if (4 != sscanf(text, "%d %d %d %d", &a, &b, &c, &d))
    printf("failed");
printf("Numbers: %d %d %d %d\n", a, b, c, d);
// But because of an overflow error, that code can
// print something unexpected, like: 1 2 3 1410065407
// instead of "failed"

補助文字列は、入力エラーを検出するために使用できます。次に例を示します。

const char *text = "1 9999999999 text";
QString item1, item2, item3, item4;
QTextStream stream(text);
stream >> item1 >> item2 >> item3 >> item4;
int a, b, c, d;
bool conversionOk; // Indicates if the conversion was successful
a = item1.toInt(&conversionOk);
if (conversionOk == false)
    cerr << "Error 1." << endl;

b = item2.toInt(&conversionOk);
if (conversionOk == false)
    cerr << "Error 2." << endl;

c = item3.toInt(&conversionOk);
if (conversionOk == false)
    cerr << "Error 3." << endl;

d = item4.toInt(&conversionOk);
if (conversionOk == false)
    cerr << "Error 4." << endl;

「エラー2」、「エラー3」が出力されます。および「エラー4」。

注:cin、cout、cerrは、次のように定義することもできます。

QTextStream cin(stdin, QIODevice::ReadOnly);
QTextStream cout(stdout, QIODevice::WriteOnly);
QTextStream cerr(stderr, QIODevice::WriteOnly);
于 2014-01-06T18:02:47.110 に答える