печать странных символов в выходной файл, переполнение стека

Я пишу код, который читает входной файл чисел, сортирует их в порядке возрастания и печатает их для вывода. Единственное, что выводится на печать — это действительно причудливые символы.

Вот мой код

#include <fstream>
#include <iostream>
using namespace std;

int main()
{
int i, y, temp, num[20];
char file_nameI[21], file_nameO[21];
ofstream outfile;
ifstream infile;

cout << "Please enter name of input file:  ";
cin >> file_nameI;
infile.open(file_nameI);
if (!infile)
{
cout << "Could not open input file \n";
return 0;
}

cout << "Please enter name of output file:  ";
cin >> file_nameO;
outfile.open(file_nameO);
if (!outfile)
{
cout << "Could not open output file \n";
return 0;
}

for (i = 0; i < 20; i++)
{
y = i + 1;
while (y < 5)
{
if (num[i] > num[y])      //Correction3
{
infile >> temp;
temp = num[i];
num[i] = num[y];
num[y] = temp;
//y++;          //Correction4
}
y++;
}
}

for (i = 0; i < 5; i++)
outfile << "num[i]:" << num[i] << "\n";

return 0;
}

Вот мой вклад

6 7 9 0 40

Вот вывод

 „Ô,üþ 54
H|À°ÀzY „Ô,üþ 0

3

Решение

Проблемы с вашим кодом уже упоминались в комментариях, но опять же:

  1. Первая проблема — неинициализированные элементы num[20] — элементы num иметь неопределенные значения поэтому доступ к любому из них вызывает неопределенное поведение. Сначала вы должны прочитать их из файла или, по крайней мере, инициализировать их значением по умолчанию.
  2. Часть кода, которая, скорее всего, должна выполнять сортировку, совершенно неверна. Если вы хотите реализовать свою собственную функцию сортировки, вы можете выбрать какой-нибудь известный алгоритм, например, например, быстрая сортировка — но стандартная библиотека C ++ уже обеспечивает функцию сортировки — std::sort,

Помимо очевидных ошибок:

  1. Ты используешь char[] — в C ++ это почти всегда лучше использовать std::string,
  2. Ваш статический массив может хранить только 20 значений, а вы читаете их из файла. Ты можешь использовать std::vector который может расти, когда вы добавляете больше элементов, чем его текущая емкость. Это также автоматически исправляет проблему с неинициализированными элементами num[20],
  3. Как уже упоминалось в комментариях, вы можете организовать свой код и улучшить читаемость, разбив его на функции.

Здесь вы это быстро переписали. Этот код использует std::string вместо char[], std::vector хранить номера и std::sort, Если здесь есть что-то, чего вы не понимаете, прочтите документацию SO:

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> read_file(ifstream& in_file)
{
vector<int> vec;
int value;
while (in_file >> value)
{
vec.push_back(value);
}

return vec;
}

void write_file(ofstream& out_file, const vector<int>& values)
{
for (size_t i = 0; i < values.size(); ++i)
out_file << "value #" << i << ": " << values[i] << '\n';
}

int main()
{
string input_filename, output_filename;
ofstream out_file;
ifstream in_file;

cout << "Please enter name of input file: ";
cin >> input_filename;
in_file.open(input_filename);
if (!in_file)
{
cout << "Could not open input file\n";
return 0;
}

cout << "Please enter name of output file: ";
cin >> output_filename;
out_file.open(output_filename);
if (!out_file)
{
cout << "Could not open output file\n";
return 0;
}

auto numbers = read_file(in_file);

sort(begin(numbers), end(numbers));

write_file(out_file, numbers);

return 0;
}
4

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

Вы можете забыть хранить значения в num массив. Просто обновите ваш код следующим образом, и он будет работать.

infile.open(file_nameI);
if (!infile){
cout << "Could not open input file \n";
return 0;
} else{
i = 0;
while (infile >> num[i]){
i++;
}
}
1

По вопросам рекламы [email protected]