从命令行读取由空格分隔的输入到对象数组中

Reading input from command line, separated by whitespace, into array of objects

我正在尝试从命令行读取输入并将它们成功存储在对象属性中。

输入示例(命令行中./(nameOfExecutable) < (sourceText)

20 5
1 5
28 5
2 5
20 5
4 5
22 5
88 3
27 5
34 5

我想读取它们并将它们存储到对象属性中。

experimentClass.h

#ifndef EXPERIMENTCLASS_H
#define EXPERIMENTCLASS_H

#pragma once

class experimentClass
{
public:
    experimentClass(int x, int y);
    ~experimentClass();

private:
    int age;
    int favoriteNumber;
};

#endif

experimentClass.cpp

#include "experimentClass.h"

experimentClass::experimentClass(int x, int y)
{   
    age = x;
    favoriteNumber = y;    
}

experimentClass::~experimentClass()
{

}

main.cpp

#include <iostream>
#include "experimentClass.h"
using namespace std;

int main(){
    
    int age;
    int favoriteNumber;

    std::cin >> age;
    std::cin >> favoriteNumber;
    experimentClass a(age, favoriteNumber);   
}

在这种情况下,我可以将 20 存储到 aage 中,将 5 存储到 afavoriteNumber 中。

但是,我想执行此过程直到输入结束。

因此,在这种情况下,我想使用迭代创建具有给定输入的 10 个对象,并将这些对象存储到数组或其他内容中。

如何正确阅读它们才能实现这一目标?

您可以 模型 输入行 struct:

struct Record
{
    unsigned int m_age;
    int          m_favorite_number;
};

然后重载 operator>>:

struct Record
{
    unsigned int m_age;
    int          m_favorite_number;
    friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
    input >> r.m_age;
    input >> r.m_favorite_number;
    return input;
}

您可以使用以下方法将数据读入数据库:

std::vector<Record> database;
Record r;
while (std::cin >> r)
{
    database.push_back(r);
}  

在上面的调用中,您可以将 std::cin 替换为文件流。

您可以打印或显示数据库中的记录:

std::cout << database[3].m_age << " " << database[3].m_favorite_number << "\n";

尽管恕我直言,您应该重载 operator<< 以默认格式打印记录。

只需将已有的逻辑放入循环中即可,例如:

#include <iostream>
#include <vector>
#include "experimentClass.h"
using namespace std;

int main() {
    
    int age;
    int favoriteNumber;
    vector<experimentClass> vec;

    while (cin >> age >> favoriteNumber) {
        experimentClass a(age, favoriteNumber);
        vec.push_back(a);
    }
   
    // use vec as needed...
}

然后您可以更进一步,为您的 class 实施 operator>>,例如:

#ifndef EXPERIMENTCLASS_H
#define EXPERIMENTCLASS_H

#include <istream>

#pragma once

class experimentClass
{
public:
    experimentClass(int x = 0, int y = 0);

    friend std::istream& operator>>(std::istream &is, experimentClass &cls);

private:
    int age;
    int favoriteNumber;
};

std::istream& operator>>(std::istream &is, experimentClass &cls);

#endif
#include "experimentClass.h"

experimentClass::experimentClass(int x, int y)
{   
    age = x;
    favoriteNumber = y;
}

std::istream& operator>>(std::istream &is, experimentClass &cls)
{
    return is >> cls.age >> cls.favoriteNumber;
}
#include <iostream>
#include <vector>
#include "experimentClass.h"
using namespace std;

int main() {
    
    experimentClass a;
    vector<experimentClass> vec;

    while (cin >> a) {
        vec.push_back(a);
    }
   
    // use vec as needed...
}

由于您正在使用 nameOfExecutable.exe < source.txt,您可以使用 cin.eof 检查是否到达文件末尾:

while(true){
    int a, b;
    std::cin >> a;
    if(std::cin.eof()){
        break;
    }
    std::cin >> b;
    //Create Class
}