Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 00:03   #1
vitalyisaev2
 
Регистрация: 07.05.2010
Сообщений: 8
По умолчанию Заполнение динамического массива данными из файла и последующий вывод на экран

Здравствуйте, я написал программу по работе с динамическим массивом. Программа выполняет следующие действия:
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
В чём проблема? Спасибо.
vitalyisaev2 вне форума Ответить с цитированием
Старый 08.09.2010, 01:04   #2
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Трабла в том, что когда считаешь count, ты указатель в файле доводишь до конца, а потом начинаешь читать сами данные... fscan у тя ничё не выдирает из файла. Открывай его заново, или переводи указатель на начало
blob вне форума Ответить с цитированием
Старый 08.09.2010, 11:43   #3
vitalyisaev2
 
Регистрация: 07.05.2010
Сообщений: 8
По умолчанию

то есть надо просто добавить после работы счётчика вот эти строчки, заново инициализировать поток?
Код:
	fclose(f1);
	f1=fopen(argv[1], "r");
или создать новый поток на тот же файл?:
Код:
FILE *f1, *f3;
f1=fopen(argv[1], "r");
...
fclose(f1);
f3=fopen(argv[1], "r");
...
Оба случая компилируются, но выдают ошибки при работе.
Снова получается ошибка
vitalyisaev2 вне форума Ответить с цитированием
Старый 08.09.2010, 12:11   #4
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

а... ну тут косяк ещё в строке
Код:
fscanf(f1,"%f", &row[i]);
должно быть
Код:
fscanf(f1,"%d", &row[i]);
Ибо читаешь float в массив int
blob вне форума Ответить с цитированием
Старый 08.09.2010, 12:13   #5
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Держи, короче
Код:
#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,"%d", &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
           if(fseek(f1, 0, SEEK_SET))
	{
		perror(argv[1]);
		return 1;
	}
	int *row; //Инициализация динамического массива для дальнейшей работы
	row=fill_array (f1);//Динамический массив заполняется специальной функцией, открывающей файл с исходными данными
	print_array (row);//И выводится на экран
	return 0;
}
blob вне форума Ответить с цитированием
Старый 08.09.2010, 12:51   #6
vitalyisaev2
 
Регистрация: 07.05.2010
Сообщений: 8
По умолчанию

Вижу fseek, про неё раньше не знал. Большое спасибо!
vitalyisaev2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива структур данными из файла Brutallus Общие вопросы C/C++ 0 26.11.2009 19:01
вывод динамического массива на экран Arcueid1691 Общие вопросы C/C++ 2 15.10.2009 22:53
Заполнение диапазона данными массива Сер_Ежик Microsoft Office Excel 4 24.03.2009 16:52
вывод массива на экран Неясыть Общие вопросы Delphi 9 20.01.2008 20:18
Заполнение динамического списка из файла KORT Помощь студентам 2 01.05.2007 22:28