移动一个结构数组C++

Shifting an array of structs C++

本文关键字:结构 数组 C++ 一个 移动      更新时间:2023-10-16

我对c++编程和数据结构很陌生,确实需要一些帮助。我正在做一项任务,我有一个100行的文本文件,每行都有一个项目、一个状态(待售或需要)和一个价格。我需要浏览文本文件,并在结构数组中添加行,在添加行时,我需要将新信息与以前提交的信息进行比较。如果有一行是需要的,并且其价格高于之前输入的待售项目,则该项目将从结构中删除,并转移结构数组。我遇到麻烦的地方是,一旦找到一条满足条件的线,就要移动所有的结构。

我的问题是,当我试图使用第二个for循环来移动structs数组时,什么都没有发生,我只得到了null structs,似乎什么都没有移动。如果你们能提供任何帮助,我们将不胜感激。下面是文本文件的代码和我当前的代码。

#include<iostream>
#include<fstream>
#include <string>
#include <algorithm>
#include <sstream>
using namespace std;
struct items
{
string type;
int status;
int price;
} itemArray [100];

int main(int argc, char *argv[]) {
int x = -1;
//int chickenCount = 0;
int counter = 0;
int itemsSold = 0;
int itemsRemoved = 0;
int itemsForSale = 0;
int itemsWanted = 0;
string itemType;
int itemStatus = 0;
int itemPrice = 0;
int match = 0;
ifstream myReadFile( "messageBoard.txt" ) ;
std::string line;
//char output[100];
if (myReadFile.is_open()) {
while (!myReadFile.eof()) {
getline(myReadFile,line); // Saves the line in STRING.
line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
//cout<<line<<endl; // Prints our STRING.
x++;
std::string input = line;
std::istringstream ss(input);
std::string token;
while(std::getline(ss, token, ',')) {
counter++;
//std::cout << token << 'n';
if (counter>3){
counter =1;
}
//cout << x << endl;
if (counter == 1){
itemType = token;
//cout<< itemType<<endl;
}
if (counter == 2){
if (token == "forsale"){
itemStatus = 1;
//itemsForSale++;
}
if (token == "wanted"){
itemStatus = 0;
//itemsWanted++;
}
//cout<< itemStatus<<endl;
}
if (counter == 3){
itemPrice = atoi(token.c_str());
//cout<< itemPrice<<endl;
}

//cout<<"yo"<<endl;
}
if (x >= 0){
for (int i = 0; i<100;i++){
if (itemArray[i].type == itemType){
//cout<<itemType<<endl;
if(itemArray[i].status != itemStatus){
if (itemArray[i].status == 1){
if(itemPrice>=itemArray[i].price){
itemsSold++;
match =1;
//itemArray[i].type = "sold";
for (int j=i; j<100-1;j++){
//cout<<j<<endl;
itemArray[j].type = itemArray[j+1].type;
itemArray[j].status = itemArray[j+1].status;
itemArray[j].price = itemArray[j+1].price;
}
i =i-1;
break;
}
}
if (itemArray[i].status == 0){
if(itemArray[i].price>=itemPrice){
itemsSold++;
match = 1;
//itemArray[i].type = "sold";
for (int j=i; j<100-1;j++){
//cout<<j<<endl;
itemArray[j].type = itemArray[j+1].type;
itemArray[j].status = itemArray[j+1].status;
itemArray[j].price = itemArray[j+1].price;
}
i=i-1;                                     
break;
}
}
}
}
}
}           
if (counter == 3 && match == 0){
itemArray[(x)].type = itemType;
itemArray[(x)].status = itemStatus;
itemArray[(x)].price = itemPrice;
}
match = 0;
// cout << itemArray[x].type << " " << itemArray[x].status<<" "<<itemArray[x].price<<endl;
}
for(int i=0;i<100;i++){
cout<<itemArray[i].type<< " "<<itemArray[i].status<<" "<<itemArray[i].price<<endl;
}
//cout<<itemArray[1].price<<endl;

cout << itemsSold<<endl;
}
myReadFile.close();
return 0;
}

文本文件:https://drive.google.com/file/d/0B8O3izVcHJBzem0wMzA3VHoxNk0/view?usp=sharing

感谢的帮助

我在代码中看到了一些问题,但由于无法对其进行测试,我认为主要问题是您总是在位置'x'插入新元素,该位置对应于从文件中读取的当前行,而没有考虑元素的任何移位。您应该在第一个空槽中插入新元素(或者只覆盖旧元素,而不是移动所有内容)。另一个问题是,您没有初始化阵列中的状态和价格。

最好的方法是通过使用更标准的C++特性来重写代码,例如:

  • 用定义默认值的构造函数将items结构替换为类
  • 使用对象复制(不需要逐个复制结构元素)
  • 像列表一样使用标准C++容器(请参阅http://www.cplusplus.com/reference/list/list/)具有插入和擦除方法