Advertisement
DaniDori

Числа и файлы

Sep 30th, 2023
766
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <string>
  5. #include <sstream>
  6. #include <climits>
  7. using namespace std;
  8.  
  9. // 1.3.1. Создание текстового файла.
  10. void createFile(const string& filename, const vector<vector<int>>& data) {
  11.     ofstream outfile(filename);
  12.  
  13.     if (!outfile.is_open()) {
  14.         cerr << "Не удалось создать файл." << endl;
  15.         return;
  16.     }
  17.  
  18.     for (const auto& row : data) {//Перебор сроки в матрице
  19.         for (const int num : row) {//Перебор внутри строки
  20.             outfile << num << " ";
  21.         }
  22.         outfile << "\n";
  23.     }
  24.     outfile.close();
  25. }
  26.  
  27. // 1.3.2. Вывод содержимого текстового файла.
  28. void displayFileContent(const string& filename) {
  29.     ifstream infile(filename);
  30.  
  31.     if (!infile.is_open()) {
  32.         cerr << "Не удалось открыть файл." << endl;
  33.         return;
  34.     }
  35.  
  36.     string line;
  37.     while (getline(infile, line)) {
  38.         cout << line << "\n";
  39.     }
  40.     infile.close();
  41. }
  42.  
  43. // 1.3.3. Добавление новой строки в конец файла.
  44. void appendToFile(const string& filename, const vector<int>& data) {
  45.     ofstream outfile(filename, ios::app);
  46.  
  47.     if (!outfile.is_open()) {
  48.         cerr << "Не удалось открыть файл." << endl;
  49.         return;
  50.     }
  51.     //Приписываем одну строчку к файлу(из чисел)
  52.     for (const int num : data) {
  53.         outfile << num << " ";
  54.     }
  55.     //Закидываем переход на новую строку в файл
  56.     outfile << "\n";
  57.     outfile.close();
  58. }
  59.  
  60. // 1.3.4. Прочитать значение числа, указав его порядковый номер в файле.
  61. //мы спрашиваем функцию - что лежит под номером index
  62. int readNumberByIndex(const string& filename, size_t index) {
  63.     ifstream infile(filename);
  64.  
  65.     if (!infile.is_open()) {
  66.         cerr << "Не удалось открыть файл." << endl;
  67.         return -1;
  68.     }
  69.  
  70.     size_t count = 0;
  71.     string line;
  72.     //Не знаем сколько строк в файле - читаем пока читается
  73.     while (getline(infile, line)) {
  74.         //создаем поток ввода из строки
  75.         istringstream ss(line);
  76.         int num;
  77.         //Не знаем сколько чисел в строке - читаем, пока читаются, подсчитываем их
  78.         while (ss >> num) {
  79.             if (count == index) {
  80.                 infile.close();
  81.                 return num;
  82.             }
  83.             count++;
  84.         }
  85.     }
  86.     infile.close();
  87.     cerr << "Индекс вне диапазона." << endl;
  88.     return -1;
  89. }
  90.  
  91. // 1.3.5. Определить количество чисел в файле.
  92. size_t countNumbersInFile(const string& filename) {
  93.     ifstream infile(filename);
  94.  
  95.     if (!infile.is_open()) {
  96.         cerr << "Не удалось открыть файл." << endl;
  97.         return 0;
  98.     }
  99.  
  100.     size_t count = 0;
  101.     string line;
  102.     while (getline(infile, line)) {
  103.         istringstream ss(line);
  104.         int num;
  105.         while (ss >> num) {
  106.             count++;
  107.         }
  108.     }
  109.     infile.close();
  110.     return count;
  111. }
  112.  
  113. // 10. Создать новый файл из значений исходного, умножив каждое четное число на максимальное число в файле.
  114. void createModifiedFile(const string& inputFilename, const string& outputFilename) {
  115.     ifstream infile(inputFilename);
  116.  
  117.     if (!infile.is_open()) {
  118.         cerr << "Не удалось открыть файл." << endl;
  119.         return;
  120.     }
  121.     //В потенциальный максимум закидываем максимально маленькое число
  122.     int maxNumber = INT_MIN;
  123.     string line;
  124.     //Перебирая все числа - находим максимум
  125.     while (getline(infile, line)) {
  126.         istringstream ss(line);
  127.         int num;
  128.         while (ss >> num) {
  129.             if (num > maxNumber) {
  130.                 maxNumber = num;
  131.             }
  132.         }
  133.     }
  134.     infile.close();
  135.  
  136.     infile.open(inputFilename);
  137.     ofstream outfile(outputFilename);
  138.  
  139.     while (getline(infile, line)) {
  140.         istringstream ss(line);
  141.         int num;
  142.         while (ss >> num) {
  143.             if (num % 2 == 0) {
  144.                 outfile << num * maxNumber << " ";
  145.             }
  146.             else {
  147.                 outfile << num << " ";
  148.             }
  149.         }
  150.         outfile << "\n";
  151.     }
  152.  
  153.     infile.close();
  154.     outfile.close();
  155. }
  156.  
  157. void menu() {
  158.     setlocale(LC_ALL, "Russian");
  159.     string filename;
  160.     cout << "Введите имя файла: ";
  161.     cin >> filename;
  162.  
  163.     while (true) {
  164.         cout << "\n--- Меню ---\n";
  165.         cout << "1. Создать файл\n";
  166.         cout << "2. Показать содержимое файла\n";
  167.         cout << "3. Добавить строку в файл\n";
  168.         cout << "4. Прочитать число по индексу\n";
  169.         cout << "5. Узнать количество чисел в файле\n";
  170.         cout << "6. Создать модифицированный файл\n";
  171.         cout << "7. Выход\n";
  172.         cout << "Выберите действие: ";
  173.  
  174.         int choice;
  175.         cin >> choice;
  176.  
  177.         switch (choice) {
  178.         case 1: {
  179.             //Здесь первоначальный ввод
  180.             vector<vector<int>> data = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
  181.             createFile(filename, data);
  182.             cout << "Файл создан успешно";
  183.             break;
  184.         }
  185.         case 2: {
  186.             displayFileContent(filename);
  187.             break;
  188.         }
  189.         case 3: {
  190.             cout << "Введите числа для добавления (через пробел), завершите точкой: ";
  191.             vector<int> newData;
  192.             int value;
  193.             while (cin >> value) {
  194.                 newData.push_back(value);
  195.             }
  196.             cin.clear();
  197.             cin.ignore(numeric_limits<streamsize>::max(), '\n');
  198.             appendToFile(filename, newData);
  199.             break;
  200.         }
  201.         case 4: {
  202.             size_t index;
  203.             cout << "Введите индекс числа: ";
  204.             cin >> index;
  205.             int num = readNumberByIndex(filename, index);
  206.             if (num != -1) {
  207.                 cout << "Число: " << num << "\n";
  208.             }
  209.             break;
  210.         }
  211.         case 5: {
  212.             size_t count = countNumbersInFile(filename);
  213.             cout << "Количество чисел: " << count << "\n";
  214.             break;
  215.         }
  216.         case 6: {
  217.             string outputFilename;
  218.             cout << "Введите имя выходного файла: ";
  219.             cin >> outputFilename;
  220.             createModifiedFile(filename, outputFilename);
  221.             break;
  222.         }
  223.         case 7:
  224.             return;
  225.         default:
  226.             cout << "Неверный выбор.\n";
  227.         }
  228.     }
  229. }
  230.  
  231. int main() {
  232.     menu();
  233.     return 0;
  234. }
  235.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement