如何从 C++ 中的文件中随机获取信息?
How to fetch information randomly from files in C++?
我正在用 C++ 创建一个问答游戏。因此,主要要求是每次程序 运行s 时应从文件中随机提取问题。那么,如何在 C++ 中执行此操作?
考虑以下两个简单的程序。
Write.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();
}
Read.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();
}
最简单的解决方案是将您的行放入 std::list
,然后使用 std::random_shuffle
随机重新排序:
#include <algorithm> // std::random_shuffle
#include <list> // std::list
#include <ctime> // std::time
#include <cstdlib> // std::rand, std::srand
std::list<std::string> str_list;
std::string buf_str;
for(int i=0;i<3;i++){
getline(fin,buf_str);
str_list.push_back(buf_str);
}
std::srand(std::time(0));
std::random_shuffle ( str_list.begin(), str_list.end() );
// then just print lines from str_list
我正在用 C++ 创建一个问答游戏。因此,主要要求是每次程序 运行s 时应从文件中随机提取问题。那么,如何在 C++ 中执行此操作? 考虑以下两个简单的程序。
Write.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();
}
Read.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();
}
最简单的解决方案是将您的行放入 std::list
,然后使用 std::random_shuffle
随机重新排序:
#include <algorithm> // std::random_shuffle
#include <list> // std::list
#include <ctime> // std::time
#include <cstdlib> // std::rand, std::srand
std::list<std::string> str_list;
std::string buf_str;
for(int i=0;i<3;i++){
getline(fin,buf_str);
str_list.push_back(buf_str);
}
std::srand(std::time(0));
std::random_shuffle ( str_list.begin(), str_list.end() );
// then just print lines from str_list