如何使用随机数填充文件?

时间:2015-05-07 23:02:04

标签: c++ algorithm sorting binary-tree binary-search-tree

所以基本上我正在尝试"填充"一个包含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";

}

但我似乎无法写入文件,我只能看到控制台上的数字,然后程序崩溃。

我的第二个问题如下: 我想将这些相同的数字添加到二叉搜索树中。我已经有一个类和一个dd函数,但我不知道如何继续。然后我希望能够完全随机地从BST中删除它们。

我已经写了一个删除函数。这怎么可能? 任何想法将不胜感激。 P.S:我对C ++很新,如果我的问题听起来很愚蠢,我很抱歉。

2 个答案:

答案 0 :(得分:4)

我认为问题的解决方案在于@Praetorian的评论:

  

你可能想要myfile << random_integer << '\n';。否则stoi会抛出out_of_range,这可能是导致崩溃的原因。

我对你的功能有一些通用的建议。

  1. 将您的功能分成两个

    - 一个用于写入文件的文件 - 一个用于从文件中读取并填充BST。

  2. 不要在函数中使用文件或全局变量的硬编码名称。使它们成为函数的参数。

  3. 始终检查IO操作的状态。处理失败。

  4. main或驱动程序函数中对随机数生成器进行种子设定。如果你多次调用生成随机数的函数,你就不需要再次为随机生成器播种。

  5. 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);
    }
    

    将功能分为两部分,您可以一次测试一个功能。如果一个函数出现问题,您可以在处理其他函数之前调试问题并修复它。

答案 1 :(得分:0)

更改

if(is_category()){
  global $cat;
  if($cat == '28'){
    //do stuff here
}

为:

cout << random_integer << endl;
myfile << random_integer;

在旁注中,如果您只在程序的生命周期内需要数据,则可能需要使用缓冲区,甚至可以将数字直接添加到二进制搜索树中。