чтение набора целых чисел из текстового файла в столбец по переменным массивам

Если у меня есть текстовый файл, который выглядит так:

4

1 2 3

4 5 6

7 8 9

10 11 12

Я хочу прочитать каждый столбец чисел в переменную x, y и z.
Итак, после прочтения z = [3, 6, 9, 12].

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

Поэтому, возможно, сохранить весь текстовый файл в виде строки с «/ n» для каждой строки, а затем проанализировать x = sting [i], y = string [i + 1], z = string [i + 2] для каждой строки? или что-то похожее на это.

Я думаю, что должен быть лучший способ сделать это, особенно когда n очень большое.

~ (правка) Первое число сверху (в данном случае 4) определяет, сколько строк будет иметь текстовый файл.
Поэтому, если я установлю n = 4, то получим цикл for: for (i = 0; i

0

Решение

Читайте по одному элементу за раз, добавляя каждый элемент в соответствующий массив:

std::vector<int> x,y,z;
int xx, yy, zz;
while(std::cin >> xx >> yy >> zz) {
x.push_back(xx);
y.push_back(yy);
z.push_back(zz);
}

РЕДАКТИРОВАТЬ: отвечая на добавленное требование

int n;
if( !( std::cin >> n) )
return;

std::vector<int> x,y,z;
int xx, yy, zz;
while(n-- && std::cin >> xx >> yy >> zz) {
x.push_back(xx);
y.push_back(yy);
z.push_back(zz);
}
3

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

Собираемся на «универсальное» решение (где n количество столбцов). В таком случае вместо отдельных векторных переменных лучше использовать вектор векторов:

std::fstream file("file.txt", ios_base::in);
std::vector< std::vector<int> > vars(n, vector<int>(100));
int curret_line = 0;

while (!file.eof())
{
for (int i=0; i<n; ++i)
{
file >> vars[i][current_line];
}
++current_line;
// if current_line > vars[i].size() you should .resize() the vector
}

РЕДАКТИРОВАТЬ: обновленный цикл в соответствии с комментариями ниже

int i=0, current_line = 0;
while (file >> vars[i][current_line])
{
if (i++ == n)
{
i = 0;
++current_line;
}
}
1

Вот один из способов сделать это с некоторой базовой проверкой ошибок. Мы будем рассматривать строку с числом, меньшим или большим, чем 3, как ошибку:

#include <fstream>
#include <string>
#include <sstream>
#include <cctype>

std::ifstream file("file.txt");
std::string line;
std::vector<int> x,y,z;

while (std::getline(file, line)) {
int a, b, c;
std::istringstream ss(line);

// read three ints from the stream and see if it succeeds
if (!(ss >> a >> b >> c)) {
// error non-int or not enough ints on the line
break;
}

// we read three ints, now we ignore any trailing whitespace
// characters and see if we reached the end of line
while (isspace(ss.peek()) ss.ignore();
if (ss.get() != EOF) {
// error, there are more characters on the line
break;
}

// everything's fine
x.push_back(a);
y.push_back(b);
z.push_back(c);
}
0
По вопросам рекламы [email protected]