2015-03-02 4 views
0

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

Пример нескольких строк из входного файла:

3#456 
33#123456789 

Цифры перед знаком фунта представляют элементы вектора или матрицы, поэтому 3 # означает вектор три элемента и 33 # будет означает матрицу с 3 строками и 3 столбцами.

Чтение данных на самом деле не является проблемой, так как нам сказали, что мы можем предположить, что мы знаем, какие строки являются матрицами и которые являются векторами, однако я никогда не работал с файлами ввода/вывода C++, поэтому я не знаю, как итерации по номерам 4,5,6 и поместить их в динамически созданный массив 3, 9, 12 и т. д. Вот несколько примеров того, с чем я работаю.

int *a; 
int size_a; 
char x; 

ifstream infile("input.txt"); 

if (infile.is_open()) 
{ 
    infile >> size_a; 

    // The x is basically a junk variable used to go past the '#' 
    // when reading the file 
    infile >> x; 

    a = new int[size_a]; 
} 

После этого, я не имею ни малейшего представления о том, как цикл до конца строки и положить остальные элементы в массиве. Например, в этой строке числа 4, 5 и 6 нужно будет поместить в массив, а затем перейдем от добавления элементов и перейдите к следующей строке для работы над следующим массивом, который я не знаю, как сделайте это. Есть идеи?

+1

... Вы не используете динамические массивы. Вы хотите 'std :: vector' –

+2

Нет необходимости в векторах; 'new' дает возможность создавать массивы, размер которых известен не во время выполнения, а во время компиляции. Вы правы, это не динамически изменяемые размеры массивов, но они соответствуют требованиям OP, которые не включают изменение размера - просто не зная размер априори. – EyasSH

+0

Вам нужно будет передать каждую цифру в переменную 'char' (например,' 'c'"), затем вы можете преобразовать ее из ASCII в число, используя выражение 'c - '0''. Используйте эти числа, чтобы получить правильные значения (и) значка 'size_a', а также значения элементов для записи в массивы/матрицы. –

ответ

2

Этот код сделает это за вас. Обратите внимание, что здесь вам не нужно использовать new - вы должны просто использовать std :: vector. В этом случае номер перед «#» не нужен, так как вам не нужно указывать размер массива при его создании.

По этой причине я использовал new здесь, чтобы показать вам, как читать обе части файла.

#include <iostream> 
#include <fstream> 
#include <string> 

int main() 
{ 
    std::ifstream file("input.txt"); 

    if(file.good()) { 
     std::string line; 
     std::getline(file, line); 
     std::string::size_type pos = line.find('#'); 
     std::string strSize = line.substr(0, pos); 
     std::string strValues = line.substr(pos + 1); 
     int size = 0; 

     for(char c : strSize) { 
      if(size == 0) 
       size = static_cast<int>(c - '0'); 
      else 
       size *= static_cast<int>(c - '0'); 
     } 

     int* values = new int[size]; 

     for(int i = 0; i < size; ++i) { 
      values[i] = static_cast<int>(strValues[i] - '0'); 
     } 

     std::cout << "Array of size " << size << " has the following values:" << std::endl; 

     for(int i = 0; i < size; ++i) { 
      std::cout << values[i] << std::endl; 
     } 

     delete[] values; 
    } 
} 
Смежные вопросы