-1

我有一个文件,其中的行如下所示:

File root://eoscms//eos/cms/store/group/alca_ecalcalib/EFlow/AlCaPhiSym_Run2012C_B0T/B0TV5/variablesTree_100_1_JLs.root - Run: 200786 - Events: 683159
File root://eoscms//eos/cms/store/group/alca_ecalcalib/EFlow/AlCaPhiSym_Run2012C_B0T/B0TV5/variablesTree_101_1_x4t.root - Run: 200786 - Events: 683530
File root://eoscms//eos/cms/store/group/alca_ecalcalib/EFlow/AlCaPhiSym_Run2012C_B0T/B0TV5/variablesTree_102_1_uPO.root - Run: 200786 - Events: 684342

....

现在,我想将所有 Run 和 Events 值放入一个向量中,跳过文件名。我怎么能那样做?C++ 中是否有类似 getline() 的东西,我可以在其中选择要开始输入的精确位置?

4

1 回答 1

1

如果文件中的所有行都遵循该确切格式,则可以执行以下操作:

freopen("myfile.txt", "r", stdin);

int run, event;
while(scanf("%*s") != EOF){
    scanf("%*s - Run: %d - Events: %d", &run, &event);
    // runs.push_back(run)...
}

但是请注意,说明%*s符将通读并忽略任何单个字符串而不存储它,因此scanf("%*s")除非您已到达文件末尾,否则将始终返回 0。这意味着如果您的文件有额外的带有不同格式文本的行,您将需要存储该行的第一个字符串并使用它的值来确定您接下来应该采取什么行动,而不是像上面的代码那样盲目地丢弃它. 否则,您可以将整体scanf放在一行中。

对于此代码,您将需要#include <cstdio>更多信息:http ://www.cplusplus.com/reference/cstdio/scanf/

于 2013-05-15T17:47:30.373 回答