簡體   English   中英

c++。 如何將元素添加到文件中的對向量中?

[英]c++. How to add elements to a vector of pairs from file?

我正在嘗試將每條奇數行讀入 pair.first 並將每條偶數行讀入 pair.second 並將其放入對的向量中。 我想要一個球員和他的整體在一個向量中的一對。 這是我的代碼:

while(getline(players, player) && players >> overall)
    {
        pick_players.push_back(make_pair(player, overall));
    }

不幸的是,它只讀取前兩行,向量 output 的 rest 只是零。 player是一個字符串, overall是 integer, players是我的 fstream 文件名。

交錯std::getlineoperator>>以讀取輸入 stream 不是一個好主意。 相反,您最好在這里堅持使用std::getline兩次。

這樣的事情會做:

  • 循環輸入 stream 直到您無法讀取兩行(為此使用std::getline )。
  • 將每個讀數推回std::vector<std::pair<std::string, int>>
  • 如果整行有解析錯誤,就繼續循環。

[演示]

#include <charconv>  // from_chars
#include <fmt/core.h>
#include <fmt/ranges.h>
#include <sstream>   // istringstream
#include <system_error>  // errc
#include <utility>   // pair
#include <vector>

int main() {
    std::istringstream iss{
        "player1\n"
        "1\n"
        "player2\n"
        "2ddd\n"
        "player3\n"
        "3   \n"
    };
    std::vector<std::pair<std::string, int>> players{};
    for (std::string player{}, overall_str{};
         getline(iss, player) and getline(iss, overall_str);) {
        int overall{};
        auto [ptr, ec] = std::from_chars(
            overall_str.data(), overall_str.data() + overall_str.size(), overall);
        if (ec == std::errc{}) {
            players.push_back({player, overall});
        } else {
            fmt::print("Error parsing overall line: {}\n", overall_str);
            continue;
        }
    }
    fmt::print("{}\n", players);
}

// Outputs:
//
//   [("player1", 1), ("player2", 2), ("player3", 3)]

可以通過以下方式加強對整行的解析:

  • 修剪輸入字符串,和
  • 檢查std::from_chars使用所有輸入字符串轉換為數字。

[演示]

#include <boost/algorithm/string.hpp>
...
        boost::algorithm::trim(overall_str);
...
        if (ec == std::errc{} and ptr == overall_str.data() + overall_str.size()) {

// Outputs:
//
//   Error parsing overall line: 2ddd
//   [("player1", 1), ("player3", 3)]

暫無
暫無

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

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