Форум программистов, компьютерный форум CyberForum.ru

Работа с файлом, найти, изменить. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
10.05.2011, 18:26     Работа с файлом, найти, изменить. #1
Добрый день. Задание по файлам, любая помощь приветствуется (справка, написание куска кода)
Задача:
Есть исходный файл input.txt(прикреплен). В нем 3 колонки разделенные ";" - 1 колонка с названием банков, строковый тип ну и две колонки с цифрами вещественного типа. эти две колонки соответственно за 2000 и 2001 год. И так суть задания:
Создать новый файл Output.txt в котором.
1) Получить список банков, выдавших в 2000г ссуду более 5 млн. руб.
2) Определить какой из банков, и в каком году выдал наибольшую ссуду.
3) Удалить информацию о банке, который не выдавал ссуду хоть в одном из годов. (на том месте 0)
4) Упорядочить названия банков по убыванию суммарной выданной ссуды.

Что может потребоваться для выполнения, какие либо функции, возможно есть у кого то какой то готовый код, за все спасибо..

Не по теме:

Пишу на DEV-C++, просьба не отправлять в справку по студии..

Вложения
Тип файла: txt input.txt (493 байт, 25 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2011, 18:26     Работа с файлом, найти, изменить.
Посмотрите здесь:

работа с файлом C++
Работа с файлом C++
C++ работа с файлом
Работа с файлом C++
C++ Найти слова, встречающиеся в каждом предложении текста. Работа с файлом опять)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
10.05.2011, 20:01  [ТС]     Работа с файлом, найти, изменить. #2
upd..
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.05.2011, 20:43     Работа с файлом, найти, изменить. #3
В файле целая часть числа отделяеться от дробной точкой, а не запятой.

Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
1) Получить список банков, выдавших в 2000г ссуду более 5 млн. руб.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <windows.h>
 
struct bank{
  std::string  bank_name_;
  double       money_2000y_, money_2001y_;
 
  friend std::istream &operator>> (std::istream &is, bank &inf){
    std::string buf;
    getline(is, inf.bank_name_, ';');
    is >> buf;
    std::replace(buf.begin(), buf.end(), ';', ' ');
    std::istringstream ist(buf);
    ist >> inf.money_2000y_ >> inf.money_2001y_;
    return is;
  }
};
 
int main(){
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  std::ifstream ifs("input.txt");
  if(!ifs){
    std::cerr << "File Not Found" << std::endl;
    return 1;
  }
  std::string tmp;
  ifs >> tmp;
  tmp.clear();
  const size_t count_banks_in_file(20);
  std::vector<bank> v(count_banks_in_file);
  for(size_t i = 0; i < count_banks_in_file; ++i){
    ifs >> v[i];
    if(v[i].money_2000y_ > 5.0)
      std::cout << v[i].bank_name_ << '\n';
  }
  return 0;
}
Все остальное по аналогии.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
10.05.2011, 20:53  [ТС]     Работа с файлом, найти, изменить. #4
asics, спс дружище..

