Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > считывание из файла


Автор: koren 11.4.2010, 17:42
Нужно считать из файла такую информацию

Код

1 2 3 4 5
7 8 9 0 2
3 4 5 4 3;

1 11 1 2 -1;

13 10 1;


с помощью ifstream

считать первый массив в динамический массив A, второй - с, третий - в 

количество пробелов между массивами может быть много

; символ окончания массива

изначально я не знаю какая размерность массивов

я думаю нужно посчитать количество пробелов первой строки +1 - количество столбцов
количество символов окончания строки - количество строк

Проверка на символ окончания строки или "Enter" 

Как произвести считывание такой информации?

Автор: NewDima 12.4.2010, 06:59
koren, где вопрос?

Автор: bsa 12.4.2010, 13:20
koren, с помощью std::getline(file, buffer, ';'); считываешь строковое представление массива в буфер типа std::string. затем заворачиваешь его в std::stringstream и распарсиваешь в вектор с помощью std::copy(std::istream_iterator<int>(stream), std::istream_iterator<int>(), std::back_inserter(array)); Повторяешь для каждого из массивов A, B и C.

Автор: htzg 17.4.2010, 21:43
я бы сделал так:

Код
#include <fstream>
#include <string>
#include <iostream>
#include <vector>

int main()
{
std::vector<int> VecForInt; // создаем динамический массив для данных типа int
std::vector<std::vector<int>> VecForVec; // динамический массив для массивов. Т.е. их может быть и три и более...
std::ifstream ifile; // создаем файл-поток
std::string filespec;
std::cin >> filespec;
ifile.open( filespec.c_str() ); // открываем файл. Метод класса string  с_str() превращает string в char
if( !ifile.fail() ) // если файл открылся без ошибок
{
std::string temp;
while( !ifile.eof() )  // считываем до конца файла
{
ifile >> temp; // оператор ">>" извлекает из потока данные (в нашем случае string) пропуская пробелы, табы, переносы строки. 
                      // Почему string а те int ? Потому что, как я понял символ ";" может примыкать к цифре без пробела...

if( temp.at( temp.size()-1 ) == ';') // метод at() возвращает значение i-того элемента, начиная с 0. Метод size() возвращает размер string
{
if(temp.size() > 1)
{
temp = temp.substr(0,temp.size()-2); // убираем в конце ";" , если это необходимо
VecForInt.push_back( atoi(temp.c_str()) ); // ф-ия atoi превращает из char в int, 
}
VecForVec.push_back(VecForInt); // кладем массив с int в массив для массивов
VecForInt.clear(); // очищаем массив для int
}
else
{
VecForInt.push_back( atoi(temp.c_str()) );
}
}
}
else
std::cout << "Error: ifile not open" << std::endl;
// далее можете извлекать из VecForVec с помощью функции at() нужный Вам вектор, а из вектора нужный член с помощью того же метода at()
//пример:
//VecForVec.at(0).at(0);  // первый член из первого массива
//VecForVec.at(1).at(0);  // первый член из второго массива
// и т.п.
// так же можно(и желательно) с помощью iterator . Если не знаете советую почитать.
return 0;
}



Модератор: не забываем пользоваться кнопочкой "Код" и оформлять код.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)