【问题标题】:ifstream unable to load in two or more files correctly [C++]ifstream 无法正确加载两个或多个文件 [C++]
【发布时间】:2022-11-10 17:14:12
【问题描述】:

我正在制作一个“身份生成器”,计算机从 .txt 文件中随机选择行。

虽然它适用于代码的第一部分,但当我重复该代码并更改变量时,它仍然使用旧的 txt 文件。

预期结果:

Full name: {random first name} {random sur name}
Address: {random address}

实际结果:

Full name: {random first name} {random first name}
Address: {random first name}

我的代码

    cout << "Full name: ";

    srand((unsigned) time(NULL)); 
    std::ifstream firstnamefile("englishfirstname.txt");
    int total_lines = 0;
    while(getline(firstnamefile,line))
    {
        total_lines++; 
        lines.push_back(line);  
    }
    int random_number = rand() % total_lines;
    cout << lines[random_number] << " ";

    //--- Surname ---

    srand((unsigned) time(NULL)); 
    std::ifstream surnamefile("englishsurname.txt");
    total_lines = 0;
    while(getline(surnamefile,line))
    {
        total_lines++; 
        lines.push_back(line);  
    }
    random_number = rand() % total_lines;
    cout << lines[random_number] << endl;

    // --- Address ---

    cout << "Address: ";
    
    srand((unsigned) time(NULL)); 
    std::ifstream addressfile("addresses.txt");
    total_lines = 0;
    while(getline(addressfile,line))
    {
        total_lines++; 
        lines.push_back(line);  
    }
    random_number = rand() % total_lines;
    cout << lines[random_number] << endl;

.txt 文件只是一个名称列表,例如:

约翰 迈克尔 马修 ETC...

【问题讨论】:

  • OT:在程序开始时只调用一次srand((unsigned) time(NULL)),或者在调试过程中最好不要调用它,那么你很可能在每次运行时得到相同的伪随机数序列,这可能会简化调试。
  • 好吧,我对这些东西不太了解,所以我把它们放在任何地方。
  • “我对这些东西不太了解,所以我把它们放在任何地方”: 好吧,这种态度不会让你走得太远,谷歌货物崇拜编程.

标签: c++ file random txt


【解决方案1】:

你永远不会清除lines,所以向量的开头总是你的名字列表。你在读取每个文件之前将total_lines 重置为0,因此您的随机范围每次都是0..total_lines,因此您总是从数组的开头进行选择,这又是名字。

假设行是std::vector,您需要lines.clear() 以及将total_lines 设置为0 以重置每个文件读取之间的状态。

请注意,您有三个相同的代码块,它们仅在文件名上有所不同;对于接受文件作为输入并返回随机行作为输出的函数来说,这是一个非常好的候选者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2017-11-17
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多