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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 00:30   #1
nikitozzz
Новичок
Джуниор
 
Регистрация: 28.10.2011
Сообщений: 1
Печаль посимвольный ввод из файла в динамический массив

программа должна считывать из файла числа(типа double) и засовывать их в двумерный динамический массив. сначала я решил подсчитать кол-во элементов, а затем выделить память и считать еще раз, но на этот раз в массив. проблема в подсчете количества столбцов. если подсунуть проге файл типа
1 2 3 4
2 3 4 5
3 4 5 6
(числа разделены 1 пробелом, после последней цифры никаких пробелов нет)
то она правильно определяет размерность. Но файл
4 6 7 8 +5 4
2 0.4 3 5 6 7
2 3 9.5 5 6 4
4 -5 6 -7 6 4


-4 234 23.5 34 -6.6 4



(куча лишних пробелов между и после чисел, пустые строки и строки с пробелами)
то количество столбцов считается ровно на 1 больше, чем есть.
Вот код программы:
Код:
#pragma once
#include "iostream"
#include "conio.h"
#include "fstream"
#include "locale.h"
#include "string"
#include "iomanip"
using namespace std;

#define SIZE 8
#define P 3
#define W 5

void main()
{
	setlocale(LC_CTYPE,"Russian");
	
	ifstream   in_file;
    string     filename;
	char       buf=0;
	char       buf_p=0;
	char       cell[SIZE]={};

	double i=0;
	int v=0;
	int f=0;

	int        arr_row_count = 0;
	int        arr_col_count = 0;
	int        comp = 0;
	double     **arr;

/*	do
	{
		system("CLS");
		cout << "Введите имя файла с данными: ";
		cin  >> filename;
		in_file.open(filename.c_str());
	} 
	while (!in_file.is_open());*/in_file.open("right.txt");
	in_file.peek();
	if (in_file.eof()) 
	{
		cout<<"Файл '"<<filename<<"' пуст.\nНажмите любую клавишу для выхода.";
	    in_file.close(); 
		_getch();
		return;
	}
//---------------------------------------------------
while (!in_file.eof())
	{
		in_file.get(buf);
		if (!in_file.fail())
		{
			if ((buf==32)||(buf=='\n'))
			{
				if ((buf_p!=32)&&(buf_p!='\n'))
					arr_col_count++;		    
				for (f = 0;f<SIZE;f++)
					cell[f]=0;
				v=0;
			}
			else if (((buf<='9')&&(buf>='0'))||((buf=='-')&&(!v))||((buf=='+')&&(!v))||(buf=='.')||(buf=='e'))
			{
				if (buf_p=='\n') 
				{
					arr_row_count++;
					if (arr_row_count==1) comp=arr_col_count;
					if (comp!=arr_col_count) 
					{
						system("CLS");
						in_file.close();
						cout<<"Файл с исходными данными содержит не матрицу.";
						cout<<endl<<comp<<endl<<arr_col_count<<endl<<arr_row_count;
						cout<<"\nНажмите любую клавишу для выхода.";
		                _getch();
		                return;					
					}
					arr_col_count=0;
				}
				cell[v]=buf;
				v++;
			}
			else 
			{
				system("CLS");
				in_file.close();
				cout<<"Файл с исходными данными содержит недопуситмые символы.";
				cout<<"\nНажмите любую клавишу для выхода.";
				_getch();
				return;
			}
	    }
		buf_p=buf;
	}

//--------------------------------------------------
/*	while (!in_file.eof())
	{
		in_file.get(buf);
		if (!in_file.fail())
		{
			if ((buf==32)||(buf=='\n'))
			{
				if ((buf_p!=32)&&(buf_p!='\n'))
					{
						i=atof(cell);
						arr_col_count++;
					}			    
				for (f = 0;f<SIZE;f++)
					cell[f]=0;
				v=0;
			}
			else if (((buf<='9')&&(buf>='0'))||(buf=='-')||(buf=='+')||(buf=='.'))
			{
				if (buf_p=='\n') 
				{
					arr_row_count++;
					if (arr_row_count==1) comp=arr_col_count;
					if (comp!=arr_col_count) 
					{
						system("CLS");
						in_file.close();
						cout<<"Файл с исходными данными содержит не матрицу.";
						cout<<"\nНажмите любую клавишу для выхода.";
		                _getch();
		                return;					
					}
					arr_col_count=0;
				}
				cell[v]=buf;
				v++;
			}
			else 
			{
				system("CLS");
				in_file.close();
				cout<<"Файл с исходными данными содержит недопуситмые символы.";
				cout<<"\nНажмите любую клавишу для выхода.";
				_getch();
				return;
			}
	    }
		buf_p=buf;
	}
	*/
//--------------------------------------------------
in_file.seekg(0);
in_file.clear();
arr = new double*[arr_row_count];
	for (v=0;v<=arr_row_count;v++)
		arr[v] = new double [arr_col_count];
if (!arr) 
{
	system("CLS");
	in_file.close();
	cout<<"Ошибка выделения памяти.\nНажмите любую клавишу для выхода.";
	_getch();
	return;
}
	cout<<"Количество строк:    "<<(arr_row_count+1);
	cout<<"\nКоличество столбцов: "<<(arr_col_count+1)<<endl;
	for (v=0;v<=arr_row_count;v++)
	{
		for (f=0;f<=arr_col_count;f++)
		{
			in_file>>arr[v][f];
			cout<<endl<<fixed<<setw(W)<<setprecision(P)<<arr[v][f];
		}
		cout<<'\n';
	}
	in_file.close();
	_getch();
	return;
}

Последний раз редактировалось Stilet; 28.10.2011 в 08:32.
nikitozzz вне форума Ответить с цитированием
Старый 28.10.2011, 02:50   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Это проблема юзера. Если получайте ошибку при считывание или если после считывание вы оказались не в конце файла, то пишите, что считывание не удалось.
TwiX вне форума Ответить с цитированием
Старый 28.10.2011, 08:39   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Надо просто считывать посимвольно с пропуском пробелов.
Что нибудь типа
Код:
char c,s[100]
for(c=getc(файл);!feof(файл);c=getc(файл)){
 // Считали цифру
 for(int i=0;!feof(файл) && c<>' ';c=getc(файл)){ s[i]=c;s[i+1]=0;}
 Конвертируем s в число и вписываем в массив

 // Пропустили пробел
 for(int i=0;!feof(файл) && (c==' ' || c==13 || c==10);c=getc(файл));
  
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод с файла в двумерный массив Qlry Общие вопросы C/C++ 1 14.05.2011 22:26
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
Массив структур(Ввод из файла) ApXoH Общие вопросы C/C++ 2 04.06.2010 00:19
Посимвольный ввод строки Junk1E Общие вопросы C/C++ 8 14.12.2009 01:49
Чтение фрагмента файла в динамический массив. ZeroCool. Общие вопросы Delphi 2 02.11.2007 08:14