Каков современный эквивалентный (С++) стиль для более старого (C-like) метода fscanf?
Каков наилучший вариант, если я хочу "обновить" старый 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?
Ответы
Ответ 1
Вы можете перегрузить оператор сдвига вправо для 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 Спасибо, что указали это, я забыл прочесть пробелы. Я обновил ответ, считая, что forename и aftername, вероятно, содержат пробелы. И был этот довольно смущающий бит о разделителях, которые были двукратными...
Я просто проверил его, используя определение структуры, как показано ниже:
struct mypost_struct {
int nr;
char forename[255], aftername[255];
int dept, position, nr2;
};
.. и результат был таким, как ожидалось.
Ответ 2
Как сообщает @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
Каков наилучший вариант, если я хочу "обновить" старый C-код до более нового С++...?
IMHO, лучший способ сделать это - прочитать файл по очереди и использовать регулярные выражения для синтаксического анализа.