Advertisement
DanikKUL

Перезапись последовательности с одного файла в другой в другой последовательности

Mar 6th, 2022
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // Дан символьный файл f, компоненты которого являются целыми числами.
  5. // Никакая из компонент файла f не равна нулю. Числа в файле идут в следующем
  6. // порядке: 10 положительных, 10 отрицательных и т.д. Переписать компоненты файла f
  7. // в файл g так, чтобы в файле g числа шли в следующем порядке: 5 положительных, 5 отрицательных и т.д.
  8.  
  9. void inputNumbers(FILE *file, int amount);
  10. void rewriteNumbers(FILE *f, FILE *g, int amount);
  11.  
  12. int main() {
  13.     FILE *f, *g;
  14.     if (!(f = fopen("/Users/dankulakovich/CLionProjects/laba2/input.txt", "w")) ||
  15.     !(g = fopen("/Users/dankulakovich/CLionProjects/laba2/output.txt", "w"))){
  16.         printf("Невозможно открыть файл\n");
  17.         return 1;
  18.     }
  19.     int amount = 1;
  20.     printf("Введите количество вводимых чисел\nЧисло должно быть кратно 20\n");
  21.     while(amount < 1 || amount % 20 != 0){
  22.         fflush(stdin);
  23.         while(!scanf("%d", &amount)){
  24.             fflush(stdin);
  25.             printf("Ошибка: вы ввели не число!\n");
  26.         }
  27.         if(amount < 1 || amount % 20 != 0){
  28.             printf("Ошибка: число должно быть кратно 20!\n");
  29.         }
  30.     }
  31.     inputNumbers(f, amount);
  32.     rewriteNumbers(f, g, amount);
  33.     fclose(f);
  34.     fclose(g);
  35.     return 0;
  36. }
  37.  
  38. void inputNumbers(FILE *file, int amount){
  39.     int number = 0, arr[20];
  40.     printf("Вводите любые числа кроме нуля\n");
  41.     for (int i = 0; i < amount; ++i) {
  42.         number = 0;
  43.         fflush(stdin);
  44.         if((i / 10) % 2 == 0){
  45.             printf("Введите положительное число\n");
  46.         } else {
  47.             printf("Введите отрицательное число\n");
  48.         }
  49.         while(number == 0) {
  50.             fflush(stdin);
  51.             while (!scanf("%d", &number)) {
  52.                 fflush(stdin);
  53.                 printf("Ошибка: вы ввели не число!\n");
  54.             }
  55.             if(number == 0){
  56.                 printf("Ошибка: число не должно быть равно нулю!\n");
  57.             }
  58.         }
  59.         if(((i / 10) % 2 == 0 && number > 0) || ((i / 10) % 2 == 1 && number < 0)){
  60.             fprintf(file, "%d", number);
  61.             fprintf(file, "%c", ' ');
  62.         } else {
  63.             printf("err\n");
  64.             i--;
  65.         }
  66.     }
  67.     fclose(file);
  68. }
  69.  
  70. fpos_t negativePosition(FILE *f, fpos_t curPos){
  71.     f = fopen("/Users/dankulakovich/CLionProjects/laba2/input.txt", "r");
  72.     fpos_t negPos;
  73.     int number;
  74.     fsetpos(f, &curPos);
  75.     fscanf(f, "%d", &number);
  76.     while(number > 0 && !feof(f)){
  77.         fgetpos(f, &curPos);
  78.         fscanf(f, "%d", &number);
  79.     }
  80.     return curPos;
  81. }
  82.  
  83. fpos_t positivePosition(FILE *f, fpos_t curPos){
  84.     f = fopen("/Users/dankulakovich/CLionProjects/laba2/input.txt", "r");
  85.     fpos_t posPos;
  86.     int number;
  87.     fsetpos(f, &curPos);
  88.     fscanf(f, "%d", &number);
  89.     while(number < 0 && !feof(f)){
  90.         fgetpos(f, &curPos);
  91.         fscanf(f, "%d", &number);
  92.     }
  93.     fsetpos(f, &curPos);
  94.     return curPos;
  95. }
  96.  
  97. void rewriteNumbers(FILE *f, FILE *g, int amount){
  98.     f = fopen("/Users/dankulakovich/CLionProjects/laba2/input.txt", "r");
  99.     g = fopen("/Users/dankulakovich/CLionProjects/laba2/output.txt", "w");
  100.     int number = 0;
  101.     fpos_t posPos = positivePosition(f, 0), negPos = negativePosition(f, 0), endPos, curPos = 0;
  102.     fseek(f, 0, 2);
  103.     fgetpos(f, &endPos);
  104.     fsetpos(f, &posPos);
  105.     while (curPos != endPos - 1) {
  106.         for (int i = 0; i < 2; ++i) {
  107.             fsetpos(f, &posPos);
  108.             for (int j = 0; j < 5; ++j) {
  109.                 fscanf(f, "%d", &number);
  110.                 fprintf(g, "%d ", number);
  111.             }
  112.             fgetpos(f, &posPos);
  113.             fsetpos(f, &negPos);
  114.             for (int j = 0; j < 5; ++j) {
  115.                 fscanf(f, "%d", &number);
  116.                 fprintf(g, "%d ", number);
  117.             }
  118.             fgetpos(f, &negPos);
  119.         }
  120.         fgetpos(f, &curPos);
  121.         negPos = negativePosition(f, curPos);
  122.         posPos = positivePosition(f, curPos);
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement