从命令行读取由空格分隔的输入到对象数组中
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 存储到 a
的 age
中,将 5
存储到 a
的 favoriteNumber
中。
但是,我想执行此过程直到输入结束。
因此,在这种情况下,我想使用迭代创建具有给定输入的 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
}
我正在尝试从命令行读取输入并将它们成功存储在对象属性中。
输入示例(命令行中./(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 存储到 a
的 age
中,将 5
存储到 a
的 favoriteNumber
中。
但是,我想执行此过程直到输入结束。
因此,在这种情况下,我想使用迭代创建具有给定输入的 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
}