c++ - 如何从 C++ 中的文件中随机获取信息?

标签 c++ file ifstream information-retrieval ofstream

我正在用 C++ 创建一个问答游戏。因此,主要要求是每次程序运行时都应从文件中随机提取问题。那么,如何在 C++ 中执行此操作? 考虑以下两个简单的程序。

写.cpp

#include <iostream>
#include <fstream>
#include <string>
using std::cout;
using std::ofstream;
using std::string;
int main()
{
    ofstream fout("test.txt");
    if(!fout)
        cout<<"Error in opening file";
    string s[3];
    s[0]="C++ provides object oriented string handling";
    s[1]="C++ provides object oriented exception handling";
    s[2]="C++ provides highest flexibility to the programmer";
    for(int i=0;i<3;i++)
        fout<<s[i]<<'\n';
    fout.close();
}

读取.cpp

#include <iostream>
#include <fstream>
#include <string>
using std::cout;
using std::string;
using std::ifstream;
int main()
{
    ifstream fin("test.txt");
    if(!fin)
        cout<<"Error in opening file";
    string s[3];
    for(int i=0;i<3;i++)
        getline(fin,s[i]);
    for(int i=0;i<3;i++)
        cout<<s[i]<<'\n';
    fin.close();
}

我应该怎么做才能在编译 Read.cpp 和运行 Read.exe 文件时从文件中随机提取 3 个字符串并显示出来?

非常感谢您的帮助。

最佳答案

如果您想按照从文件中读取它们的顺序维护字符串数组

您可以通过创建另一个包含数字 [1, 2 .. n-1](其中 n 是字符串的数量)的整数数组然后将其打乱以获得随机的索引序列来实现这一点,您可以用于打印字符串。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

using std::cout;
using std::string;
using std::ifstream;

int main()
{
    ifstream fin("test.txt");
    if(!fin)
        cout<<"Error in opening file";

    std::vector<string> lines;
    string line;
    while (getline(fin, line))
          lines.push_back(line);

    // Create a std::vector containing {1, 2 .. n-1} 
    // and shuffle it to obtain a random ordering.
    std::vector<int> order;
    for (int i = 0; i < lines.size(); ++i)
    {
       order.push_back(i);
    }

    // C++11
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // Seed from current time.
    auto engine = std::default_random_engine{seed}; // You may also want to look into uniform_int_distribution.
    std::shuffle(std::begin(order), std::end(order), engine);

    // C++98
    // std::random_shuffle(order.begin(), order.end());

    // Prints strings in random order.
    for (int number : order)
         cout << lines[number] <<'\n';

    fin.close();
}

如果可以修改(打乱)字符串数组

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

using std::cout;
using std::string;
using std::ifstream;

int main()
{
    ifstream fin("test.txt");
    if(!fin)
        cout<<"Error in opening file";

    std::vector<string> lines;
    string line;
    while (getline(fin, line))
          lines.push_back(line);

    // C++11
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // Seed from current time.
    auto engine = std::default_random_engine{seed}; // You may also want to look into uniform_int_distribution.
    std::shuffle(std::begin(lines), std::end(lines), engine);

    // C++98
    // std::random_shuffle(lines.begin(), lines.end());

    // Prints strings in random order.
    for (string& line : lines)
         cout << line <<'\n';

    fin.close();
}

Try it online!

关于c++ - 如何从 C++ 中的文件中随机获取信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31745951/

相关文章:

c - 这不是同一个逻辑吗?不同的结果

javascript - 你如何使用 html/javascript 逐行读取/解析文本文件?

c++ - Ifstream 在打开文件时崩溃程序

c++ - 增加缓冲是否会提高 C++ 中 ifstream.getline() 的最高速度?

c++ - std::find 不区分大小写检查

c++ - 如何创建访问 std::map 项的 const 成员函数

c++ - QT - 除非关闭,否则主窗口不会更新

转换为二进制文件

c++ - 图数据结构内存管理

c++ - 读取/写入 outfile 错误(可能是简单的修复)