【问题标题】:Opening Multiple files, alternatives to fopen()打开多个文件,替代 fopen()
【发布时间】:2013-10-03 08:55:35
【问题描述】:

我是一名新手程序员,对竞争性编程很感兴趣。 我最近为 COCI 问题做了一个评分器。在此代码的一个函数中,我使用循环从输入文件中获取输入。它的文件打开部分是这样的 -

int next(int id)
{

    // [[OPEN FILES]] -----------------------

    string name1 = probid+".in." + itoa(id);
    string name2 = probid + "OUTPUT" +".out." + itoa(id);

    FILE *fp1 = fopen(name1.c_str(), "r");   
    if(!fp1) return 0;                            // no file left?
    FILE *fp2 = fopen(name2.c_str(), "w");        

    // process data
}

"id" 更改并打开输入文件并将结果写入输出文件。 主要问题是我必须使用 (fscanf) 读取数据,但我想使用 cin、cout 获取输入。 (免费提供的东西)

但是当我使用 freopen 运行循环时,它无法从多个文件中读取输入。所以我必须使用 fopen()。

有没有我可以使用 cin, cout 通过这个函数从文件中获取输入?

【问题讨论】:

    标签: c++ stream fopen freopen


    【解决方案1】:

    std::cinstd::cout 是引用标准输入和标准输出的流对象。然而,在 C++ 中,我们也有文件流类:std::ifstreamstd::ofstream。它们使用完全相同的>><< 函数。

    这些文件流类有一个成员.open(),它可以打开一个新文件,前提是您已经关闭了之前的文件。

    【讨论】:

      【解决方案2】:

      你可以使用freopen()。

      freopen ("direcotry/to/input/file", "r", stdin); // second argument is opening mode

      freopen ("direcotry/to/output/file", "w", stdout);

      【讨论】:

      • 我无法使用 freopen 阅读。使用 freopen 我只能读取 1 个文件。无法阅读其余部分。 :-/ 这是cplusplus.com论坛上这个帖子的进度-cplusplus.com/forum/general/112428
      • 我参加了几场编程比赛,再也不用从一个文件中读取更多内容了。通常,freopen 是这些竞赛的 C++ 源代码模板的一部分。
      • 您正在使用两个文件,一个用于输入,一个用于输出。所以使用 freopen 两次,每次重定向不同的流。
      • 过去几年的COCI问题不能在线评分。但他们为这些问题提供了测试数据。由于有很多测试数据,(每个问题 5-10 个)对每个文件进行 I/O 非常耗时。所以这个程序从所有测试用例中读取数据,创建一个输出,并将其与官方输出相匹配,省去了手动运行所有用例的痛苦。完整代码ideone.com/TMbx3s
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多