Потребовалось написать программу, которая считает с текстового файла числовые данные, запишет их в массив, затем проведет некую математическую обработку и запишет результат в текстовый файл. Проблема в том, что при записи в результирующий файл записывается только "0 ," и всё, хотя подсчёт происходит правильно. В чём проблема? Исходный текстовый файл имеет вид:
-0.00276953502907418,-0.0026706230637501,-0.00237388716777787,-0.00227497520245379,-0.00296735895972233,-0.00227497520245379,-0.00257171109842602,-0.00197823930648156,-0.00257171109842602,-0.00217606323712971,-0.00306627092504641,-0.00237388716777787,-0.00217606323712971,-0.00296735895972233,-0.00227497520245379,-0.00237388716777787,-0.00227497520245379,-0.00207715127180563,-0.00257171109842602,-0.00227497520245379,-0.00197823930648156,-0.00217606323712971,-0.00257171109842602,-0.00237388716777787,-0.00257171109842602,-0.00247279913310194,-0.0026706230637501,-0.00237388716777787,-0.00286844699439826,-0.00227497520245379,-0.00257171109842602,-0.00286844699439826,-0.0026706230637501,-0.00217606323712971,-0.00247279913310194,-0.00207715127180563,-0.00276953502907418,-0.00296735895972233,-0.0026706230637501,-0.00257171109842602,-0.00296735895972233,-0.00227497520245379,-0.00237388716777787,-0.00237388716777787,-0.00257171109842602,-0.00227497520245379,-0.00286844699439826,-0.00257171109842602
Сама программа:
# include <iostream>
# include <fstream>
# include <string>
# include <vector>
# include <cstdlib>
int main() {
const double m = 0.0008;
double h = 1/200000000.;
int rpt = 1;
int count = 0;
int i, j, k;
double c;
std::string filename, outname;
std::vector<double> signal;
setlocale(LC_ALL, "rus");
//Открываем файл
std::cout << "Введите имя файла" << std::endl;
std::cin >> filename;
std::ifstream infile(filename);
if (!infile.is_open())
std::cout << "File not found!" << std::endl;
else {
std::cout << "File opened!" << std::endl;
std::string buffer = "";
//Считываем в массив
while (!infile.eof()) {
std::getline(infile, buffer, ',');
double value = atof(buffer.c_str());
signal.push_back(value);
count++;
}
double b[count];
double x[count];
double t[count];
double res[count];
//Математическая обработка
for (i = 0; i < count; i++) {
b[i] = 0.0;
x[i] = 0.0;
}
for (i = 0; i < rpt; i++) {
for (j = 0; j < count; j++) {
double y = 0.0;
for (i = count; i > 0; i--)
x[i] = x[i-1];
x[1] = signal[j];
for (k = 0; k < count; k++)
y += x[k]*b[k];
if (y>1.0)
y = 1.0;
else if (y<-1.0)
y = -1.0;
res[j] = signal[j] - y;
if (res[j]>1.0)
res[j] = 1.0;
else if (res[j]<-1.0)
res[j] = -1.0;
if (j==0)
t[j] = 0;
else
t[j] = t[j-1] +h;
c = 2*m*res[j];
for (k = 0; k < count; k++)
b[k] += x[k]*c;
}
}
// Запись в файл (Проблема!)
std::cout << "Введи имя файла для записи" << std::endl;
std::cin >> outname;
std::ofstream outfile;
outfile.open(outname);
if (outfile.is_open()) {
for (i = 0; i < count; i++)
outfile << res[i] << ", ";
}
outfile.close();
}
infile.close();
return 0;
}
Компилятор GCC.
for (i = count; i > 0; i--) x[i] = x[i-1];выход за границы массива, наверное подразумевалосьfor (i = count - 1; i > 0; i--)и последующееx[0] = signal[j];. – Vladimir Gamalyan Jul 22 '19 at 07:50double b[count]наvector<double>b(count). И еще - см. этот вопрос. – Harry Jul 22 '19 at 07:54atof, которая из-за русской локали, считает, что плавающая точка отделена запятой, а входные данные в качестве разделителя используют точку. – eanmos Jul 22 '19 at 07:57