11

如果我想在读取带有分号分隔符的文件时将旧的 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?
4

3 回答 3

11

您可以为您的结构重载 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

编辑:@UncleBens 感谢您指出这一点,我忘了考虑空格。我已经更新了答案,假设前名和后名可能包含空格。还有一个关于分隔符被双引号引起的相当尴尬的地方......

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

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

..结果如预期。

于 2010-03-29T11:49:04.197 回答
3

正如@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
}
于 2010-03-29T11:59:18.210 回答
1

如果我想将旧的 C 代码“升级”到新的 C++,最好的选择是什么……?

恕我直言,最好的方法是逐行读取文件并使用正则表达式进行解析

于 2010-03-29T17:54:58.020 回答