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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2009, 06:47   #1
wishmaster13
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 16
По умолчанию Курсовой на С++. Помогите с заполнением массива из файла

Здравствуйте!

Делаю курсовой на с++

Задание - сделать информационно поисковую систему. Данные должны читаться из файла, обрабатываться, и записываться назад в файл. С функциями обработки надеюсь справлюсь, но пока я не могу к ним приступить. Помогите, пожалуйста, с самым началом, а дальше, думаю, разберусь...


Есть файл текстовый файл следующего формата:

CP_10.5:0.68:10.5:0.04788
CP_7.9:0.512:7.91:0.03602
Gamo High Speed:0.499:7.7:0.03511

Содержатся данные разных типов, разделенные двоеточиями.

Требуется реализовать его чтение, и запись данных в массив, элементом которого является структура:
Код:
struct pellet
{   unsigned char name;
    float mg, mgr,bk;
   
 };
Моя попытка написать код. Пытался сделать чтение файла в строку w, а из нее - заполнение массива temp, но не могу понять, что я сделал не так.
Код:
int main(void)
{
int n,i,k;
unsigned char *w[1024];
pellet temp[3];


FILE *bul;
n=0;
bul=fopen("bul.txt","r"); //Определяем количество записей в файле
 while(!feof(bul))
   {fscanf(bul,"%s",&w); if (w!="\n") n++;
 }
fclose(bul); delete w;
printf("Chislo strok v file= %d", n,"\n press any key");

getch();

// Заполняем массив данными из файла
bul=fopen("bul.txt","r");
 while(!feof(bul))
   {for(i=0;i<n;i++)
     fscanf(bul,"%s",&w);
     {if(w!="\n")
       if(w!=":")
        temp[i].name=*w; else break;
       if(w!=":")
        temp[i].mg=w; else break;
       if(w!=":")
        temp[i].mgr=w; else break;
       if(w!=":")
        temp[i].bk=w; else break;
      }
    }
getch();
}
Сильно не ругайте, я полный новичок в программировании, в голове пока - полная каша из операторов и символов
Заранее благодарен.

Последний раз редактировалось wishmaster13; 05.10.2009 в 07:35.
wishmaster13 вне форума Ответить с цитированием
Старый 05.10.2009, 08:16   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

я бы написал так:
Код:
#include <vcl.h>
#pragma hdrstop
#include <fstream>
#include "Unit4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
struct pellet
{
unsigned char name;
float mg, mgr,bk;

};
void ReadFile(int n,pellet *mas);
int KN();
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
	: TForm(Owner)
{
int n=KN();
pellet *Massiv=new pellet[n];
ReadFile(n,Massiv);
}
//---------------------------------------------------------------------------
void ReadFile(int n,pellet *mas)
{
	fstream file("bul.txt",ios::in|ios::out);
	pellet a;
	for (int i=0; i < n; i++)
	{
		file.read((char *)&a,sizeof(a));
		mas[i]=a;
	}
   file.close();
}
int KN()
{
ifstream file;
char w[80];
int n=0;
file.open("bul.txt");
if(!file)return 0;
while(!file.eof())
{
file.getline(w,sizeof(w));
n++;
}
file.close(); delete w;
return n;
}
Извини,не проверял работу,ибо в инст уже опаздываю.Писал в Builder c++.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 05.10.2009, 09:06   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Раз уж Сакрам заговорил о Борланде предложу и я свой вариант:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *l;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete l;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  l=new   TStringList;
  l->LoadFromFile("file1.txt");
  ListBox1->Items=l;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
  TStringList *l2;
  l2=new   TStringList;
  l2->Delimiter=':';
  l2->DelimitedText=ListBox1->Items->Strings[ListBox1->ItemIndex];
  ListBox2->Items=l2;
  delete l2;
}
//---------------------------------------------------------------------------
Смысл в том что во второй список парсятся параметры, а уж их выбирать можно как из массива.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2009, 09:12   #4
wishmaster13
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 16
По умолчанию

2 Сакрам, stilet: Спасибо, но я забыл сказать, пишу консольное приложение. При попытке вырезать строки, относящиеся к форме, начинает лезть уйма ошибок. Я конечно попробую разобраться, но если не затруднит, перепишите код под консольное. Форму мы еще не изучали Пишу на С++ builder 6
wishmaster13 вне форума Ответить с цитированием
Старый 05.10.2009, 10:03   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