Добавлено через 5 минут
asics, выводит аброкадабру... что с кодировками подзамутить?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.05.2011, 20:54     Работа с файлом, найти, изменить. #5
В свойствах окна консоли, поменяй шрифт на Lucida console или тут поищи -Русские шрифты в консоли
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
10.05.2011, 21:00  [ТС]     Работа с файлом, найти, изменить. #6
asics, да нет.. касяк не в этом, в других программах то все норм..
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.05.2011, 21:03     Работа с файлом, найти, изменить. #7
IIIa66uMEM6eP, Хз, у меня все норм:
Миниатюры
Работа с файлом, найти, изменить.  
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
10.05.2011, 21:05  [ТС]     Работа с файлом, найти, изменить. #8
asics, на сколько вижу, код блокс.. тогда в двойне странно.. я и в нем пробывал
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.05.2011, 21:11     Работа с файлом, найти, изменить. #9
Дауж, странно. А ну попробуй открыть тот файл notepad++`ом и посмотреть там кодировку, должно быть ANSI, ну у меня так.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
10.05.2011, 22:25  [ТС]     Работа с файлом, найти, изменить. #10
asics, аналогично

Добавлено через 15 минут
asics, плюнул) переписал на DEV-C++, работает)

Добавлено через 56 минут
Цитата Сообщение от asics Посмотреть сообщение
Все остальное по аналогии.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
   // теперь ищем самую большую суду
  double max_suda=0;
  int buf1;
  fout << "Банк выдал наибольшую суду - ";
 for(size_t i = 0; i < count_banks_in_file; ++i){ // поиск
    ifs >> v[i]; // передаем массиву
    if(v[i].money_2000y_ > max_suda) // если найден элемент 
    max_suda = v[i].money_2000y_;
    buf1 = i;                                  
 }
     v[buf1].bank_name_ = max_suda;                                            
     fout << v[buf1].bank_name_ << '\n'; // то вывести 
  //--------------------------------------------
на выходе:
Код
 

Банк выдал наибольшую суду - d
почему d? где смысловая ошибка?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.05.2011, 22:46     Работа с файлом, найти, изменить. #11
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
2) Определить какой из банков, и в каком году выдал наибольшую ссуду.
Всмисле найбольшую суму ? Если да то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <windows.h>
 
struct bank{
  std::string  bank_name_;
  double       money_2000y_, money_2001y_;
 
  friend std::istream &operator>> (std::istream &is, bank &inf){
    std::string buf;
    getline(is, inf.bank_name_, ';');
    is >> buf;
    std::replace(buf.begin(), buf.end(), ';', ' ');
    std::istringstream ist(buf);
    ist >> inf.money_2000y_ >> inf.money_2001y_;
    return is;
  }
  bool operator< (const bank &_1){
    return std::max(money_2000y_, money_2001y_) < std::max(_1.money_2000y_, _1.money_2001y_);
  }
};
 
int main(){
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  std::ifstream ifs("input.txt");
  if(!ifs){
    std::cerr << "File Not Found" << std::endl;
    return 1;
  }
  std::string tmp;
  ifs >> tmp;
  tmp.clear();
  const size_t count_banks_in_file(20);
  std::vector<bank> v(count_banks_in_file);
  for(size_t i = 0; i < count_banks_in_file; ++i){
    ifs >> v[i];
  }
  bank _max = *std::max_element(v.begin(), v.end());
  std::cout << _max.bank_name_ << '\t' << (_max.money_2000y_ > _max.money_2001y_? "2000" : "2001");
  return 0;
}
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
12.05.2011, 17:07  [ТС]     Работа с файлом, найти, изменить. #12
Цитата Сообщение от asics Посмотреть сообщение
bank _max = *std::max_element(v.begin(), v.end());
не вызывает доверия эта строчка.. да и не компилируется (совместил в одну программу)
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
12.05.2011, 17:42     Работа с файлом, найти, изменить. #13
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
да и не компилируется
Незнаю, GCC 4.6.0 все нормально компилирует.
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
не вызывает доверия эта строчка
Причины не доверия ?
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
12.05.2011, 21:02  [ТС]     Работа с файлом, найти, изменить. #14
Цитата Сообщение от asics Посмотреть сообщение
Причины не доверия
незнания языка) ошибка в этой строке.. что то вроде instantiated from here

что то такое
Миниатюры
Работа с файлом, найти, изменить.  
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
26.05.2011, 15:59  [ТС]     Работа с файлом, найти, изменить. #15
upd. не получается.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
31.05.2011, 19:21  [ТС]     Работа с файлом, найти, изменить. #16
Реализую сложение ссуд банков за 2000 и 2001 год. Складывает без учета флотовской запятой. тобишь к примеру 13.3 + 1.4 = 14.
Знаю что ошибка в считывании потока с этими данными в строку, но не допру как изменить
Прикрепляю входной и выходной файлы.

И так. Чуть чуть ДО пиленный код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <windows.h>
#pragma comment(lib,"kernel32.lib") 
using namespace std;
 
//структура содержимого
struct bank{
  std::string  bank_name_; // строка с именами банков
  float       money_2000y_, money_2001y_; 
 
  friend istream &operator>> (istream &is, bank &inf){
    string buf; // буферная строка
    getline(is, inf.bank_name_, ';'); // берем всю строку с именами банков и
    is >> buf;  // переносим в буферную строку
    // заменяем до конца пробелами после двоеточия с 1 позиции
    replace(buf.begin(), buf.end(), ';', ' ');
    //
    istringstream ist(buf); // считываем из потока строки
    //перенаправляем поток 
    ist >> inf.money_2000y_ >> inf.money_2001y_;
    return is;
  }
};
 
int main(){
        setlocale (LC_CTYPE, "rus");
// открываем файл
  ifstream ifs("C:\\input.txt");
  if(!ifs){
    cerr << "File Not Found" << endl;
    return 1;
  } 
  string tmp;
  ifs >> tmp; //передаем строке значения
  tmp.clear(); // вызов удаления всех символов
  const size_t count_banks_in_file(20);// так 20 строк банков
  vector<bank> v(count_banks_in_file);  //динамический массив
  //Открываем файл для записи
  ofstream fout ("C:\\output.txt");
  //
  
 // сначала ищем те у которых > 5 милионов рублей
fout << "Банки у которых прибыль составила больше 5 милионов: "<< endl;
  for(size_t i = 0; i < count_banks_in_file; ++i){ // поиск
    ifs >> v[i]; // передаем массиву
    if(v[i].money_2000y_ >= 5.0) // если найден элемент больший 5.0
     fout << v[i].bank_name_ << '\n'; // то вывести банки с такими элементами 
                                        // в строке (запишем в новый файл)
  }
 fout << endl;
 // ---------------------------------------------------------
fout << "Показываем в каком году банк выдавал наибольшую ссуду: " << endl;
    
  // теперь ищем самую большую суду
  for(size_t i = 0; i < count_banks_in_file; ++i)
  {
    ifs >> v[i];
 
    string max_element = (v[i].money_2000y_ > v[i].money_2001y_? "2000" : "2001");
     fout <<  v[i].bank_name_ <<'\t'<< max_element << endl;
  //--------------------------------------------
  }
 // удаляем информацию о банке, который не выдавал ссуду хотябы в одном из годов (0)
   fout << endl; 
   fout << "Удаляем следующие банки, которые в один из годов не выдавали суды.";
     for(size_t i = 0; i < count_banks_in_file; ++i)
  {
    ifs >> v[i];
    if(v[i].money_2000y_ == 0 || v[i].money_2001y_ == 0)
    fout << v[i].bank_name_ << '\n';      
  } 
fout << endl;
 //----------------------------------------------
fout << "Сумма суды выданной банками за 2 года: " << endl;
 //Упорядочиваем названия банков по убыванию суммарной выданной ссуды.
 //Сначала складываем суды 2000 и 2001 года. 
 
  for(size_t i = 0; i < count_banks_in_file; ++i)
  {     
   ifs >> v[i];
   float summa = v[i].money_2000y_ + v[i].money_2001y_;
   fout << summa << endl;
  } 
 
 
 //-----------------------------------------------
  //закроем файл
  fout.close();
  //
cout << endl; 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Вложения
Тип файла: txt input.txt (489 байт, 9 просмотров)
Тип файла: txt output.txt (843 байт, 9 просмотров)
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
31.05.2011, 19:25     Работа с файлом, найти, изменить. #17
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
Складывает без учета флотовской запятой. тобишь к примеру 13.3 + 1.4 = 14
Еще раз..
Цитата Сообщение от asics Посмотреть сообщение
В файле целая часть числа отделяеться от дробной точкой, а не запятой.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
31.05.2011, 20:35  [ТС]     Работа с файлом, найти, изменить. #18
asics, спасибо) оно

Добавлено через 17 минут
asics, еще вопрос.. мне нужно удалить в файле строки с банками которые не выдавали суды в каком либо из годов (в этой графе стоит 0). Я написал условие, но как работать с файлом не знаю.. Возможно как то с темповским файлом, возможно еще как то. Подскажите..
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
31.05.2011, 20:50     Работа с файлом, найти, изменить. #19
C++
1
2
3
4
5
6
7
8
9
std::fstream fs("input.txt", std::ios::in);//Открываеш на чтение
/*
Все сожержимое заносиш в буфер(ы) с которым(и) будеш работать
*/
fs.close()//Закрываеш поток
fs.open("input.txt", std::ios::out)//и открываеш его на запись
/*
Тут заносиш в файл только те данные которые нужно
*/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2011, 22:52     Работа с файлом, найти, изменить.
Еще ссылки по теме:

C++ Работа с файлом
Работа с bmp файлом не получается найти ошибку C++
C++ Работа с файлом. Необходимо изменить программу

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
04.06.2011, 22:52  [ТС]     Работа с файлом, найти, изменить. #20
Выложу то что получилось.. Вдруг кто то что то переймет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <windows.h>
#pragma comment(lib,"kernel32.lib") 
using namespace std;
 
//структура содержимого
struct bank
{
  string  bank_name_; // строка с именами банков
  float       money_2000y_, money_2001y_; 
 
  friend istream &operator>> (istream &is, bank &inf){
    string buf; // буферная строка
    getline(is, inf.bank_name_, ';'); // берем всю строку с именами банков и
    is >> buf;  // переносим в буферную строку
    // заменяем до конца пробелами после двоеточия с 1 позиции
    replace(buf.begin(), buf.end(), ';', ' ');
    //
    istringstream ist(buf); // считываем из потока строки
    //перенаправляем поток 
    ist >> inf.money_2000y_ >> inf.money_2001y_;
    return is;
  }
};
 
int main(){
        setlocale (LC_CTYPE, "rus");
// открываем файл
  ifstream ifs("C:\\input.txt");
  if(!ifs){
    cerr << "File Not Found" << endl;
    return 1;
  } 
  string tmp;
  ifs >> tmp; //передаем строке значения
  tmp.clear(); // вызов удаления всех символов
  const size_t count_banks_in_file(20);// так 20 строк банков
  vector<bank> v(count_banks_in_file);  //динамический массив
  //Открываем файл для записи
  ofstream fout ("C:\\output.txt");
  //
  
 // сначала ищем те у которых > 5 милионов рублей
fout << "__________________________________________________________________" << endl;
fout << "Банки у которых прибыль составила больше 5 милионов: "<< endl;
fout << "__________________________________________________________________" << endl;
  for(size_t i = 0; i < count_banks_in_file; ++i){ // поиск
    ifs >> v[i]; // передаем массиву
    if(v[i].money_2000y_ >= 5.0) // если найден элемент больший 5.0
     fout << v[i].bank_name_ << '\n'; // то вывести банки с такими элементами 
                                        // в строке (запишем в новый файл)
  }
 fout << endl;
 fout << endl; 
 // ---------------------------------------------------------
fout << "__________________________________________________________________" << endl;
fout << "Показываем в каком году банк выдавал наибольшую ссуду: " << endl;
fout << "__________________________________________________________________" << endl;    
  // теперь ищем самую большую суду
  for(size_t i = 0; i < count_banks_in_file; ++i)
  {
    ifs >> v[i];
 
    string max_element = (v[i].money_2000y_ > v[i].money_2001y_? "2000" : "2001");
     fout <<  v[i].bank_name_ <<'\t'<< max_element << endl;
  //--------------------------------------------
  }
  
  /////////////////////////////////////////////////////////////////////////////////
 // удаляем информацию о банке, который не выдавал ссуду хотябы в одном из годов (0)
   fout << endl; 
fout << "__________________________________________________________________" << endl;
   fout << "Удаляем следующие банки, которые в один из годов не выдавали суды." << endl;
   fout << "Выводим только те - которые выдавали: " << endl;
fout << "__________________________________________________________________" << endl;
   fout << endl;
     for(size_t i = 0; i < count_banks_in_file; ++i)
  {
fstream fs("C:\\input.txt", std::ios::in);//Открываеш на чтение
 
//Все сожержимое заносим в буфер(ы) с которым(и) будем работать
ifs >> v[i];
fs.open("C:\\output.txt", std::ios::out); //и открываем его на запись
//Тут заносим в файл только те данные которые нужно
if(!(v[i].money_2000y_ == 0 || v[i].money_2001y_ == 0)) // перезаписываем по условию 
fout << v[i].bank_name_ << '\n';
  } 
  /////////////////////////////////////////////////////////////////////////////////
fout << endl;
 //----------------------------------------------
fout << "__________________________________________________________________" << endl;
fout << "Сумма суды выданной банками за 2 года: " << endl;
fout << "__________________________________________________________________" << endl;
fout << endl;
 //Упорядочиваем названия банков по убыванию суммарной выданной ссуды.
 //Сначала складываем суды 2000 и 2001 года. 
  for(size_t i = 0; i < count_banks_in_file; ++i)
  {     
   ifs >> v[i];
   float summa = v[i].money_2000y_ + v[i].money_2001y_;
   fout << v[i].bank_name_ << " " << summa << endl;
  } 
fout << endl;
fout << "__________________________________________________________________" << endl;
 //-----------------------------------------------
  //закроем файл
  fout.close();
  //
cout << endl; 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Yandex
Объявления
04.06.2011, 22:52     Работа с файлом, найти, изменить.
Ответ Создать тему
Опции темы

Текущее время: 19:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru