Привет у меня есть текстовый файл, содержащий два массива и одно значение (все целые числа) как это
3 90 22 5 60 33 24
Где первое число обозначает сколько целых чисел для чтения в. Я могу читать во всем этом в одной функции. Мне нужны несколько функций, чтобы смочь использовать различные матрицы и первую переменную?
ifstream in(SOMEFILE.dat);
if (!in) {
cerr << "Cannot open file.\n";
return -1;}
in >> VAR;
A=new int[VAR];
B=new int[VAR];
for(int i=0 ;i<VAR;i++){
in >>A[i];
}
for(int i=0 ;i<VAR;i++){
in >>B[i];
}
in.close();
Выше код, который я имею до сих пор, и это работало бы в основной функции. Я должен записать три функции для чтения этой информации в том, таким образом, я могу использовать ее в своей программе или являюсь там каким-либо способом, которым я мог, например, отправить в трехочковых к функции?
I would like A to be 90 22 5
B to be 60 33 24
And VAR to be 3
Спасибо
Всякий раз, когда вы хотите сгруппировать элементы данных, используйте класс или структуру. Например, чтобы передать три целых числа в качестве координат x, y и z,:
struct Coord {
int x, y, z;
};
и затем передать структуру в функцию:
void f( Coord & c ) {
}
То же самое относится и к массивам, но в вашем случае вы бы сделали так, чтобы структура содержала указатели.
Ваш вопрос фактически открывает огромные области программирования на C++, о которых, похоже, вы не знаете. Некоторые вещи, о которых вам следует прочитать, прежде чем двигаться дальше:
Это может показаться много, но как только вы будете иметь четкое представление об этом, вы найдете программирование на C++ намного, намного проще и безопаснее.
Самый простой способ - определить тип, скажем структуру, который представляет данные из одной строки:
struct MyMatrix
{
int size;
int *a;
int *b;
};
Затем напишите функцию, которая читает одну такую экземпляр из строки текста:
struct MyMatrix load_matrix(std::ifstream& stream)
{
MyMatrix m;
stream >> m.size;
m.a = new int[m.size];
for(int i=0 ;i < m.size; i++)
stream >> m.a[i];
m.b = new int[m.size];
for(int i=0 ;i < m.size; i++)
stream >> m.b[i];
return m;
}
В этом коде отсутствует проверка ошибок, но вы можете это добавить. Помните, что выделение памяти может дать сбой.
Если вы хотите вернуть несколько элементов, вы можете либо использовать дополнительные выходные параметры в своих функциях (передаваемых по ссылке), либо вернуть кортеж. Я предпочитаю более поздний вариант, так как он дает более читаемый код.
Вместо того, чтобы вручную управлять памятью ваших массивов с помощью new
и delete []
, вы можете использовать std :: vector
для достижения эквивалентного поведения . Каждый вектор хранит свой размер, поэтому вам не нужно возвращать для этого дополнительную переменную.
Подводя итог, в этом случае вы можете просто вернуть кортеж из двух векторов. В стандартной библиотеке двухэлементные кортежи представлены классом std :: pair
. Следовательно, ваша функция вернет пару векторов: std :: pair
. Так как набирать много, лучше использовать typedef
.
Это одна из возможных реализаций вашей функции. Обратите внимание, что вы можете избежать написанных вручную циклов благодаря стандартному классу istream_iterator
:
typedef std::pair<std::vector<int>, std::vector<int> > Data;
Data read(std::ifstream & ifs)
{
int n;
ifs >> n;
typedef std::istream_iterator<int> in_it;
std::vector<int> a(n);
std::copy(in_it(ifs), in_it(), a.begin());
std::vector<int> b(n);
std::copy(in_it(ifs), in_it(), b.begin());
return Data(a, b);
}
И вот как вы будете использовать свою функцию.Обратите внимание, что вы не возвращаете размер неявно, но вы можете легко получить его с помощью std :: vector :: size ()
.
int main() {
std::ifstream ifs("SOMEFILE.txt");
Data data = read(ifs);
unsigned int n = data.first.size();
std::vector<int> & a = data.first;
std::vector<int> & b = data.second;
return 0;
}
РЕДАКТИРОВАТЬ: Предложение Нила использовать выделенную структуру
лучше масштабируется и приводит к более удобочитаемому коду, так что вы обязательно должны учитывать это. В этом случае ваша структура будет такой:
struct Data {
std::vector<int> a, b;
};
И ваша функция main
будет идентична, за исключением того, что вы должны заменить first
и second
на a
и b
.
Или просто используйте params по ссылке.
int theFunction(int*& arrayA, int*& arrayB){
int size;
// ...
arrayA = new int[size];
arrayB = new int[size];
// ...
return size;
}