Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: передача параметров при работе с файлами  (Прочитано 11777 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« : 23-12-2012 13:13 » 

есть программка, которая первое и среднее слово в каждой строке файла меняет местами

Код: (C++)
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <sstream>
#include <vcl.h>
#include <iostream>
#include <conio.h>
 
#pragma hdrstop
using namespace std;
 
int main()
{
//entering a file name using keyboard
 cout << "Enter a processed file name:"  ;
std::string name;
std::cin >> name;
std::ifstream ifs(name.c_str());
 
cout << "Enter a final file name:"  ;
std::string name1;
std::cin >> name1;
std::ofstream o(name1.c_str());
 
 
if (! ifs && ! o)
 
        {  cout<<"wrong file name!";
           exit (1);    }
 
  else{
   
    if (!ifs) return 1;
    std::string str;
    while (!ifs.eof() && std::getline(ifs, str))
    {
        std::istringstream ist(str);
        std::vector<std::string> v;
        std::copy(std::istream_iterator<std::string>(ist),
                  std::istream_iterator<std::string>(), std::back_inserter(v));
        std::swap(*v.begin(), *(v.begin() + v.size() / 2));
        std::copy(v.begin(), v.end(), std::ostream_iterator<std::string> (o, " "));
        o << std::endl;
    } }
    system("pause");
    return 0;
 
    }

мне необходимо доработать ее, чтобы программа состояла из подпрограмм и имела текстовое меню:

Код: (C++)
int showMenu()
   {
 
int command = 0;
while(true)
       
       {
 
cout << "1. changing of the first and average word in a line of the file " << endl;
cout << "2. see result" << endl;
cout << "3. Exit" << endl;
 
cin >> command;
if (command >=1 && command <=3) return command;
cout << "You have entered a wrong command. Please repeat your choice:" << endl;
 
     if (cin.fail())
  {
     cin.clear();
     cin.sync();
                     }
                              }
         }

помогите, пожалуйста описать сase(ы) и подскажите как передать параметры в void()??
Записан
Dmitry
Помогающий

ru
Offline Offline

« Ответ #1 : 23-12-2012 16:53 » 

Не совсем понятно какие параметры ты имеешь в виду и куда их хочешь передать.

Код: (C++)
int showMenu()
{
cout << "1. changing of the first and average word in a line of the file " << endl;
cout << "2. see result" << endl;
cout << "3. Exit" << endl;

int command;
cin >> command;
if (command >=1 && command <=3) return command;
return 0;
}

Код: (C++)
while(true)
{
switch (showMenu())
{
case 1: //вносим изменения в файл
case 2: //показываем результат
case 3: //выходим
default: //выводим сообщение об ошибке
}
}
Записан
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #2 : 23-12-2012 21:19 » new

Dmitry, например void для описания ввода имени исходного файла:

void EnterFileName1(const char*);

 void EnterFileName1(const char*std)
       {
        std::string name;
        std::cin >> name;
        std::ifstream ifs(name.c_str());
                                                }

правильно???
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 23-12-2012 22:00 » 

Нет. void говорит о том, что параметров нету. Кстати не рекомендуется использовать стандартные именна. В твоем случае std. Этот код скорее всего компилятор будет ругать.
Скорее всего ты имееш ввиду функции. И передавать параметры в функции? Тут как говорится нужно учить матчасть. Это основопологаюшая часть в синтаксисе С/C++.
« Последнее редактирование: 23-12-2012 22:03 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #4 : 23-12-2012 23:10 » 

Finch, как  тогда исправить эту часть кода? нужен пример)
Записан
Dmitry
Помогающий

ru
Offline Offline

« Ответ #5 : 24-12-2012 17:15 » 

mary1010, перед именем метода указывается тип возвращаемого значения. Твой void означает, что ф-я ничего не возвращает. Реально, начни с синтаксиса.
И, имхо, на данном этапе не стоит использовать STL, string и т.п. Хотя, если цель - сдать задание, то можно и так.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 24-12-2012 17:28 » 

Не понял, что случилось с телепатами?

Я так понял, что требуется объяснить, как передать параметры (аргументы) в функцию
Но тут вижу, что вроде как, и сама знает.
Но не знает, что void ничего не возвращает, вернее не имеет return, для этого используется что-то другое.
« Последнее редактирование: 24-12-2012 18:35 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 24-12-2012 18:21 » 

Код: (C++)
 void EnterFileName1(const char*std)
Чтоб не было недомолвок. Ты выбрала для имени переменной имя std. Значит название пространства имен std у тебя функции перекрыто. И компилятор в этом коде
Код: (C++)
std::string name;
        std::cin >> name;
        std::ifstream ifs(name.c_str());
