I have this data, but when i sort it different from what i want.

I want to sort in descending order like this

2 30
1 20
3 15

jest.txt
1 20
2 30
3 15


after compile
1 15
30 15
15
15

#include <fstream>
#include <string>
#include <iomanip>
#include <iostream>

using namespace std;

void sortData(string lId[], string fId[], int noOfRows);

int main ()
{
	// step 1
	string lId[4];
	string fId[4];
	int total,  i = 0, num = 0;

	ifstream inFile; // input stream variable for data file
	ofstream outFile; // output stream variable for result data

	inFile.open("jes.txt");

	if (!inFile) // step 3
	{
		cout << "Cannot open the input file." << endl;
		return 1;
	}

	outFile.open("jes2.txt");// step 4

	while (!inFile.eof())
	{
		inFile >> fId[i] >> lId[i] >> total ;
		i++;
	}
	sortData(lId, fId, i);

	for (i = 0; i < 4; i++)
	{
		outFile <<  " " << fId[i] <<"  "<<total <<endl;
	}
	
	return 0;
}


void sortData(string lId[], string fId[], int noOfRows)
{
	int i, j;
	int max;

	// selection sort
	for (i = 0; i < 4; i++)
	{
		// step a
		max = i;

		for (j = i ; j < noOfRows; j++)
			if (lId[j] < lId[max])
				max= j;

		if(max!=i)// step b
		lId[i].swap(lId[max]);
	}
}

Dani AI

Generated

Short summary and diagnosis: the odd -858993460 is not a mysterious file value but garbage from uninitialised memory (Visual C++ debug builds commonly show that pattern). The code shown by reads rows into fixed-size arrays but then uses fixed loops and the EOF pattern, so one or more array slots never get valid data yet are still printed. That out‑of‑bounds / extra-iteration behavior explains both the stray number and why the sort looks wrong.

Practical fixes (in order):

  • Read and count rows robustly: attempt to read a pair of fields each loop and stop when the read fails. Keep a running count of successful rows and never access past that count. Do not rely on the stream EOF flag alone.
  • Store numeric columns in numeric variables rather than strings, so comparisons are numeric and unambiguous.
  • When sorting, always move whole rows. If you use separate arrays for id and value you must swap both entries together; otherwise the id/value pairing breaks. A cleaner option is a single struct/pair (or a vector of pairs) and swap the struct, then apply selection sort (find max in the unsorted tail and swap the entire row into position) for descending order.

Additional debugging tips: print the row count after reading to confirm how many rows were actually stored. Add bounds checks before writing into arrays. Initialize arrays or use std::vector to avoid fixed-size overflows. Remember that for tiny datasets (three or four items) you will not see measurable speed differences between selection and bubble sorts — correctness and safe indexing matter more.

Recommended Answers

All 9 Replies

Here's an example based on your code that may help:

void sortData(int lId[], int fId[], int noOfRows);

int main ()
{
   int lId[4];
   int fId[4];
   while (inFile >> fId[i])
   {
      inFile >> lId[i] ;
      i++;
    }
    sortData(lId, fId, i);

    for (i = 0; i < 4; i++)
    {
       outFile <<  " " << fId[i] <<"  "<< lID[i] << endl;
      }
}


void sortData(int lId[], int fId[], int noOfRows)
{
    int i, j;
    int temp;

    //bubble sort
    for (i = 0; i < noOfRows - 1; i++)
    {
       for (j = i + 1; j < noOfRows; j++)
       {
          if (lId[i] < lId[j])
          {
              temp = lId[j];
              lId[j] = lId[i];
              lId[i] = temp;

              temp = fId[j];
              fId[j] = fId[i];
              fId[i] = temp;
          }
     }	
}

but I want to do a selection sort because it more quickly than bubble sort

Then use the principles demonstrated and and convert the example into a selection sort. But for 4 items to sort, you won't notice a difference between the two types of sorts.

I try to read this file firt , but it have -858993460 in the last?

1 20
2 15
3 50
-858993460
Press any key to continue

#include <fstream>
#include <string>
#include <iomanip>
#include <iostream>

using namespace std;

void sortData( string fId[], int noOfRows);

int main ()
{
	// step 1

	string fId[4];
	int total[4],  i = 0, num = 0;

	ifstream inFile; // input stream variable for data file
	ofstream outFile; // output stream variable for result data

	inFile.open("jes.txt");

	if (!inFile) // step 3
	{
		cout << "Cannot open the input file." << endl;
		return 1;
	}

	outFile.open("jes2.txt");// step 4

	while (!inFile.eof())
	{
		inFile >> fId[i]  >> total[i] ;
		i++;
	}
	sortData( fId, i);

	for (i = 0; i < 4; i++)
	{
		cout<<  " " << fId[i] <<"  "<<total[i] <<endl;
	}
	
	return 0;
}


void sortData(string fId[], int noOfRows)
{
	int i, j;
	int max;

	// selection sort
	for (i = 0; i < 4; i++)
	{
		// step a
		max = i;

		for (j = i ; j < noOfRows; j++)
			if (fId[j] < fId[max])
				max= j;

		if(max!=i)// step b
		fId[i].swap(fId[max]);
	}
}

I try to read this file firt , but it have -858993460 in the last?

1 20
2 15
3 50
-858993460
Press any key to continue

When are you going to start asking questions in a way that we don't have to guess what the problem is? Either change the input file to match the program or change the program to match the input file. What does -858993460 represent?

This is a data that I wnt try to read..but why when i compile it appear -858993460
after 50?why..i dont know what is -858993460

1 20
2 15
3 50

#include <fstream>
#include <string>
#include <iomanip>
#include <iostream>

using namespace std;

void sortData( string fId[], int noOfRows);

int main ()
{
	string fId[4];
	int total[4],  i = 0, num = 0;

	ifstream inFile; 
	ofstream outFile; 

	inFile.open("jes.txt");

	if (!inFile) 
	{
		cout << "Cannot open the input file." << endl;
		return 1;
	}

	outFile.open("jes2.txt");

	while (!inFile.eof())
	{
		inFile >> fId[i]  >> total[i] ;
		i++;
	}

	for (i = 0; i < 4; i++)
	{
		cout<<" "<<fId[i]<<"  "<<total[i] <<endl;
	}
	
	return 0;
}

for (i = 0; i < 3; i++)

yehaaaaaaaaaaa...i get that it..after i change from 4 to 3 then the -858993460
dont appear......

This is a data that I wnt try to read..but why when i compile it appear -858993460
after 50?why..i dont know what is -858993460

1 20
2 15
3 50

Well, is -858993460 in the input file or is it in the output when your run it or both? My point is that we have no way of knowing from posts like this:

I try to read this file firt , but it have -858993460 in the last?

1 20
2 15
3 50
-858993460
Press any key to continue

You need to start being a lot more clear in your posts so we don't have to continually ask you for clarification.

-858993460
is the output file,,,,thank you Master Vernon

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.