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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2009, 21:41   #1
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию Помогите оформить код через функции...

Сложилась такая проблема, мне необходимо создать программу которая читатет файл 'd:\file.txt' и создает и копирует всё его содержимое в типизированный файл 'd:\out.dat'. Программа должна содержать меню:
1 Запись в файл
2 Вывод на экран //т.е. выбираешь кол-во записей, которые хочешь
на экран, и они выводятся
3 Очистка файла //очистка файла 'out.dat'
4 Выход

вот моя программка:
Код:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
 FILE *fi,*fo;
 clrscr();
 if ((fi=fopen("D:\\file.txt", "r"))==0){
  cout << "Error open input file!!!" ;
  return;}
 if ((fo=fopen("D:\\out.dat","w+b"))==0){
  cout << "Error open output file!!!";
  return;}
 const int dl=80;
 char s[dl];
 struct mon {
  char type[20];
  int opt, rozn;
  char comm[40];
 };
int kol=0;
mon a;
while(fgets(s,dl,fi)){
strncpy(a.type,s,19);
a.type[19]='\0';
a.opt=atoi(&s[20]);
a.rozn=atoi(&s[25]);
strncpy(a.comm,&s[30],40);
fwrite(&a,sizeof(mon),1,fo);
kol++;
};
fclose(fi);
int i; cin >>i;
if (i>kol) {
  cout << "Zapisi net!!!";
  return;}
fseek(fo,sizeof(mon)*i,SEEK_SET);
fread(&a,sizeof(mon),1,fo);
cout << "Tip: " << a.type << "opt.: " << a.opt << "rozn: " << a.rozn << endl;
fclose(fo);
}
Помогите пожалуйста разбить её на три функции
Запись в файл
Вывод на экран
Очистка файла
hen вне форума Ответить с цитированием
Старый 10.04.2009, 22:20   #2
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Код:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

using namespace std;

struct mon {
  char type[20];
  int opt, rozn;
  char comm[40];
};

int writeFile(const string file_in, const string file_out)
{
	FILE *fi,*fo;
	 clrscr();
	 if ((fi=fopen(file_in.c_str(), "r"))==0){
	  cout << "Error open input file!!!" ;
	  return -1;}
	 if ((fo=fopen(file_out.c_str(),"w+b"))==0){
	  cout << "Error open output file!!!";
	  return -1;}
	 const int dl=80;
	 char s[dl];
	int kol=0;
	mon a;
	while(fgets(s,dl,fi)){
	strncpy(a.type,s,19);
	a.type[19]='\0';
	a.opt=atoi(&s[20]);
	a.rozn=atoi(&s[25]);
	strncpy(a.comm,&s[30],40);
	fwrite(&a,sizeof(mon),1,fo);
	kol++;
	};
	fclose(fi);
	fclose(fo);

	return kol;
}

void out(const string file_out, const int kol)
{
	FILE *fo;
	if ((fo=fopen(file_out.c_str(),"rb"))==0){
	  cout << "Error open output file!!!";
	  return ;}
	int i; cin >>i;
	if (i>kol) {
	  cout << "Zapisi net!!!";
	  return;}

	mon a;
	fseek(fo,sizeof(mon)*i,SEEK_SET);
	fread(&a,sizeof(mon),1,fo);
	cout << "Tip: " << a.type << "opt.: " << a.opt << "rozn: " << a.rozn << endl;
	fclose(fo);
}

void clearFile(const string file_out)
{
	FILE *fo;
	if ((fo=fopen(file_out.c_str(),"wb"))==0){
	  cout << "Error open output file!!!";
	  return ;}
	fclose(fo);
}

void main()
{
	int kol;
	if( (kol = writeFile("D:\\file.txt", "D:\\out.dat") )== -1) return;
	out("D:\\out.dat", kol);
	clearFile("D:\\out.dat");
}
Svetlag вне форума Ответить с цитированием
Старый 10.04.2009, 23:13   #3
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию

спасибо огромное, если не сложно объясни пару моментов в конце

Код:
void clearFile(const string file_out) 
{
	FILE *fo;
	if ((fo=fopen(file_out.c_str(),"wb"))==0){  // file_out.c_str() - вместо этого можно указывать путь к файлу?? wb - что это делает, именно такого я незнаю, и ненадо ли случайно после него + ставить? 
	  cout << "Error open output file!!!";
	  return ;}
	fclose(fo);
}

void main()
{
	int kol;
	if( (kol = writeFile("D:\\file.txt", "D:\\out.dat") )== -1) return; // и вот эту строчку объясни пожалуйста
	out("D:\\out.dat", kol);
	clearFile("D:\\out.dat");
}
точнее сказать нужно ли мне в функции 'void main' 3 последние строчки записывать так, если мне надо меню через 'case' оформить??

Последний раз редактировалось hen; 10.04.2009 в 23:16.
hen вне форума Ответить с цитированием
Старый 11.04.2009, 00:14   #4
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию

мне нужно чтобы не было описания переменных в заголовках функций...
чтобы прога выглядела приблизительно так
Код:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

struct mon {
  char type[20];
  int opt, rozn;
  char comm[40];
};
int kol=0;
void WriteFile()
{
	FILE *fi,*fo;
	 clrscr();
	 if ((fi=fopen("D:\\file.txt", "r"))==0){
	  cout << "Error open input file!!!" ;
	  return;}
	 if ((fo=fopen("D:\\out.dat","w+b"))==0){
	  cout << "Error open output file!!!";
	  return;}
	 const int dl=80;
	 char s[dl];
	int kol=0;
	mon a;
	while(fgets(s,dl,fi)){
	strncpy(a.type,s,19);
	a.type[19]='\0';
	a.opt=atoi(&s[20]);
	a.rozn=atoi(&s[25]);
	strncpy(a.comm,&s[30],40);
	fwrite(&a,sizeof(mon),1,fo);
	kol++;
	};
	fclose(fi);
	fclose(fo);
	return;
}

void out()
{
	FILE *fo;
	if ((fo=fopen("D:\\out.dat","rb"))==0){
	  cout << "Error open output file!!!";
	  return ;}
	int i; cin >>i;
	if (i>kol) {
	  cout << "Zapisi net!!!";
	  return;}

	mon a;
	fseek(fo,sizeof(mon)*i,SEEK_SET);
	fread(&a,sizeof(mon),1,fo);
	cout << "Tip: " << a.type << "opt.: " << a.opt << "rozn: " << a.rozn << endl;
	fclose(fo);
}

void ClearFile()
{
	FILE *fo;
	if ((fo=fopen("D:\\out.dat","wb"))==0){
	  cout << "Error open output file!!!";
	  return ;}
	fclose(fo);
}

void main()
{
 FILE *fo;
 fo=(fopen("D:\out.dat", "a+b"));
 char menu;
 int i;
 do
 {
  clrscr();
   cout << "1 Zapis' v file" << endl <<"2 Vivod na ekran" << endl << "3 Ochistka file" << endl << "4 Vichod" << endl;
   menu=getch();
   switch(menu)
   {
	 case '1':
	   WriteFile();
	   break;
	 case '2':
	   out();
	   break;
	 case '3':
	   ClearFile();
	   break;
		 };
   if (menu=='4') break;
 }
 while(1);
 fclose(fo);
}
попробовал это сделать и пошла какаято чушь...
не происходит вывода на экран файла 'out.dat'
в меню при нажатии кнопок
1 Запись в файл
2 Вывод на экран
3 Очистка файла
4 Выход

Часто ничего не происходит, иногда они просто набираются на экране как обычный текст...
Помогите плиз с косяками...
hen вне форума Ответить с цитированием
Старый 11.04.2009, 10:57   #5
Svetlag
Пользователь
 
Аватар для Svetlag
 
Регистрация: 24.02.2009
Сообщений: 85
По умолчанию

Код:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

struct mon {
  char type[20];
  int opt, rozn;
  char comm[40];
};
int kol=0;
void WriteFile()
{
	FILE *fi,*fo;
	 clrscr();
	 if ((fi=fopen("D:\\file.txt", "r"))==0){
	  cout << "Error open input file!!!" ;
	  return;}
	 if ((fo=fopen("D:\\out.dat","w+b"))==0){
	  cout << "Error open output file!!!";
	  return;}
	 const int dl=80;
	 char s[dl];
	kol=0;//не нужно объявлять локальную,обнуляется глобальная
	mon a;
	while(fgets(s,dl,fi)){
	strncpy(a.type,s,19);
	a.type[19]='\0';
	a.opt=atoi(&s[20]);
	a.rozn=atoi(&s[25]);
	strncpy(a.comm,&s[30],40);
	fwrite(&a,sizeof(mon),1,fo);
	kol++;
	};
	fclose(fi);
	fclose(fo);

	return;
}

void out()
{
	FILE *fo;
	if ((fo=fopen("D:\\out.dat","rb"))==0){
	  cout << "Error open output file!!!";
	  return ;}
	int i; 
	cout<<"Input number of Zapisi ";
	cin >>i;//после ввода i не забываем нажать Enter
	if (i>kol) {
	  cout << "Zapisi net!!!";
	  return;}

	mon a;
	fseek(fo,sizeof(mon)*(i-1),SEEK_SET);
	fread(&a,sizeof(mon),1,fo);
	cout << "Tip: " << a.type << " opt.: " << a.opt << " rozn: " << a.rozn << endl;
	fclose(fo);
}

void ClearFile()
{
	FILE *fo;
	if ((fo=fopen("D:\\out.dat","wb"))==0){//открытие файла только для записи
	  cout << "Error open output file!!!";
	  return ;}
	fclose(fo);
}

void main()
{
 char menu;
 int i;
 kol=0;
 do
 {
   clrscr();
   cout << "1 Zapis' v file" << endl <<"2 Vivod na ekran" << endl << "3 Ochistka file" << endl << "4 Vichod" << endl;
   menu=getch();
   switch(menu)
   {
	 case '1':
	   WriteFile();
	   break;
	 case '2':
	   out();
	   break;
	 case '3':
	   ClearFile();
	   break;
		 };
   if (menu=='4') break;
 }
 while(1);
}
Svetlag вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оформить в виде функций Smotritel89 Помощь студентам 2 04.11.2008 14:39
оформить как функцию arturka Помощь студентам 11 20.06.2008 23:41
Оформить задачу процедурами Anita_i Паскаль, Turbo Pascal, PascalABC.NET 2 12.05.2008 12:37