如何用随机数填充文件?
How to populate a file with random numbers?
所以基本上我正在尝试 "populate" 一个包含 10^3 个完全随机数的文件,这样我可以稍后将它们添加到二进制搜索树中。
这是我目前使用的填充函数:
void populateFile(BinarySearchTree b) {
int random_integer;
srand( time( NULL ) );
std::ofstream myfile;
string line;
myfile.open ("output.txt");
myfile << "Writing this to a file: ";
for(int index=0; index<1000; index++)
{
random_integer = (rand()%1000)+1;
cout << random_integer << endl;
myfile << random_integer;
}
myfile.close();
int value;
ifstream file ("output.txt");
if (file.is_open())
{
while ( getline (file,line) )
{
value = std::stoi(line);
b.insert(value);
}
myfile.close();
}
else cout << "Unable to open file";
}
但我似乎无法写入文件,我只能在控制台上看到数字然后程序崩溃。
我的第二个顾虑如下:
我想将这些相同的数字添加到二叉搜索树中。我已经有一个 class 和一个 dd 函数,但我不知道如何继续。然后我希望能够从 BST 中完全随机删除它们。
我已经编写了删除功能。这怎么可能?
任何想法将不胜感激。
P.S:我是 C++ 的新手,如果我的问题对您来说听起来很愚蠢,我很抱歉。
我认为您的问题的解决方案在于@Praetorian 的评论:
You probably want myfile << random_integer << '\n';
. Otherwise stoi
will throw out_of_range
, which is probably the cause of the crash.
关于您的功能,我有一些通用的建议。
将你的函数分成两个
-- 一个用于写入文件
-- 一个用于读取文件并填充 BST。
不要在函数中使用硬编码的文件名或全局变量。使它们成为函数的参数。
始终检查 IO 操作的状态。处理失败。
在 main
或驱动函数中植入随机数生成器。如果多次调用生成随机数的函数,则不需要再次为随机数生成器设置种子。
void populateFile(int count,
std::string const& file)
{
std::ofstream myfile(file);
if (!myfile )
{
// Deal with error.
return;
}
for(int index=0; index<count; index++)
{
random_integer = (rand()%1000)+1;
myfile << random_integer << "\n";
}
}
void readFileAndBuildBST(std::string const& file,
BinarySearchTree& b)
{
std::ifstream myfile(file);
if (!myfile )
{
// Deal with error.
return;
}
int number;
while ( myfile >> number )
{
b.insert(number);
}
}
void driver()
{
// Seed the random number generator.
srand( time( NULL ) );
// Populate the file
std::string file("output.txt");
populateFile(1000, file);
// Read the data from the file and flesh out the BST.
BinarySearchTree b;
readFileAndBuildBST(file, b);
}
功能一分为二,一次可以测试一个功能。如果一个功能出现问题,您可以调试问题并修复它,然后再处理另一个功能。
改变
cout << random_integer << endl;
myfile << random_integer;
至:
myfile << random_integer << endl;
旁注,如果您只在程序的生命周期内需要数据,您可能需要使用缓冲区,甚至直接将数字添加到二叉搜索树中。
所以基本上我正在尝试 "populate" 一个包含 10^3 个完全随机数的文件,这样我可以稍后将它们添加到二进制搜索树中。 这是我目前使用的填充函数:
void populateFile(BinarySearchTree b) {
int random_integer;
srand( time( NULL ) );
std::ofstream myfile;
string line;
myfile.open ("output.txt");
myfile << "Writing this to a file: ";
for(int index=0; index<1000; index++)
{
random_integer = (rand()%1000)+1;
cout << random_integer << endl;
myfile << random_integer;
}
myfile.close();
int value;
ifstream file ("output.txt");
if (file.is_open())
{
while ( getline (file,line) )
{
value = std::stoi(line);
b.insert(value);
}
myfile.close();
}
else cout << "Unable to open file";
}
但我似乎无法写入文件,我只能在控制台上看到数字然后程序崩溃。
我的第二个顾虑如下: 我想将这些相同的数字添加到二叉搜索树中。我已经有一个 class 和一个 dd 函数,但我不知道如何继续。然后我希望能够从 BST 中完全随机删除它们。
我已经编写了删除功能。这怎么可能? 任何想法将不胜感激。 P.S:我是 C++ 的新手,如果我的问题对您来说听起来很愚蠢,我很抱歉。
我认为您的问题的解决方案在于@Praetorian 的评论:
You probably want
myfile << random_integer << '\n';
. Otherwisestoi
will throwout_of_range
, which is probably the cause of the crash.
关于您的功能,我有一些通用的建议。
将你的函数分成两个
-- 一个用于写入文件
-- 一个用于读取文件并填充 BST。不要在函数中使用硬编码的文件名或全局变量。使它们成为函数的参数。
始终检查 IO 操作的状态。处理失败。
在
main
或驱动函数中植入随机数生成器。如果多次调用生成随机数的函数,则不需要再次为随机数生成器设置种子。
void populateFile(int count,
std::string const& file)
{
std::ofstream myfile(file);
if (!myfile )
{
// Deal with error.
return;
}
for(int index=0; index<count; index++)
{
random_integer = (rand()%1000)+1;
myfile << random_integer << "\n";
}
}
void readFileAndBuildBST(std::string const& file,
BinarySearchTree& b)
{
std::ifstream myfile(file);
if (!myfile )
{
// Deal with error.
return;
}
int number;
while ( myfile >> number )
{
b.insert(number);
}
}
void driver()
{
// Seed the random number generator.
srand( time( NULL ) );
// Populate the file
std::string file("output.txt");
populateFile(1000, file);
// Read the data from the file and flesh out the BST.
BinarySearchTree b;
readFileAndBuildBST(file, b);
}
功能一分为二,一次可以测试一个功能。如果一个功能出现问题,您可以调试问题并修复它,然后再处理另一个功能。
改变
cout << random_integer << endl;
myfile << random_integer;
至:
myfile << random_integer << endl;
旁注,如果您只在程序的生命周期内需要数据,您可能需要使用缓冲区,甚至直接将数字添加到二叉搜索树中。