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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 14:57   #1
AgIon
 
Регистрация: 06.12.2009
Сообщений: 3
По умолчанию С++.Чтение из файла - проблема с массивом типа char.

Приветствую желающих помочь)
Для ускорения работы мне понадобилась программа, которая будет считывать из файла со следующей структурой:
float float char
float float char
etc...
например:
486394,487 3958026,657 ПК69
486394,487 3958076,657 ПК67
и прочая..
, а затем писать новый файл с нужной мне структурой данных.
Проблема в том, что не получается записать в массив последнее в строчке значение. Прошу объяснить неумелому). Вот мои потуги:
Код:
#include <iostream>
#include <fstream>
#include <istream>
#include <math.h>
#include <stdlib.h>
using namespace std;
void main()
{
float *s1,*s2,t;
int i;
char *strArray[250];
s1 = new float[250];
s2 = new float[250];
for (i=0;i<250;i++)
{
	s1[i]=0; s2[i]=0; strArray[i]= "jjj" ;
};
ifstream f("data.txt");
if( !f.is_open() )
	{
		std::cout << "can't open file\n";
	};
for (i=0;i<250;i++)
{
	f >> s1[i] >> " " >> s2[i] >> " " >> strArray[i];
};
f.close();
int m=0;
G:	for(i=0; i < 250; ++i)
	{
		t = s1[i]*s1[i]+s2[i]*s2[i];
		if (t < 1) {m=m+1;goto G;} else goto G;
	};
cout << N-m;
}
Последний цикл - результат моего незнания, как культурно подсчитать количество строк в файле и сделать последующий вывод без эдакого изврата. Рад буду и этому совету.
AgIon вне форума Ответить с цитированием
Старый 06.12.2009, 15:49   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вот пример, по-идее должен делать примерно то же, что и ваш код, за исключением последнего цикла(у вас он будет выполнятся бесконечно долго)
Код:
#include <iostream>
#include <fstream>

using namespace std;

struct Line {
	double numberOne;
	double numberTwo;
	char   name[10];
};

int main()
{
	Line* values = NULL;
	unsigned int lines = 1;

	ifstream InFile("data.txt");

	if(!InFile) {
		cerr << "Error, while opening file! Exit." << endl;
		exit(1);
	}

	while(!InFile.eof()) {
		if(InFile.get() == '\n')
			lines++;
	}
	InFile.clear();
	InFile.seekg(ios::beg);

	values = new Line[lines];
	memset(values, 0, sizeof(Line)*lines);

	for(unsigned int i = 0; i < lines; i++) {
		InFile >> values[i].numberOne >> values[i].numberTwo >> values[i].name;
	}

	cout << values[0].name << ' ' << values[1].name << ' ' << values[2].name << endl;

	int m = 0;
	for(unsigned int i = 0; i < lines; i++) {
		double t = values[i].numberOne * values[i].numberOne + values[i].numberTwo * values[i].numberTwo;
		if( t < 1 )
			m++;
	}

	cout << m << endl;

	delete[] values;
	InFile.close();

	return 0;
}
netrino вне форума Ответить с цитированием
Старый 06.12.2009, 16:59   #3
AgIon
 
Регистрация: 06.12.2009
Сообщений: 3
По умолчанию

Спасибо, netrino! Это именно то, что требовалось) Последний вопрос - а как организовать запись в файл без округления?
Код:
ofstream OutFile("output.txt");
	OutFile << "_-text\n";
	for(unsigned int i = 0; i < lines; i++)
	{
			OutFile << values[i].numberOne<<","<< values[i].numberTwo << "\n";
			OutFile << "3\n";
			OutFile << "0\n";
			OutFile << values[i].name << "\n\n";
	}
А то вместо 356945.560 6581239.267 ПК1 у меня пишет
_-text
356946,6.58124e+006
3
0
ПК1
Да-да, это для автокада.

Последний раз редактировалось AgIon; 06.12.2009 в 17:02.
AgIon вне форума Ответить с цитированием
Старый 06.12.2009, 18:21   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну вот тут есть определённые трудности из-за особенностей типа с плавающей точкой, в общем-то можно просто увеличить точность с помощью метода precision у ostream, но это может сказаться на некоторых других числах(например 2.3 может в таком случае быть записана как 2.3000000000001 или 2.2999999999999) но не обязательно.
Код:
OutFile.precision(10);
netrino вне форума Ответить с цитированием
Старый 07.12.2009, 00:39   #5
AgIon
 
Регистрация: 06.12.2009
Сообщений: 3
По умолчанию

И впрямь необязательно) Теперь всё работает как надо, ещё раз спасибо.
AgIon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35
Один маленький вопросик! Как написать функцию доступа к массиву типа char:) Наташенька Общие вопросы C/C++ 3 22.05.2009 16:12
Динамический сивольный массив типа char z3rg Общие вопросы C/C++ 12 05.04.2009 21:00
Работа со строками типа Char Horror Общие вопросы C/C++ 4 02.02.2008 19:45