Каков современный эквивалентный (C ++) стиль для более старого (C-like) метода fscanf?

Вы можете инициировать событие «change» самостоятельно. Немного сложно избежать пусковых переключателей, бесконечно вызывающих событие «change» друг на друга, но это можно сделать следующим образом:

$('input[type="radio"]').each(function() {
    var name = $(this).attr('name');
    var that = this;
    $('input[name="'+name+'"][type="radio"]').not(that)
        .on('change', function(e, alreadyTriggered) {
            if(!alreadyTriggered || alreadyTriggered.indexOf(this) == -1) {
                if(!alreadyTriggered) {
                    alreadyTriggered = [that];
                }
                alreadyTriggered.push(this);
                $(that).trigger('change', [alreadyTriggered]);
            }
    });
});

Вот демо из приведенного выше кода на работе.

11
задан Péter Török 29 March 2010 в 11:38
поделиться

3 ответа

Вы можете перегрузить оператор сдвига вправо в istream для своей структуры, так что:

std::istream& operator>>(std::istream& is, mypost_struct& mps) {
    is >> mps.nr;
    is.ignore(1, ';');
    is.getline(mps.forename, 255, ';');
    is.getline(mps.aftername, 255, ';');
    is >> mps.dept;
    is.ignore(1, ';');
    is >> mps.position;
    is.ignore(1, ';');
    is >> mps.nr2;

    return is;
}

Впоследствии ввод так же прост, как is >> mypost; , где is is файл, который вы открыли.

Edit: @UncleBens Спасибо, что указали на это, я забыл принять во внимание пробелы. Я обновил ответ, предполагая, что имя и имя могут содержать пробелы. И был довольно смущающий момент о том, что разделители заключены в двойные кавычки ...

Я только что проверил это, используя определение структуры, как показано ниже:

struct mypost_struct {
    int nr;
    char forename[255], aftername[255];
    int dept, position, nr2;
};

.. и результат был таким, как ожидалось.

11
ответ дан 3 December 2019 в 08:03
поделиться

Как говорит @susmits, но вы также можете использовать возвращенный поток как условный, например:

if (is >> mps.nr && is.ignore(1, ";") && is >> mps.aftername && ...) {
   // all is well ...
} else {
   // bad input format
}

или даже:

if (is >> mps.nr >> ignore(";") >> mps.aftername >> ...) {
    // all is well ...
} else {
    // bad input format
}
3
ответ дан 3 December 2019 в 08:03
поделиться

Каков наилучший вариант, если я хочу "обновить" старый C-код до более нового C++...?

ИМХО, лучшим способом сделать это будет построчное чтение файла и использование регулярных выражений для разбора.

1
ответ дан 3 December 2019 в 08:03
поделиться