Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнение динамического массива данными из файла 
V
    Опции темы
vitalyisaev2
Дата 7.9.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



Здравствуйте, я написал программу по работе с динамическим массивом. Программа выполняет следующие действия:
1. Открывает входящий файл.
2. Считает количество строчек в нём -> count.
3. Создает динамический массив, состоящий из count элементов.
4. Считывает данные из входящего файла и заполняет ими этот массив.
5. Печатает массив на экран.

Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"

int count=0; //Глобальный счётчик элементов во входящем файле

void counter (FILE *f1) //Программа-счётчик количества элементов (строчек) в файле с исходными данными
{
    cout << "\n---void counter function is called---";
    int value;
    while (fscanf(f1,"%d", &value)==1) //Считываем первый файл - просто чтобы посчитать количество точек, ещё не записываем его
        {
            count++;
        }
    cout << "\nFile count OK"; //Посчитали
    cout << "\nTime series contain " << count << " elements.";
}

int *fill_array (FILE *f1) //Программа заполнения динамического массива с чтением файла
{
    cout << "\n---int *fill_array function is called---";
    int *row; //Инициализация динамического массива для хранения временного ряда
    if ((row = new int [count])==NULL) //Выделилась ли память?
        {    
            printf ("\nPointer error.");
            return NULL; 
        }
    int i;
    for(i=0;i<count;i++) //Считываем первый файл - уже в динамический массив
    {
        fscanf(f1,"%f", &row[i]);
    }
    cout << "\nFile input OK";
    return row;
}

void print_array (int* row) //Печатаем содержимое динамического массива
{
    cout << "\n---void print_array function is called---";
    for(int i=0;i<count;i++) //Выводим на экран его содержимое
    {
        cout << "\n " << i <<": "<<row[i];
    }
}

int main(int argc, char* argv[])
{
    cout << "\n\n---int main function is called---";
    FILE *f1, *f2; //Указатели на потоки
    if (argc!=3)//Проверка командной строки    
    {
        printf("\nFiles are not found");
        return 1;
    }
    printf("\nFiles are being opened");
    if((f1=fopen(argv[1], "r")) == NULL) //Открываем входящий поток - файл с исходным временным рядом
    {
        perror(argv[1]);
        return 1;
    }
    if((f2=fopen(argv[2], "w+")) == NULL) //Открываем выходящий поток для записи результатов
    {
        perror(argv[2]);
        return 1;
    }
    counter(f1); //Запустили счётчик записей, результат - в count
    int *row; //Инициализация динамического массива для дальнейшей работы
    row=fill_array (f1);//Динамический массив заполняется специальной функцией, открывающей файл с исходными данными
    print_array (row);//И выводится на экран
    return 0;
}



Проблема в 5 пункте - она печатает не то, что было в исходном файле. Появляются какие-то одинаковые цифры. Может, она неправильно заполняет динамический массив данными из файла? Или неправильно его выводит на экран?

На вход подается текстовый файл:

Код

10
13
23
4
76
12
-9
4
0
73
12 


результат выполнения программы:
Код

c:\prog\nltsa>nltsa.exe test1.txt res.txt

Files are being opened

---int main function is called---
---void counter function is called---
File count OK
Time series contain 11 elements.
---int *fill_array function is called---
File input OK
---void print_array function is called---
0: -842150451
1: -842150451
2: -842150451
3: -842150451
4: -842150451
5: -842150451
6: -842150451
7: -842150451
8: -842150451
9: -842150451
10: -842150451 


В чём причина этой ошибки? Заранее спасибо.
PM MAIL   Вверх
jonie
Дата 8.9.2010, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



вы когда считаете количество строк после этого не закрываете файл. Т.о. "файловый указатель" будет смотреть на конец файла и при считывании вам будет даваться мусор. Надо проверять всегда на ошибки чтения 8) Вам просто нужно зкрыть-открыть файл перед считыванием инфы.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mrbrooks
Дата 8.9.2010, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



vitalyisaev2, вся эта красота не аналог ли этой черной магии?

Код

    std::ifstream stream("tmp.txt");
    if (stream)
    {
        std::vector<int>vector((std::istream_iterator<int>(stream)),(std::istream_iterator<int>()));
        std::copy(vector.begin(),vector.end(),std::ostream_iterator<int>(std::cout,"\n"));
        stream.close();
    }
    else
        std::cout << "fuck side" << std::endl;


PM MAIL   Вверх
vitalyisaev2
Дата 8.9.2010, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 7.9.2010

Репутация: нет
Всего: нет




mrbrooks, спасибо, но я пока до классов не добрался...
jonie, спасибо, ошибка понятна!
PM MAIL   Вверх
vitalyisaev2
Дата 8.9.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



jonie, то есть надо просто добавить после работы счётчика вот эти строчки, как бы заново инициализировать поток?

Код

fclose(f1);
f1=fopen(argv[1], "r");


или создать новый поток на тот же файл?:

Код

FILE *f1, *f3;
f1=fopen(argv[1], "r");
... //работа первой функции с файлом argv[1]
fclose(f1);
f3=fopen(argv[1], "r");
...//работа второй функции с файлом argv[1]


Оба случая компилируются, но выдают ошибки при работе.


Это сообщение отредактировал(а) vitalyisaev2 - 8.9.2010, 10:46
PM MAIL   Вверх
bsa
Дата 8.9.2010, 10:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(vitalyisaev2 @  8.9.2010,  10:10 Найти цитируемый пост)
mrbrooks, спасибо, но я пока до классов не добрался...
Но при этом cout ты используешь (а это объект класса std::ostream). Зачем мешаешь в кучу ввод/вывод stdio и iostream? Пользуйся чем-то одним.
Кстати, iostream.h и stdio.h - устаревшие заголовочные файлы (для С++), сейчас они называются iostream и csdtio (без расширения). Правда, в этом случае нужно будет писать не cout и cin, а std::cout и std::cin (std - стандартное пространство имен), или добавить после всех инклюдов using namespace std; (не рекомендуется).

Это сообщение отредактировал(а) bsa - 8.9.2010, 10:59
PM   Вверх
djamshud
Дата 8.9.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



vitalyisaev2, не надо вообще считать count. Читайте потихоньку файл и при необходимости расширяйте свой массив. Раз вы пишите почти на си, откажитесь от new/delete в пользу malloc/realloc/free.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
xvr
Дата 8.9.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(vitalyisaev2 @ 8.9.2010,  10:36)
jonie, то есть надо просто добавить после работы счётчика вот эти строчки, как бы заново инициализировать поток?

Код

fclose(f1);
f1=fopen(argv[1], "r");


Сделай просто rewind(f1); перед вызовом fill_array

PM MAIL   Вверх
vitalyisaev2
Дата 10.9.2010, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



djamshud, 
xvr, bsa, 
огромное спасибо за советы. Прога в этом месте заработала. 

PM MAIL   Вверх
bsa
Дата 10.9.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(vitalyisaev2 @  10.9.2010,  01:17 Найти цитируемый пост)
огромное спасибо за советы. Прога в этом месте заработала. 


M
bsa
Тогда пометь тему решенной

PM   Вверх
pilot1440
Дата 11.9.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.4.2010

Репутация: нет
Всего: нет



Цитата

и ещё одно замечание : в функции fill_array в  массив типа int считываешь из файла с помощью "fscanf(f1,"%f", &row[i])", а ведь %f - это для вещественных чисел)))

PM MAIL   Вверх
vitalyisaev2
Дата 12.9.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



ок
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.