我有几个向量。他们的元素有一个处理。底线是我必须处理元素并将它们写入文件。所以我这样做,但我得到了一些垃圾。更准确地说,我得到了我应该得到的,但同时我得到了垃圾。
我举个例子。
我有两个文件。1.txt&2.txt
内容1.txt:
4.3 2.1 5.3 20.4 1.1 200.5
2.txt是我不断上传处理结果的文件。
示例 1. 在向量 X 的末尾添加另一个元素 - 14.3
预期的:4.3 2.1 5.3 20.4 1.1 200.5 14.3
挂号的:4.3 2.1 5.3 20.4 1.1 200.5 14.3 /20.4 /Y.
示例 2:将序列 Y 的元素分配给 X 值
预期的:4.3 /2.1 /5.3 /20.4 /1.1 /200.5 /14.3
挂号的:4.3 /2.1 /5.3 /20.4 /1.1 /200.5 /14.3 /Y.
示例 3:通过值查找元素的位置(正在寻找 200.5)
预期的:Элемент найден перед 14.3
挂号的:
Элемент найден перед 14.3
00.5 /14.3 /Y.
例 5。对序列的前五个元素进行排序
预期的:1.1 /2.1 /4.3 /5.3 /14.3 /200.5 /20.4
挂号的:1.1 /2.1 /4.3 /5.3 /14.3 /200.5 /20.4 /Y.
示例 6.从第一个序列中删除最后 3 个元素
预期的:4.3 2.1 5.3
挂号的:
4.3
2.1
5.3
/14.3 /200.5 /20.4 /Y.
我怀疑我错误地组织了输出。但是如何正确组织呢?是否可以制作一个可以调用的正确工作函数,以免重复相同的代码 150 次?同样,我不知道该怎么做。
直接代码:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
void show_vector(vector<float>& vec);
int main()
{
setlocale(0, "");
cout << " 1) создал пустую последовательность Х\n";
vector<float> X;
cout << " 2) заполнил Х из файла 1.txt\n";
ifstream fin;
fin.open("1.txt");
if (!fin) cout << "\nНе могу открыть файл 1.txt для чтения.\n";
int counter = 0;
while (!fin.eof()) {
X.resize(counter + 1);
fin >> X[counter];
counter++;
}
fin.close();
cout << " 3.1) добавил ещё один элемент в конец вектора\n";
X.push_back(14.3);
cout << " 3.2) записал измененную последовательность в файл 2.txt\n";
fstream fout;
fout.open("2.txt");
if (!fout) cout << "\nНе могу открыть или создать файл 2.txt для записи.\n";
for (size_t i = 0; i < X.size(); ++i) {
fout << X[i] << " ";
}
fout.close();
system("pause");
cout << " 4) создать вторую пустую последовательность\n";
vector<float> Y;
cout << " 5.1) присвоил элементам второй последовательности значения первой\n";
Y.assign(begin(X), end(X));
cout << " 5.2) записать вторую последовательность в файл 2.txt\n";
fout.open("2.txt");
if (!fout) cout << "\nНе могу открыть или создать файл 2.txt для записи.\n";
for (size_t i = 0; i < Y.size(); ++i) {
fout << Y[i] << " /";
}
fout.close();
system("pause");
cout << " 6) найти во второй последовательности позицию элемента, значение которого вводится с клавиатуры результат записать в файл 2.\n";
fout.open("2.txt");
if (!fout) cout << "\nНе могу открыть или создать файл 2.txt для записи.\n";
float x;
cout << "Определите значение, позицию которого Вы хотите найти -->> "; cin >> x;
vector<float>::iterator i = find(Y.begin(), Y.end(), x);
if (i == Y.end()) // если элемент не найден, то find вернет Y.end()
fout << "Элемент не найден в последовательности Y.\n";
else {
fout << "Элемент найден";
if (i == Y.begin()) cout << " - это первый элемент\n";
else fout << " перед " << *++i << endl;
}
fout.close();
system("pause");
cout << " 7) упорядочить первые пять элементов второй последовательности и записать в 2.txt\n";
partial_sort(Y.begin(), Y.begin()+5, Y.end());
fout.open("2.txt");
if (!fout) cout << "\nНе могу открыть или создать файл 2.txt для записи.\n";
for (size_t i = 0; i < Y.size(); ++i) {
fout << Y[i] << " /";
}
fout.close();
system("pause");
cout << " 8) с первой последовательности удалить последние 3 элемента. Записать последовательность в 2.txt\n";
// sort(data.begin() + m - n), data.end()); - аналог. m - начало, n - конец
for (int i = 0; i <= 3 && !X.empty(); ++i)
X.pop_back();
fout.open("2.txt");
if (!fout) cout << "\nНе могу открыть или создать файл 2.txt для записи.\n";
for (auto f : X) { fout << f << endl << " "; }
fout.close();
system("pause");
cout << " 9) обменять содержимое первой и второй последовательности, результат вывести на экран с помощью итераторов\n";
cout << "\nДо обмена\n" << "X -->> ";
show_vector(X);
cout << "\nY -->> ";
show_vector(Y);
X.swap(Y);
cout << "\nПосле обмена\n" << "X -->> ";
show_vector(X);
cout << "\nY -->> ";
show_vector(Y);
cout << "\n\n 10) вычислить сумму и среднее арифметическое первой последовательности\n";
float sum(0), avreage(0); counter = 0;
for(size_t i = 0; i < X.size(); i++) {
sum += X[i];
counter++;
}
avreage = sum / counter;
cout << endl << endl << "X -->> "; show_vector(X);
cout << "\nСумма последовательности X -->> " << sum << ", среднее арифметическое последовательности X -->> " << avreage << endl;
cout << "\n\n 11) ИЗ: поделить каждый положительный элемент вектора на минимальный элемент\n";
cout << "\n\nX -->> ";
show_vector(X);
float MinElement = *min_element(X.begin(), X.end()); cout << "\nМинимальный элемент в X -->> " << MinElement << endl;
for(size_t i = 0; i < X.size(); i++) {
if (X[i] > 0) X[i] /= MinElement;
}
cout << "X -->> ";
show_vector(X);
cout << "\n\nY -->> ";
show_vector(Y);
MinElement = *min_element(Y.begin(), Y.end()); cout << "\nМинимальный элемент в Y -->> " << MinElement << endl;
for (size_t i = 0; i < Y.size(); i++) {
if (Y[i] > 0) Y[i] /= MinElement;
}
cout << "Y -->> ";
show_vector(Y);
return 0;
}
void show_vector(vector<float>& vec) {
for(vector<float>::iterator it = vec.begin(); it != vec.end(); ++it)
cout << *it << " ";
}
在所有情况下,我根据以下原则组织结论:
fsteram fout;
....
fout.open("2.txt");
if (!fout) cout << "\nНе могу открыть или создать файл 2.txt для записи.\n";
for (size_t i = 0; i < X.size(); ++i) {
fout << X[i] << " ";
}
fout.close();
你遇到了一个不理解 eof 的典型问题。eof 不检查“文件是否结束”。它检查“上次读取时文件是否结束”。因此,读取了一个额外的数字
而不是这个可怕的
最好这样写
更漂亮更容易。