Чтение чисел с плавающей запятой в динамически распределяемый при увеличении размера массива при чтении файла - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь прочитать числа с плавающей запятой из файла в динамически размещенный двумерный массив.Я использую c ++.

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

Мой вопрос -

Могу ли я увеличить размер моего массива в зависимости от номера?элементов (строк и столбцов) присутствующих в файле?Если так, пожалуйста, предложите способ сделать это.

Я подумал написать нет.строк и столбцов в первой строке текстового файла и читая их в начале, чтобы установить пределы цикла, который будет выделять пространство для моего массива.Есть ли лучший способ сделать это, возможно, на основе форматирования текстового файла?Таким образом, я думаю, что это будет ближе к потоковому типу данных сценария.

Заранее спасибо.

Ахиль

Ответы [ 2 ]

7 голосов
/ 17 января 2012

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

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

ifstream input("my-file.txt");
vector<float> myValues;

for (float f; input >> f; )
    myValues.push_back(f);

Или, альтернативно:

ifstream input("my-file.txt");
vector<float> myValues;

myValues.insert(myValues.begin(),
                istream_iterator<float>(input),
                istream_iterator<float>());

Однако приведенный выше код будет считывать одномерный массив с плавающей точкой, а не двумерный массив, который вы хотели. Чтобы прочитать двумерный массив, можно прочитать одну строку файла за раз, а затем использовать модификацию приведенного выше кода, чтобы разбить эту строку на отдельные числа с плавающей точкой. Например:

ifstream input("my-file.txt");
vector< vector<float> > myValues;

for (string line; getline(input, line); ) {
    stringstream lineStream(line);

    vector<float> thisLine;

    thisLine.insert(thisLine.begin(),
                    istream_iterator<float>(lineStream),
                    istream_iterator<float>());
    myValues.push_back(thisLine);
}

Надеюсь, это поможет!

0 голосов
/ 17 января 2012

Вы не можете увеличить размер динамически размещаемого массива.Фактически, память, которая следует за ней в куче, возможно, уже была выделена для чего-то другого.

Вместо использования массива используйте структуру данных, которая автоматически обрабатывает изменение размера для вас, например, вложенную std::vector или std::list в зависимости от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...