对于旧的(类似C的)fscanf方法,现代等价(C++)样式是什么?

Chr*_*_45 11 c c++ scanf

如果我想在使用分号分隔符读取文件时将旧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?
Run Code Online (Sandbox Code Playgroud)

sus*_*its 11

您可以在istream上为您的struct重载右移运算符,因此:

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;
}
Run Code Online (Sandbox Code Playgroud)

随后,输入很简单,只要is >> mypost;,这里is是你已经打开的文件.

编辑:@UncleBens感谢您指出这一点,我忘了考虑空间.我已经更新了答案,假设forename和aftername可能包含空格.关于分隔符的双重引用,这有点令人尴尬......

我只是使用结构定义检查它,如下所示:

struct mypost_struct {
    int nr;
    char forename[255], aftername[255];
    int dept, position, nr2;
};
Run Code Online (Sandbox Code Playgroud)

..结果如预期的那样.