Будет очень сильно ругаться. Так как в типе char * нету  методов и тип char * не является пространством имен, со своей зоной видимости.

Название входных параметров функции стараются выбирать "самодокументируешиеся". Например, если ты хочеш передать в функцию название файла. То логично выбрать для названия переменной fileName. Как другой вариант, в основном встречается в классах. Входной параметр функции в рабочей группе разработчиков часто применяют стандартизированные названия. Например orig или val.

Сушествует правило программирование, где открыл, там желательно и закрыть. Так что, открывать поток, как показала ты, крайне не желательно. Его нужно отрывать по мере необходимости. А в функции, просто обойтись запросом от пользователя его имени. Примерно будет выглядеть так
Код: (C++)
std::string EnterFileName(void) {
   std::string res;
   std::cin >> res;
   return res;
}
« Последнее редактирование: 24-12-2012 18:38 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
mary1010
Интересующийся

ua
Offline Offline
Пол: Женский

« Ответ #8 : 24-12-2012 20:16 » 

Finch, спасибо!)


Добавлено через 1 день, 26 минут и 4 секунды:
вот))
может кому-то пригодится))
Код:
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <sstream>
#include <iostream>
#include <cstdlib>
#include <ctime>
//=============================================================================
const char *EnterFileName1();
const char *EnterFileName2();
void ProcessingFile( std::ifstream &ifs, const char *outName );
void result();
int ShowMenu();
//=============================================================================
const char *EnterFileName1()
{
  std::string name;
  std::cin >> name;
  return name.c_str();
}
//=============================================================================
const char *EnterFileName2()
{
  std::string name;
  std::cin >> name;
  return name.c_str();
}
//=============================================================================
void ProcessingFile( std::ifstream &ifs, const char *outName )
{
  std::ofstream o( outName );
  if (o.bad())
  {
    std::cout << "Wrong output file name." << std::endl;
    return;
  }
  std::string str;
  while (!ifs.eof() && std::getline( ifs, str ))
  {
    std::istringstream ist( str );
    std::vector<std::string> v;
    std::copy( std::istream_iterator<std::string>( ist ),
               std::istream_iterator<std::string>(), std::back_inserter(v) );
    std::swap( *v.begin(), *(v.begin() + v.size() / 2) );
    std::copy( v.begin(), v.end(), std::ostream_iterator<std::string> (o, " ") );
    o << std::endl;
  }
  o.close();
  std::cout << "Change of the file is successfully complete!" << std::endl;
}
//=============================================================================
void result()
{
  char text[500], buf[500];
  std::cout << "Enter the final name  file: ";
  std::cin >> text;
  std::ifstream f( text, std::ios::in );
  if (f.bad())
  {
    std::cout << "Error of opening of a file." << std::endl;
  }
  while (!f.eof())
  {
    f.getline( buf, 500 );
    std::cout << buf  << std::endl;
  }
  f.close();
}
//=============================================================================
int ShowMenu()
{
  int command = 0;
  while (true)
  {
    std::cout << "1. Changing of the first and average word in a line of the file" << std::endl;
    std::cout << "2. See result" << std::endl;
    std::cout << "3. Exit" << std::endl;
    std::cin >> command;
    if (command >=1 && command <=3)
      return command;
    std::cout << "You have entered a wrong command. Please repeat your choice: " << std::endl;
    if (std::cin.fail())
    {
      std::cin.clear();
      std::cin.sync();
    }
  }
  return -1;
}
//=============================================================================
int main()
{
  std::cout << "Welcome! Enter a command: "<< std::endl;
  int command = ShowMenu();
  switch (command)
  {
    case 1:
    {
      std::cout << "Enter a processed file name: " << std::endl;
      std::ifstream ifs( EnterFileName1() );
      std::cout << "Enter a final file name: " << std::endl;
      const char *outName = EnterFileName2();
      if (ifs.bad())
      {
        std::cout << "Wrong input file name!";
        exit(1);
      }
      else
      {
        ProcessingFile( ifs, outName );
        ifs.close();
      }
      break;
    }
    case 2:
      result();
      break;
    case 3:
      exit(0);
  }
  return 0;
}
//=============================================================================
« Последнее редактирование: 25-12-2012 20:42 от mary1010 » Записан
Dmitry
Помогающий

ru
Offline Offline

« Ответ #9 : 25-12-2012 21:04 » 

А зачем два EnterFileName? Вдруг пригодится? )

Неестественно в ф-ии ShowMenu проводить обработку на предмет правильности ввода. И код внутри main можно в while(true) обернуть, раз уж там выход предусмотрен.
« Последнее редактирование: 25-12-2012 21:20 от Dmitry » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines