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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 05:18   #1
nickolay08
 
Регистрация: 04.04.2011
Сообщений: 3
По умолчанию Копирование данных из файла в массив

Добрый день!
Имеется файл, в котором данные располагаются построчно в таком виде:
(0.5,0.5) 0.98
(0.6,0.5) 0.94
и так далее.
Нужно сформировать три массива, в которых будут храниться эти числа по столбикам.
Для этого написал код:

Код HTML:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	HANDLE hFile = CreateFile ("c:\\text.txt",
		GENERIC_READ, 
		FILE_SHARE_READ, 
		NULL, 
		OPEN_EXISTING, 
		FILE_FLAG_SEQUENTIAL_SCAN, 
		NULL);

	
	unsigned int n_st = 0;
	if (hFile == INVALID_HANDLE_VALUE){
		DWORD dwError = GetLastError ();
		MessageBox(NULL,"Ошибка!","Error", MB_OK | MB_DEFBUTTON1 | MB_ICONEXCLAMATION | MB_DEFAULT_DESKTOP_ONLY);
		return 0; 
	}

	char buf[1];
	memset (buf, 0, 1);
	DWORD dwBytesRead = 0;
	DWORD dwOffset = 0;

        //Нахожу количество строк n_st
	while (dwOffset < GetFileSize (hFile, NULL)) {
		SetFilePointer (hFile, dwOffset, NULL, FILE_BEGIN);
		if (ReadFile (hFile, buf, 1, &dwBytesRead, NULL)){	
			if (!memchr (&buf[0], '(', 1)){
				dwOffset++;
				continue;
			} 
			else n_st++;
		}
		dwOffset++;
	}
	
	double 
		*X = new double [n_st],
		*Y = new double [n_st],
		*U = new double [n_st];

	dwOffset = 0;

	DWORD nBD = dwOffset; 
	for(int i=0; i<n_st; i++){
		dwOffset = nBD;
		while (nBD < GetFileSize (hFile, NULL)) {
			SetFilePointer (hFile, nBD, NULL, FILE_BEGIN);
			if (ReadFile (hFile, buf, 1, &dwBytesRead, NULL)){	
				if (!memchr (&buf[0], ',', 1)){
					nBD++;
					break;
				} 
			}
			nBD++;
		}	
		char *DigitX = new char[nBD-dwOffset];
		ReadFile (hFile, DigitX, nBD-dwOffset, &dwBytesRead, NULL);
		X[i] = atof(DigitX);

		delete [] DigitX;
	}

	delete [] buf;
	CloseHandle (hFile);
	return 0;
}
Ошибок не выдается, но и массив не заполняется. Подскажите, пожалуйста, в чем ошибка.
nickolay08 вне форума Ответить с цитированием
Старый 10.05.2012, 11:04   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

А winapi вам обязательно использовать? Чем обычные методы работы с файлами не нравятся?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.05.2012, 15:10   #3
nickolay08
 
Регистрация: 04.04.2011
Сообщений: 3
По умолчанию

Цитата:
А winapi вам обязательно использовать? Чем обычные методы работы с файлами не нравятся?
Вторая часть программы (не представленная здесь) использует winapi.
nickolay08 вне форума Ответить с цитированием
Старый 10.05.2012, 16:19   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

nickolay08

Ошибок не выдается, но и массив не заполняется. Подскажите, пожалуйста, в чем ошибка.

Не пиши код в нотепаде - он не предназначен для поиска ошибок. Скачай нормальную среду разработки, в которой присутствует отладчик.
Rififi вне форума Ответить с цитированием
Старый 10.05.2012, 17:24   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

мрак, конечно.

например
Код:
		if (!memchr (&buf[0], '(', 1)){
				dwOffset++;
				continue;
			} 
			else n_st++;
хотя ничто не мешает сделать так
Код:
if (buf[0] == '(')) n_st++; dwOffset++;
потом вот это FILE_FLAG_SEQUENTIAL_SCAN ставится если файл читается в один проход, без перечитывания и повторов.

дальше круче. ну, нашли вы запятую, и что читать собрались? где текущий указатель файла? и сколько вы байт собрались читать?

Код:
char buf[1];
...
delete [] buf;
внушает.

