从混合数据C ++文件中读取

时间:2013-05-15 17:13:51

标签: c++ string file-io getline

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

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()的内容,我可以从中选择一个精确的位置来启动输入?

1 个答案:

答案 0 :(得分: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/