【问题标题】:Reading from a mixed data C++ file从混合数据 C++ 文件中读取
【发布时间】:2013-05-10 09:14:53
【问题描述】:

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

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() 的东西,我可以在其中选择要开始输入的精确位置?

【问题讨论】:

  • 你为什么不能只使用fscanffscanf( fp, "10[abc]", buf );
  • 抱歉,我不知道该怎么做
  • 然后尝试阅读此内容。 randygaul.net/2013/02/07/fscanf-power
  • 谢谢。我不明白 10[abc]
  • 10 限制了将多少个字符读入缓冲区。

标签: c++ string file-io getline


【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多