转换一系列结构C ++

时间:2016-06-03 06:13:51

标签: c++ arrays struct

我对c ++编程和数据结构很陌生,真的需要一些帮助。我正在进行一项任务,我有一个100行的文本文件,每行有一个项目,一个状态(出售或想要)和一个价格。我需要浏览文本文件并将行添加到结构数组中,当我添加行时,我需要将新信息与先前提交的信息进行比较。如果存在需要的行并且其价格高于先前输入的待售商品,那么该项将从结构中移除并且结构数组移位。 我遇到麻烦的地方是在找到满足条件的线条后实际移动所有结构。

我的问题是,当我尝试使用第二个for循环移动结构数组时,没有任何反应,我只是获得了空结构,似乎没有任何动作。 如果你们能提供任何帮助,我们将不胜感激。 下面是文本文件的代码和我当前的代码。

#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

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

最好的方法是使用更多标准C ++功能重写代码,例如:

  • 使用具有定义默认值的构造函数的类替换项结构
  • 使用对象副本(不需要按元素复制struct元素)
  • 使用标准C ++容器,如列表(请参阅http://www.cplusplus.com/reference/list/list/),其中包含插入和擦除方法