簡體   English   中英

如何在 C++ 中比較多個 .txt 文件?

[英]How to compare multiple .txt files in c++?

我制作了一個程序,人們在其中創建一個拍賣,然后將其保存為 .txt 文件,如下所示:

Auction name: Books
Item to sell: Lord of the rings
Description: words........
Reserve price: 12

然后,在一個單獨的項目中,我做了一個類似的事情,但投標也保存在一個具有以下結構的 .txt 文件中:

// "personName.txt"
24 ( <-- Example number of the person's bid)

問題是現在我必須制作多個“出價”文件並將它們相互比較並與拍賣文件進行比較,以確定誰贏得了拍賣。

如何做到這一點?

我不確定您為什么要對文件執行此任務,因為將文件加載到程序中非常昂貴。 但是,您的任務可以完成(也就是說,如果我准確理解了您的要求;您的問題沒有寫得很清楚)。

首先,確保包含來自 STL 的正確標頭

#include <iostream>    // Assuming you have console IO functionality
#include <filesystem>  // Accessing all files in a directory for searching
#include <fstream>     // Loading files into the program
#include <string>      // Assuming you have names for bidders
#include <vector>      // Load the files' contents into a vector

正如您可以從包含內容及其解釋中了解到的那樣,這是我對該計划的計划:

  1. 將所有拍賣文件存儲在只有拍賣文件的目錄中。 這將節省時間,因為程序不必檢查一堆我們不感興趣的文件。
  2. 使用std::filesystem::directory_iterator ,從上面搜索std::filesystem::directory_iterator所有文件並將它們的內容保存到std::vector
  3. 使用 max 函數確定最大出價並輸出其名稱

在實踐中,這意味着我們可能需要一個結構向量,它具有 (1) 投標人的名稱和 (2) 他們的投標。 然后我們使用最大值函數(如上所述)比較他們的所有出價。 當我們找到最大值時,我們將能夠很容易地找到與該出價相匹配的名稱出價者並輸出到屏幕上。

.txt文件(對於我的解決方案)每個文件有嚴格的兩行。 第一行是投標人的姓名,第二行是投標人的出價。 這將與我們將用於將這些文件加載​​到程序中的結構完全一致。

所以,這是程序(確保您使用的是C++17 ):

#include <filesystem> // std::filesystem : path, directory_iterator, current_path, parent_path
#include <fstream>    // std::ifstream
#include <iomanip>    // std::setpercision
#include <iostream>   // std::cout, std::cerr, std::endl
#include <limits>     // std::numeric_limits
#include <string>     // std::string
#include <vector>     // std::vector

namespace fs = std::filesystem;

// The max size of a file stream saved into this variables
constexpr auto STREAM_MAX = std::numeric_limits<std::streamsize>::max();

// The directory to the folder with all the bidders in it
//   What I've done here is used the a folder in the same parent
//   directory as this file. So we go one step out of the 
//   current path, then go into the "bids" folder. However,
//   I compiled this in a different directory hierarchy, so I
//   commented the '.parent_path()' part out.
const auto BIDDING_PATH = 
    fs::path(fs::current_path()/*.parent_path()*/ / "bids");

/**
 This will be the struct we use in the vector

 @param name The name of the bidder
 @param bid  The price of the bidder's bid
*/
struct Bidder
{
    std::string name;
    double bid;

    // Define a constructor for std::vector::emplace_back
    Bidder(std::string name, double bid) :
        name(std::move(name)), bid(bid)
    {}
};

std::vector<Bidder> load_bids()
{
    std::vector<Bidder> all_bidders;

    // Loop through every file in the 'BIDDING_PATH' directory 
    // (not recursively)
    for (auto file : fs::directory_iterator(BIDDING_PATH))
    {
        std::ifstream cur_file(file.path().c_str());
        if (cur_file.is_open())
        { // Load file into a struct and add it to `all_bidders`
            std::string cur_name;
            double cur_bid;

            // Read the contents of the file into the above variables
            std::getline(cur_file, cur_name);
            cur_file >> cur_bid;

            // Now get rid of the newline character left behind by the '>>'
            // operator from 'cur_file >> cur_bid'
            cur_file.ignore(STREAM_MAX, '\n');

            // Add the bidder to the `all_bidders` vector
            all_bidders.emplace_back(cur_name, cur_bid);

            // Some debugging feedback
            std::cout 
                << "File loaded:   " << file.path().string()    << '\n'
                << "Bidder's name: " << all_bidders.back().name << '\n'
                << "Bidder's bid:  " << all_bidders.back().bid  << '\n'
                << std::endl;
        }
        else
        {
            std::cerr 
                << "Error opening file: " << file.path().string() 
                << std::endl;
        }
    }

    return all_bidders;
}

Bidder find_max_bidder(const std::vector<Bidder>& bidders)
{
    // Keeps track of the winning bidder
    // Intially set to a null value
    Bidder max_bidder("", -1.0);

    for (const auto& cur_bidder : bidders)
    {
        if (cur_bidder.bid > max_bidder.bid)
        {
            max_bidder.name = cur_bidder.name;
            max_bidder.bid  = cur_bidder.bid;
        }
    }

    // Check if no max was found
    if (max_bidder.bid == -1.0)
    {
        std::cerr
            << "Error: No max bidder was found\n"
            << "Are there any bidding files in the given directory?\n"
            << std::endl;
    }

    return max_bidder;
}

int main()
{
    // Load all bidders into the `all_bidders` vector, then
    // calculate the max bid
    std::vector<Bidder> all_bidders = load_bids();
    Bidder winning_bidder = find_max_bidder(all_bidders);

    // Print out the max bid
    std::cout
        << "The winner of this auction is " << winning_bidder.name << "!\n"
        << "They bid $" << winning_bidder.bid << std::setprecision(2) << "!\n"
        << std::endl;

    // Keep the console from closing
    std::cin.get();
    return 0;
}

請注意以下幾點:

  • 您需要在C++17編譯它; 我在 Visual Studio 2019 中使用了 MSVC
  • 還有其他#include不需要解釋我們的游戲計划,但我添加了格式或讓我的生活更輕松或其他什么
  • 如果需要,您可以刪除“ // Some debugging feedback ”下的部分
  • 我沒有涵蓋您問題的第一部分,因為它 (1) 看起來不像是一個問題,並且 (2) 您似乎對該部分沒有任何顧慮

另外,我用這個批處理文件生成了一組隨機數據:

@echo off
setlocal EnableDelayedExpansion
set wkdir=!cd!
goto :begin

:begin
cd "..\bids"
set rand_bid=
for /l %%a in (1,1,100) do (
    echo Bidder%%a > bidder%%a.txt
    set /a rand_bid=!random! %% 1000
    echo !rand_bid!.00 >> bidder%%a.txt
)
cd !wkdir!
goto :end

:end
exit

運行該批處理文件然后運行我的程序后,這是我的輸出:

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder1.txt
Bidder's name: Bidder1
Bidder's bid:  219

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder10.txt
Bidder's name: Bidder10
Bidder's bid:  693

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder100.txt
Bidder's name: Bidder100
Bidder's bid:  275

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder11.txt
Bidder's name: Bidder11
Bidder's bid:  669

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder12.txt
Bidder's name: Bidder12
Bidder's bid:  720

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder13.txt
Bidder's name: Bidder13
Bidder's bid:  741

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder14.txt
Bidder's name: Bidder14
Bidder's bid:  342

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder15.txt
Bidder's name: Bidder15
Bidder's bid:  124

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder16.txt
Bidder's name: Bidder16
Bidder's bid:  627

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder17.txt
Bidder's name: Bidder17
Bidder's bid:  244

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder18.txt
Bidder's name: Bidder18
Bidder's bid:  61

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder19.txt
Bidder's name: Bidder19
Bidder's bid:  79

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder2.txt
Bidder's name: Bidder2
Bidder's bid:  979

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder20.txt
Bidder's name: Bidder20
Bidder's bid:  211

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder21.txt
Bidder's name: Bidder21
Bidder's bid:  168

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder22.txt
Bidder's name: Bidder22
Bidder's bid:  44

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder23.txt
Bidder's name: Bidder23
Bidder's bid:  902

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder24.txt
Bidder's name: Bidder24
Bidder's bid:  753

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder25.txt
Bidder's name: Bidder25
Bidder's bid:  975

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder26.txt
Bidder's name: Bidder26
Bidder's bid:  220

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder27.txt
Bidder's name: Bidder27
Bidder's bid:  576

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder28.txt
Bidder's name: Bidder28
Bidder's bid:  541

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder29.txt
Bidder's name: Bidder29
Bidder's bid:  249

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder3.txt
Bidder's name: Bidder3
Bidder's bid:  788

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder30.txt
Bidder's name: Bidder30
Bidder's bid:  661

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder31.txt
Bidder's name: Bidder31
Bidder's bid:  98

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder32.txt
Bidder's name: Bidder32
Bidder's bid:  307

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder33.txt
Bidder's name: Bidder33
Bidder's bid:  698

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder34.txt
Bidder's name: Bidder34
Bidder's bid:  287

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder35.txt
Bidder's name: Bidder35
Bidder's bid:  489

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder36.txt
Bidder's name: Bidder36
Bidder's bid:  685

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder37.txt
Bidder's name: Bidder37
Bidder's bid:  196

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder38.txt
Bidder's name: Bidder38
Bidder's bid:  321

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder39.txt
Bidder's name: Bidder39
Bidder's bid:  332

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder4.txt
Bidder's name: Bidder4
Bidder's bid:  267

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder40.txt
Bidder's name: Bidder40
Bidder's bid:  593

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder41.txt
Bidder's name: Bidder41
Bidder's bid:  485

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder42.txt
Bidder's name: Bidder42
Bidder's bid:  863

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder43.txt
Bidder's name: Bidder43
Bidder's bid:  869

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder44.txt
Bidder's name: Bidder44
Bidder's bid:  612

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder45.txt
Bidder's name: Bidder45
Bidder's bid:  165

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder46.txt
Bidder's name: Bidder46
Bidder's bid:  889

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder47.txt
Bidder's name: Bidder47
Bidder's bid:  554

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder48.txt
Bidder's name: Bidder48
Bidder's bid:  783

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder49.txt
Bidder's name: Bidder49
Bidder's bid:  747

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder5.txt
Bidder's name: Bidder5
Bidder's bid:  966

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder50.txt
Bidder's name: Bidder50
Bidder's bid:  322

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder51.txt
Bidder's name: Bidder51
Bidder's bid:  775

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder52.txt
Bidder's name: Bidder52
Bidder's bid:  306

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder53.txt
Bidder's name: Bidder53
Bidder's bid:  376

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder54.txt
Bidder's name: Bidder54
Bidder's bid:  895

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder55.txt
Bidder's name: Bidder55
Bidder's bid:  374

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder56.txt
Bidder's name: Bidder56
Bidder's bid:  166

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder57.txt
Bidder's name: Bidder57
Bidder's bid:  332

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder58.txt
Bidder's name: Bidder58
Bidder's bid:  665

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder59.txt
Bidder's name: Bidder59
Bidder's bid:  177

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder6.txt
Bidder's name: Bidder6
Bidder's bid:  888

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder60.txt
Bidder's name: Bidder60
Bidder's bid:  399

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder61.txt
Bidder's name: Bidder61
Bidder's bid:  271

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder62.txt
Bidder's name: Bidder62
Bidder's bid:  996

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder63.txt
Bidder's name: Bidder63
Bidder's bid:  487

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder64.txt
Bidder's name: Bidder64
Bidder's bid:  874

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder65.txt
Bidder's name: Bidder65
Bidder's bid:  499

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder66.txt
Bidder's name: Bidder66
Bidder's bid:  72

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder67.txt
Bidder's name: Bidder67
Bidder's bid:  902

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder68.txt
Bidder's name: Bidder68
Bidder's bid:  66

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder69.txt
Bidder's name: Bidder69
Bidder's bid:  64

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder7.txt
Bidder's name: Bidder7
Bidder's bid:  246

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder70.txt
Bidder's name: Bidder70
Bidder's bid:  167

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder71.txt
Bidder's name: Bidder71
Bidder's bid:  961

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder72.txt
Bidder's name: Bidder72
Bidder's bid:  250

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder73.txt
Bidder's name: Bidder73
Bidder's bid:  280

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder74.txt
Bidder's name: Bidder74
Bidder's bid:  185

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder75.txt
Bidder's name: Bidder75
Bidder's bid:  962

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder76.txt
Bidder's name: Bidder76
Bidder's bid:  174

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder77.txt
Bidder's name: Bidder77
Bidder's bid:  157

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder78.txt
Bidder's name: Bidder78
Bidder's bid:  221

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder79.txt
Bidder's name: Bidder79
Bidder's bid:  312

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder8.txt
Bidder's name: Bidder8
Bidder's bid:  189

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder80.txt
Bidder's name: Bidder80
Bidder's bid:  842

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder81.txt
Bidder's name: Bidder81
Bidder's bid:  415

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder82.txt
Bidder's name: Bidder82
Bidder's bid:  313

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder83.txt
Bidder's name: Bidder83
Bidder's bid:  220

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder84.txt
Bidder's name: Bidder84
Bidder's bid:  200

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder85.txt
Bidder's name: Bidder85
Bidder's bid:  738

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder86.txt
Bidder's name: Bidder86
Bidder's bid:  323

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder87.txt
Bidder's name: Bidder87
Bidder's bid:  529

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder88.txt
Bidder's name: Bidder88
Bidder's bid:  196

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder89.txt
Bidder's name: Bidder89
Bidder's bid:  991

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder9.txt
Bidder's name: Bidder9
Bidder's bid:  917

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder90.txt
Bidder's name: Bidder90
Bidder's bid:  441

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder91.txt
Bidder's name: Bidder91
Bidder's bid:  691

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder92.txt
Bidder's name: Bidder92
Bidder's bid:  578

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder93.txt
Bidder's name: Bidder93
Bidder's bid:  234

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder94.txt
Bidder's name: Bidder94
Bidder's bid:  638

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder95.txt
Bidder's name: Bidder95
Bidder's bid:  569

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder96.txt
Bidder's name: Bidder96
Bidder's bid:  267

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder97.txt
Bidder's name: Bidder97
Bidder's bid:  788

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder98.txt
Bidder's name: Bidder98
Bidder's bid:  790

File loaded:   C:\Dev\C++\Others\DevBox\Testing\bids\bidder99.txt
Bidder's name: Bidder99
Bidder's bid:  781

The winner of this auction is Bidder62 !
They bid $996!

我希望這有幫助! 如果您有任何問題隨時問!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM