我有一个充满名称的文本文件:
smartgem
marshbraid
seamore
stagstriker
meadowbreath
hydrabrow
startrack
wheatrage
caskreaver
seaash
我想对随机名称生成器进行编码,该生成器将从.txt文件中复制特定行并将其返回。
答案 0 :(得分:2)
从文件读入时,必须从头开始并继续。我最好的建议是阅读所有名称,将它们存储在一个集中,如果您对效率没有严格的要求,则以这种方式随机访问它们。
您必须先在文件中读取该名称,然后才能从文件末尾选择随机字符串。
您可能还想看看fseek()
,它将使您可以“跳到”输入流中的某个位置。您可以随机生成一个偏移量,然后将其作为fseek()的参数提供。
答案 1 :(得分:1)
除非您执行以下两项操作之一,否则您不能这样做:
为该文件生成一个索引,其中包含每一行的地址,然后您可以直接转到该地址并读取它。可以用许多不同的方式存储该索引,最简单的方法是将其存储在单独的文件中,这样仍可以将原始文件视为文本文件,或者;
结构化文件,以便每行以固定的距离(以字节为单位)开始,因此您可以乘以所需的行(所需索引*大小)。这并不意味着每一行上的文本都必须具有相同的长度,您可以使用空终止符(字符'\0'
)来填充行尾。在这种情况下,不建议将该文件再作为文本文件工作,而是改为二进制文件。
您可以编写一个单独的程序来生成该索引或生成结构化文件供您的主程序使用。
当然,考虑到您希望程序运行并读取该行而不必首先将整个文件加载到内存中,所有这一切。如果您的程序不断从文件中读取行,则可能应该将整个文件加载到std::vector<std::string>
中,然后从那里随意读取行。
答案 2 :(得分:-1)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
string filePath = "test.txt";
vector<std::string> qNames;
ifstream openFile(filePath.data());
if (openFile.is_open())
{
string line;
while (getline(openFile, line))
{
qNames.push_back(line.c_str());
}
openFile.close();
}
if (!qNames.empty())
{
srand((unsigned int)time(NULL));
for (int i = 0; i < 10; i++)
{
int num = rand();
int linePos = num % qNames.size();
cout << qNames.at(linePos).c_str() << endl;
}
}
return 0;
}