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

Код Пседо:

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

int main() {
string line;
double beta[250];
char Batob[250], eq[250];
ifstream myfile("iter1/HMMemit0.txt");

if (myfile.is_open())
{
int i = 0;
while (getline(myfile, line))
{
istringstream iss(line);
if (!(iss >> Batob[i] >> eq[i] >> beta[i])){ //it store only B in Batob[i], but i want to save B00 in Batob[i], = in eq[i], and 0.524671 in beta[250]
break;
}
i++;
}

myfile.close();
}
else cout << "Unable to open file";
return 0;
}

мои данные хранятся в HMMemint0, как это

B00 = 0.524671
B01 = 0.001000
B02 = 0.001000
B10 = 0.001097
B11 = 0.001000
B12 = 0.001000

я хочу прочитать строку и сохранить каждый член в каждой переменной, например, B00, сохраненный в имени [i], и 0,001000 в бета-версии [i].
а затем запишите его в следующем порядке: 0,524671 (значение B00) 0,001097 (значение B10)

0.524671 0.001097
0.001000 0.001000
0.001000 0.001000

Как мне это сделать? Помогите мне, пожалуйста.

1

Решение

У вас есть массив символов для «BXX», в то время как вы хотите строки. По сути, вам нужен массив строк или даже вектор. Проблема в том, что только «B» будет прочитано из «BXX» в ваш первый параметр.

Этот код работает для меня:

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

int main() {
string line;
double beta[250];
string Batob[250];
char eq[250];
ifstream myfile("iter1/HMMemit0.txt");

if (myfile.is_open())
{
int i = 0;
while (getline(myfile, line))
{
istringstream iss(line);
iss >> Batob[i] >> eq[i] >> beta[i];
i++;
}

myfile.close();
}
else cout << "Unable to open file";
return 0;
}

Отказ от ответственности: я просто исправлял ваш код с наименьшим влиянием, но, конечно, если вы начнете использовать надлежащие контейнеры C ++, такие как vector, i переменная может быть легко удалена, так как элементы и индекс будут поддерживаться автоматически.

Кроме того, поскольку вы постоянно используете знак равенства (‘=’) для массива char, это немного ненужная трата памяти, которая может быть серьезной в случае большого файла.

Я бы сказал, что использование ассоциированного контейнера в будущем будет еще более продуктивным для вашего BXX ключи и их соответствующие values на правой стороне.

1

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

Batob это массив символов, так Batob[i] это один символ Вот почему ваша программа читает только один символ. Если вы хотите прочитать 250 строки символов вам нужно освободить место для них. Самый простой (не обязательно лучший, однако) метод — объявить массив как char Batob[250][100] — это будет массив из 250 массивов по 100 символов в каждом. затем Batob[i] массив из 100 символов, и вы можете ввести строку с iss >> Batob[i],

0

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