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

Что является лучшим вариантом, если я хочу "обновить" старый C-код до более нового C ++ при чтении файла с разделителем точек с запятой:

/* reading in from file C-like: */
fscanf(tFile, "%d", &mypost.nr); /*delimiter ; */
fscanf(tFile, " ;%[^;];", mypost.aftername);/* delimiter ; */
fscanf(tFile, " %[^;]", mypost.forename);   /*delimiter ; */
fscanf(tFile, " ;%[^;];", mypost.dept);/*delimiter ; */
fscanf(tFile, " %[^;];", mypost.position);/* delimiter ; */
fscanf(tFile, "%d", &mypost.nr2);

//eqivalent best C++ method achieving the same thing?

Ответы [ 3 ]

11 голосов
/ 29 марта 2010

Вы можете перегрузить оператор правого сдвига в 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 - это файл, который вы открыли.

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

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

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

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

3 голосов
/ 29 марта 2010

Как говорит @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
}
1 голос
/ 29 марта 2010

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

IMHO, лучший способ сделать это - прочитать файл построчно и использовать регулярные выражения для разбора .

...