Ошибка компиляции C++ на std::basic_ifstream
Я должен написать программу, которая объединяет числа в двух файлах и записывает все числа в третий файл. Программа принимает входные данные из двух разных файлов и записывает их выходные данные в третий файл. Каждый входной файл содержит список чисел типа int в отсортированном порядке от наименьшего к наибольшему. После запуска программы выходной файл будет содержать все числа в двух входных файлах в одном более длинном списке в отсортированном порядке от наименьшего к наибольшему. Я не уверен на 100%, что моя логика верна. Спасибо за помощь.
inputFile1:
1 2 3 4 5 6 7 8 9 10
inputFile2:
11 12 13 14 15 16 17 18 19 20
#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;
int main()
{
int num1, num2;
ifstream inputFile;
ifstream inputFile2;
inputFile.open ("input1.txt");
inputFile2.open("input2.txt");
ofstream outputFile;
outputFile.open("output.txt");
inputFile >> num1;
inputFile2 >> num2;
while(inputFile.eof() && inputFile2.eof())
{
if (num1 < num2)
{
outputFile << num1;
inputFile >> num1;
}
else
{
outputFile << num2;
inputFile2 >> num2;
}
}
inputFile.close();
inputFile2.close();
outputFile.close();
return 0;
}
3 ответа
Если с помощью стандартной библиотеки все в порядке, то вы можете использовать merge
:
int main()
{
ifstream inputFile("input1.txt");
ifstream inputFile2("input2.txt");
ofstream outputFile("output.txt");
typedef istream_iterator<int> IT;
typedef ostream_iterator<int> OT;
std::merge(IT(inputFile), IT(), IT(inputFile2), IT(), OT(outputFile, " "));
outputFile.flush();
}
Также обратите внимание, что конструктор i/ofstream может открывать файл во время инициализации.
inputFile2.open();
явно опечатка для inputFile2.close();
Но я боюсь, что ваша логика совершенно неверна. Вы не поняли смысл упражнения. Предполагается, что вы одновременно открываете и входные файлы, и выходной файл, и вы не должны использовать массив для хранения и сортировки чисел. Если вы все сделаете правильно, вам не понадобится массив и вообще не нужно будет выполнять какую-либо сортировку. В этом смысл упражнения.
И повторить то, что уже было сказано хотя бы миллион раз на этом форуме. Не использовать
while (!inputFile.eof())
Это неверно. Использовать
while (inputFile >> num)
Это очень простой набросок того, как сделать слияние. Там много деталей, чтобы заполнить.
inFile1 >> num1;
inFile2 >> num2;
while (something or other)
{
if (num1 < num2)
{
outFile << num1;
inFile1 >> num1;
}
else
{
outFile << num2;
inFile2 >> num2;
}
}
Здесь есть ирония, "то или иное", вероятно, связано с использованием eof()
, Это один из случаев при использовании inFile.eof()
это правильная вещь.
Кстати, ваши входные данные не очень хороши. Каждый файл должен быть отсортирован по отдельности, но вы не должны иметь все числа в file1 меньше, чем все числа в file2. Это не обязательно.