Home > Software engineering >  Output does not produce using method and struct
Output does not produce using method and struct

Time:06-10

I try this code using a method, array, and struct, but it doesn't produce output at all.

I also use most types of include, but it still doesn't produce any output.

#include<conio.h>
#include<iostream>
#include<stream>
#include<string>
#include<stream>
using namespace std;

struct PetLabel {
    string petname;
    string pettype;
    int petprice;
    string petowner;
    string phoneno;    
}; 

PetLabel pet [10]; 
stringstream ss;   

void DataPet();
void petPrice();
void findOwner();

int main(){
    DataPet();
    findOwner();
    petPrice();
    return 0;
}

void DataPet(){
    ifstream infile;
    infile.open("petSold.txt"); 
    string cnvt[10]; 
    for(int i = 0; i < 10; i  ){
        getline(infile, pet[i].petname, ',');
        getline(infile, pet[i].pettype, ',');
        getline(infile, cnvt[i], ',');
        ss << cnvt[i];
        ss >> pet[i].petprice; 
        getline(infile, pet[i].petowner, ',');
        getline(infile, pet[i].phoneno);
        ss.clear();
    }
    infile.close(); 
}

void findOwner(){
    int chosen;
    for (int i = 0; i < 10; i  ){
        if (pet[i].petname == "Uyasolu"){
            i = chosen;
        }
    }
    cout << "Owner name : " << pet[chosen].petowner << " Phone no : " << pet[chosen].phoneno << endl;
}

void petPrice(){
    ofstream outfile("catSold.txt");
    outfile << "The cat sold with price greater than RM1000" << endl;
    for (int i = 0; i < 10; i  ){
        if (pet[i].petprice > 1000){
            cout << pet[i].petname << "," << pet[i].pettype << "," << pet[i].petprice << "," << pet[i].petowner << "," << pet[i].phoneno << endl;
        }
    }
    outfile.close();
}

the output that I get is:

Owner name :  Phone no :

but I can't understand, because there is no syntax error at all.

Is there anything I can add, so I can get the right output?

CodePudding user response:

This method is weird:

void findOwner(){
    int chosen;
    for (int i=0;i<10;i  ){
        if (pet[i].petname == "Uyasolu"){
            i = chosen;
         }

     }
     cout<<"Owner name : "<<pet[chosen].petowner<<" Phone no :              "<<pet[chosen].phoneno<<endl;
}

I think you mean chosen = i instead.

CodePudding user response:

findOwner() is coded wrong.

int chosen; is uninitialized before the loop is entered. Inside the loop, chosen is never updated (i is updated instead, which affects the looping). After the loop is done, chosen has an indeterminate value, so accessing pet[chosen] is undefined behavior.

It should look more like this instead:

void findOwner(){
    int chosen = -1;
    for (int i = 0; i < 10; i  ){
        if (pet[i].petname == "Uyasolu"){
            chosen = i;
            break;
        }
    }
    if (chosen != -1)
        cout << "Owner name : " << pet[chosen].petowner << " Phone no : " << pet[chosen].phoneno << endl;
    else
        cout << "Pet not found" << endl;
}

Alternatively:

void findOwner(){
    for (int i = 0; i < 10; i  ){
        if (pet[i].petname == "Uyasolu"){
            cout << "Owner name : " << pet[i].petowner << " Phone no : " << pet[i].phoneno << endl;
            return;
        }
    }
    cout << "Pet not found" << endl;
}

There are some other issues in your code, too:

  • don't use <conio.h>, its old, and you are not using anything from it anyway.

  • you have #include<stream> twice, and also <stream> should be <sstream>

  • string cnvt[10]; should be string cnvt; and then cnvt[i] should be cnvt. You don't need a whole array when you are converting only 1 string at a time.

  • ss.clear(); does not do what you think it does. You need to use ss.str("") instead. Or, simply move the declaration of ss inside the loop as a local variable so it is destroyed and recreated on each loop iteration.

  • petPrice() is creating an output catSold.txt file, but is not writing anything to it.

  • Related