2 Rififi пользуюсь только нотепадом.
f.hump вне форума Ответить с цитированием
Старый 11.05.2012, 09:02   #6
nickolay08
 
Регистрация: 04.04.2011
Сообщений: 3
По умолчанию

Цитата:
Код:

if (!memchr (&buf[0], '(', 1)){
dwOffset++;
continue;
}
else n_st++;

хотя ничто не мешает сделать так
Код:

if (buf[0] == '(')) n_st++; dwOffset++;
Согласен, усложняю - заменил.

Цитата:
потом вот это FILE_FLAG_SEQUENTIAL_SCAN ставится если файл читается в один проход, без перечитывания и повторов.
Заменил на FILE_ATTRIBUTE_NORMAL.

Цитата:
Код:

char buf[1];
...
delete [] buf;

внушает.
Ну да... убрал delete.

Цитата:
ну, нашли вы запятую, и что читать собрались? где текущий указатель файла? и сколько вы байт собрались читать?
Аааа! Сделал так:
Код:
while (nBD < GetFileSize (hFile, NULL)) {
			SetFilePointer (hFile, nBD, NULL, FILE_BEGIN);
			if (ReadFile (hFile, buf, 1, &dwBytesRead, NULL)){	
				if (buf[0] == ',') break; 
			}
			nBD++;
		}
		char *DigitX = new char[nBD-dwOffset];
		SetFilePointer (hFile, dwOffset, NULL, FILE_BEGIN);
		ReadFile (hFile, DigitX, nBD-dwOffset, &dwBytesRead, NULL);
		X[i] = atof(DigitX);
и все заработало.
Спасибо большое!
nickolay08 вне форума Ответить с цитированием
Старый 11.05.2012, 10:33   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

f.hump

2 Rififi пользуюсь только нотепадом.

ну так ты, вроде, и не путаешься с отладкой, в отличие от протагониста...

А вообще код действительно мракуха. Навернута телага их winapi, ручного выделения памяти. удаления статических массивов..

хотя сам парсинг занимает всего несколько строчек (вот у меня например - две :D )

Код:
includes...

struct Data
{
	float a_, b_, c_;
};

BOOST_FUSION_ADAPT_STRUCT(
	Data,
	(float, a_)
	(float, b_)
	(float, c_)
	);

template <typename InputIterator, typename Skipper>
struct grammar : public qi::grammar<InputIterator, std::vector<Data>(), Skipper>
{
	grammar() : grammar::base_type(start)
	{
		data = '(' >> qi::float_ >> ',' >> qi::float_ >> ')' >> qi::float_ >> qi::eol;
		start = +data;
	}

	qi::rule<InputIterator, Data(), Skipper> data;
	qi::rule<InputIterator, std::vector<Data>(), Skipper> start;
};

template <typename InputIterator>
void parse(InputIterator begin, const InputIterator end, std::vector<Data>& data)
{
	const qi::rule<InputIterator> skip = qi::char_(" \t");
	const grammar<InputIterator, qi::rule<InputIterator> > g;
	qi::phrase_parse(begin, end, g, skip, data);
}

int main()
{
	try
	{
		setlocale(LC_ALL, "");
		
		const ipc::file_mapping fp("data.txt", ipc::read_only);
		const ipc::mapped_region r(fp, ipc::read_only);

		const char* const addr = (const char*) r.get_address();
		const size_t size = r.get_size();

		std::vector<Data> data;
		parse(addr, addr + size, data);
	}
	catch (const std::exception& e)
	{
		std::cout << e.what() << std::endl;
	}

	return 0;
}
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение данных из файла и запись в в массив.как чтобы до конца читал? Fundorin Общие вопросы C/C++ 0 15.11.2011 18:10
Копирование данных из одного файла Excel в другой через макрос I.P.iX Microsoft Office Excel 0 31.05.2011 22:20
Копирование данных из одного файла в другой! vipcrash Microsoft Office Excel 17 23.01.2010 21:11
копирование данных их файла .doc в файл Excel prima Microsoft Office Excel 3 19.10.2009 08:37
копирование данных в новую таблицу при интерактивном выборе файла gege Microsoft Office Excel 7 22.10.2008 17:16