НАпишу тебе начало:
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <vcl.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 TStringList *l;
А дальше по примеру
 Он сказал поехали и махнул стопарь
	return 0;
}
//---------------------------------------------------------------------------
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2009, 10:11   #6
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Я пишу на Borland 2006,поэтому могут быть строки,которые builder 6 не понимает ( дописал запись в файл):
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <fstream>
//---------------------------------------------------------------------------
struct pellet
{
	unsigned char name;
	float mg, mgr,bk;

};
void ReadFile(int n,pellet *mas);      // чтение файла
void WriteFile(int n,pellet *mas);     //запись файла
int KN();                              //узнаём сколько записей в файле
#pragma argsused
int main(int argc, char* argv[])
{
	int n=KN();
	pellet *Massiv=new pellet[n];
	ReadFile(n,Massiv);
	//потом работа с массивом
	WriteFile(n,Massiv);
	return 0;
}
//---------------------------------------------------------------------------
void ReadFile(int n,pellet *mas)
{
	fstream file("bul.txt",ios::in|ios::out);
	pellet a;
	for (int i=0; i < n; i++)
	{
		file.read((char *)&a,sizeof(a));
		mas[i]=a;
	}
   file.close();
}
//---------------------------------------------------------------------------
int KN()
{
	ifstream file;
	char w[80];
	int n=0;
	file.open("bul.txt");
		if(!file)return 0;
	while(!file.eof())
		{
			file.getline(w,sizeof(w));
			n++;
		}
	file.close();
	delete w;
	return n;
}
//--------------------------------------------------------------------------
void WriteFile(int n,pellet *mas)
{
	pellet a;
	ofstream file("bul.txt",ios :: out|ios :: trunc);  //Открыть файл bul на запись с уничтожением содержимого
	for (int i=0; i < n; i++)
	{
		mas[i]=a;
		file.write((char *)&a,sizeof(a));
	}
	file.close();
}
З.Ы.Когда писал программу отталкивался от того,что написал wishmaster13...а вот это
Цитата:
Раз уж Сакрам заговорил о Борланде
намёк на то,что если что.пинать Скарама,а я не причём?))
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 05.10.2009, 10:16   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
намёк на то,что если что.пинать Скарама,а я не причём?))
Боже упаси. ничего такого не имел ввиду.
Я тоже Борланд больше люблю. И в поддержку твоих слов предложил свой вариант с классами.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2009, 10:31   #8
wishmaster13
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 16
По умолчанию

Народ, спасибо за помощь, буду ковыряться дальше Правда содержимое исходного файла прогой было убито, но зато хоть что то становится понятно. Буду разбираться в том что наваял Сакрам Как минимум закомменчу покамест функцию записи

Последний раз редактировалось wishmaster13; 05.10.2009 в 10:35.
wishmaster13 вне форума Ответить с цитированием
Старый 05.10.2009, 10:47   #9
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Я работал только с бинарными файлами так же,всё работало.Попробуй создать массив и записать,посмотри как и куда пишет,возможно я и builder думаем по-разному )))
Цитата:
Я тоже Борланд больше люблю
Да,много сред перепробовал,а остановился на Борланд..)
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 05.10.2009, 12:45   #10
wishmaster13
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
Попробуй создать массив и записать,посмотри как и куда пишет,возможно я и builder думаем по-разному )))
еще б понять как думаешь ты, а как билдер... Я ж все таки чайник...


Код:
void ReadFile(int n,pellet *mas)  // чтение файла
{
	fstream file("bul.txt",ios::in|ios::out);
	pellet a;
	for (int i=0; i < n; i++)
	{
		file.read((char *)&a,sizeof(a));
		mas[i]=a;
	}
   file.close();
}
Функция чтения создает переменную "а" типа структура и заносит в нее данные из файла. Далее значение этого й переменной присваивается i'ому элементу массива. т.е. при вызове этой функции из главной, создается массив в памяти по адресу mas? Но ведь этот указатель локален и используется только в этой функции. С указателями у меня еще тяжко, если работу с индексами я понимаю, то в указателях путаюсь совершенно. далее в главной функции идет выделение памяти под массив структур с указателем *Massiv
Код:
 pellet *Massiv=new pellet[n];
Каким образом связать эти указатели? при попытке создать массив и заполнить его вызовом функции readfile:
Код:
 
for (int i=0; i < n; i++)
	{
			temp[i]=ReadFile(n,Massiv);
	}
компилятор ругается что массив "temp" не известен, хотя строчку temp= new pellet[n];
я вроде вставил, и память под него выделил. Объясните чайнику что я опять делаю не так???
wishmaster13 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка коллекции перед заполнением. pivas Microsoft Office Excel 4 27.07.2009 08:36
Проблема с заполнением asd48 Помощь студентам 1 21.04.2009 00:21
Помогите с заполнением базы из *.cvs harom SQL, базы данных 0 07.03.2009 22:50
Проблема со случайным заполнением массива nyanga's_sist Общие вопросы Delphi 7 14.02.2009 22:32
Чтение массива из текстового файла. Metil Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 12.01.2009 22:53