Автор | С++ гуру :) |
для КусочекНеба:
нажми на изображение для увеличения... |
Для Triode:
Да, потоки надо закрывать. Они автоматически закрываются деструктором.
Для Mechtatel:
Через пару-тройку часов пойду на нормальной машине компилировать, все отлажу и выложу тебе сюда нормальную версию. |
Хм, у меня все работает. Возможно, у тебя крэш из-за маленького стека, убери тогда мой массив int a[SIZE_ARRAY]; и подставь свой, в котором ты хочешь держать числа.
Конечно, если досконально следовать букве твоего задания то нужно читать последние 20 чисел в строке, а не числа с 5 по 24 позицию. Если это критично, то можно с помощью getline() читать все в вектор, а потом из него брать последние 20 элементов.
#include <fstream>
//#include <iostream>
#include <sstream>
using namespace std;
const int SIZE_ARRAY = 1000; // Размер массива int a[n]
int a[SIZE_ARRAY];
int main ()
{
ifstream ifs("data.dat");
if (ifs)
{
string temp;
int p = 0; // Номер позиции в массиве
while (ifs.good())
{
const int NUM_COL_SKIP = 4; // Пропустить первые 4 числа
const int NUM_COL_TAKE = 20; // Взять следующие 20 чисел
for (int i = 0; i < NUM_COL_SKIP; i++)
ifs >> temp;
for (int i = 0; i < NUM_COL_TAKE; i++) {
ifs >> temp;
istringstream (temp) >> a[p++];
}
}
}
// for (int i = 0; i < 100; i++) cout << i << ": " << a[i] << endl;
} |
А, я понял, отчего у тебя падает. Файл содержит явно больше, чем 1000 чисел, поэтому происходит запись за пределы массива. Увеличь размер.
Вот в этом и состоят проблемы С, всегда нужно следить за размерам данных.
А на С++ можно использовать вектор, который сам увеличивает свой размер, если это необходимо. |
А, я понял, отчего у тебя падает. Файл содержит явно больше, чем 1000 чисел, поэтому происходит запись за пределы массива. Увеличь размер.
Или заменить while (ifs.good()) на цикл со счётчиком до конца массива с этой же проверкой, что-то вроде
for (int n = 0; i < SIZE_ARRAY && ifs.good(); i++) {...}
для Mechtatel:
Такие ошибки легко в отладчике отследить. Интересно, что ты подразумевал под "это неготовая программа такую ошибку выдаёт". |
Да, так надежнее. Хотя вообще, неудобно с массивами. Даже если сейчас он подберет оптимальный SIZE_ARRAY, то никто не гарантирует, что файл не увеличится в будущем.
Лучше всего использовать vector<int>; |
для RealPsycho:
предполагается, что количество строк будет известным, а собственно оттуда и количество чисел в массиве. 1000 чисел я так написал от балды как говорят, чтобы проверить будет ли работать, думал будет достаточно ... |
для RealPsycho:
поставил размер массива 10000 , вроде заработало :) Ещё вот такой глупый вопрос: откуда компилятор знает, что это выражение :
05.09.2011
всего навсего только одно число ? Потому, что между двумя пробелами находится или по какому другому критерию ? :) |
есть файл с такими данными :
3650 08.04.2011 А 1 3 6 19 20 21 27 28 33 40 46 47 50 51 56 57 59 60 61 64 77
3651 09.04.2011 А 2 4 5 6 7 9 11 13 15 23 26 35 38 40 41 44 48 54 63 71 76
3652 10.04.2011 А 3 5 8 10 12 21 24 31 32 34 55 57 58 59 63 67 69 70 71 73 74
3653 11.04.2011 А 1 1 3 10 15 21 24 26 27 32 39 43 45 47 49 50 51 55 62 68 77
а нужно чтобы было :
3 6 19 20 21 27 28 33 40 46 47 50 51 56 57 59 60 61 64 77
4 5 6 7 9 11 13 15 23 26 35 38 40 41 44 48 54 63 71 76
5 8 10 12 21 24 31 32 34 55 57 58 59 63 67 69 70 71 73 74
1 3 10 15 21 24 26 27 32 39 43 45 47 49 50 51 55 62 68 77
У меня есть идея: если у тебя уже есть файл, который нужно получить, то ты можешь просто заменить первоначальный файл тем, который нужно получить.
Ну как? |
08.04.2011
точнее вот этот набор. Откуда компилятор знает что это одно чило ? Я в сообщении 87 немного неудачный пример привел - не с первого сообщения темы, поэтому трудно будет разобраться :) |
для Некресть:
нет )) у меня нет конечного файла )) он каждый раз будет другим. Я когда раньше писал эту программу на Qbasic вручную чистил все строки в файле, чтобы получить такой результат :) (просто не было времени разбираться с написанием программы да и не знал если честно как организовать это всё) и у меня уходило до часа каждый раз на ручную чистку. :( Поэтому спасибо RealPsycho за то, что облегчил мои страдания :) |
Интересно, что ты подразумевал под "это неготовая программа такую ошибку выдаёт".
я имел ввиду что ещё не готовая программа, а только в компиляторе. То есть не собранная уже в один файл, как конечная :) |
тема закрыта by Mechtatel (2012-01-28 23:59:48) |
---|