Мин. / Макс. Логика и ошибка чтения файла

Чтение из файла и мин / макс логика.

По мере поступления дополнительной информации я буду обновлять свои вопросы, утверждения и код каждые 30 минут, поэтому я не буду редактировать быстрее, чем могут ответить некоторые.


У меня вопрос, как мне настроить программу на чтение одного имени за раз, а не объединять имена?

Файл представляет собой TXT-файл и гласит:
Джеки Сэм Том Билл Мэри Пол Зев Барб Джон

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

using namespace std;

int main()
{
// File stream objects
ifstream inputFile;
inputFile.open("LineUp.txt");

// Non-user variables
string  first_In_Line = "",
last_In_Line = "",
previous_Name = "",
next_name = "";if (inputFile)
{

// Display message to user
cout << "Reading file... \n";

while (inputFile >> next_name)
{
cout << next_name;

if (next_name > last_In_Line)
{
first_In_Line = last_In_Line;
last_In_Line = next_name;
}
else if (next_name < first_In_Line)
{
last_In_Line = first_In_Line;
first_In_Line = next_name;
}
// This else clause should only apply to the first iteration
else
{
first_In_Line = next_name;
}
}

//Close the file
inputFile.close();

// Display first in line and last in line
cout << first_In_Line << " is first in line." << endl;
cout << "And " << last_In_Line << " is last in line." << endl;

}
else
{
// Display error message.
cout << "Error opening the file.\n";
}

return 0;
}

Выход:
Чтение файла …
JackieSamTomBillMaryPaulZevBarbJohnJohn является первым в очереди.
И Сэм последний в очереди.

1

Решение

Я предлагаю вам использовать массив затем используйте алгоритм Сортировать функция

Массив — это структура данных, которая используется для сохранения данных во время работы программы.

Поэтому мы можем сохранить эти данные из файла в этот массив. имя массива dataFromFile что могло сохранить до 9 строковых значений. так что если у вас есть больше имен в вашем файле, просто обновите размер массива или используйте вектор

  ifstream file("dataToRead.txt");
string dataFromFile[9];
string line;
int index = 0;

if(!file)
{
cout<<"cannot find this file" <<endl;
}
else
{
if(file.is_open())
{
while (getline(file,line))
{
dataFromFile[index] = line;
index++;
}
file.close();
}
}

Затем отобразите то, что у нас есть внутри массива, используя цикл

   for(int j=0;j<9;j++)
{
// to do display
cout<<dataFromFile[j] <<endl;
}

СЕЙЧАС сортировать их просто #include <algorithm> затем используйте метод сортировки в массиве, который называется dataFromFile

sort(begin(dataFromFile),end(dataFromFile));

Затем снова отобразить, что у вас есть в массив

for(int j= 0 ;j < 9;j++)
{
// after sorting
cout<<dataFromFile[j] <<endl;
}
1

Другие решения

Без использования массивов, что является лучшим решением, была логическая ошибка в операторах if.

Во-первых, строки были инициализированы как пустые, поэтому пустые строки всегда сортировались как first_In_Line. first_In_Line необходимо присвоить значение на первой итерации цикла while.

Затем, на четвертой итерации цикла while, переменные стали нелогично назначенными, и «Сэм» передавался туда и обратно между first_In_Line и last_In_Line через остаток цикла while.

Вот как я решил эту проблему:

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

using namespace std;

int main()
{
// File stream objects
ifstream inputFile;
inputFile.open("LineUp.txt");

// Non-user variables
string  first_In_Line = "",
last_In_Line = "",
next_name = "";

if (inputFile)
{
// Display message to user
cout << "Reading file... \n\n";

while (inputFile >> next_name)
{
cout << next_name << endl; // list the names

if (last_In_Line == first_In_Line)
{
first_In_Line = next_name;
}
else if (next_name > last_In_Line)
{
last_In_Line = next_name;
}
else if (next_name < first_In_Line)
{
first_In_Line = next_name;
}
}

//Close the file
inputFile.close();

// Display first in line and last in line
cout << endl << first_In_Line << " is first in line." << endl;
cout << "And " << last_In_Line << " is last in line." << endl;

}
else
{
// Display error message.
cout << "Error opening the file.\n";
}

return 0;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector