Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
camel5
2 / 2 / 1
Регистрация: 10.11.2013
Сообщений: 47
1

Переписать компоненты файла 1.txt в файл 3.txt так, чтобы в файле 3.txt числа шли в определенном порядке

31.03.2014, 20:22. Просмотров 933. Ответов 5
Метки нет (Все метки)

Дан файл 1.txt, компоненты которого являются целыми числами.Файл 1.txt содержит столько же отрицательных чисел, сколько положительных. Используя вспомогательный файл 2.txt, переписать компоненты файла 1.txt в файл 3.txt так, чтобы в файле 3.txt числа шли в следующем порядке: два положительных, два отрицательных, два положительных, два отрицательных( предполагается, что число компонент в файле делится на 4).

Как можно написать эту программу без применения ftell и fseek?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2014, 20:22
Ответы с готовыми решениями:

Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в заданном порядке
Дан файл F, содержащий целые числа. Файл F содержит столько же отрицательных чисел, сколько...

Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в заданном порядке
Заданный файл f, компоненты которого являются целыми числами. Ни один из компонентов файла не равна...

Для файл с текстом input.txt построить алфавитно частичный словарь в файле output.txt
Помогите разобраться, не могу понять как сделать, чтобы алфавит размещался в росте (a, b, c, d...

Как сделать перенос из отдного txt файла текста в другой txt файл в Turbo C?
Надо сделать с потоками. fopen fgets fputs - с этими функциями

На диске находится файл result.txt. написать программу, создающую копию этого файла с именем copy_resylt.txt
На диске находится файл result.txt. Написать программу, создающую копию этого файла с именем...

5
Catstail
Модератор
24385 / 12326 / 2239
Регистрация: 12.02.2012
Сообщений: 20,022
31.03.2014, 21:05 2
А переоткрывать файлы можно? Если да - то задача решается так:

1) открываем 1.txt на чтение, а 2.txt на запись
2) прочитываем 1.txt до конца, отрицательные числа сбрасываем в 2.txt; закрываем 1.txt и 2.txt
3) открываем 1.txt и 2.txt на чтение, а 3.txt на запись
4) читаем из 1.txt два положительных (отрицательные пропускаем) и сбрасываем их в 3.txt
5) читаем из 2.txt два отрицательных и сбрасываем их в 3.txt
6) повторяем 4 и 5 до исчерпания; все закрываем, 2.txt удаляем.
3
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
31.03.2014, 22:17 3
Catstail, предлагаю вариант проще и без промежуточного файла. Два стека для положительных и отрицательных чисел заполняем пока читается 1.txt. Потом создаем 3.txt и поочеереди из стеков выкладываем по два значения в файл.
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#define STACK_IS_EMPTY 0 /* особенность задачи в том,
что мы оперируем только положительными или отрицательными
числами. А значит не можем вернуть из стека ноль, т.к. 
это число не входит в заданное множество. Таким образом
мы можем использовать ноль как сигнал пустоты стека.*/
 
#define STACK_IS_COMPLETE STACK_IS_EMPTY /* если стек наполнен,
то вернем сообщение об этом*/
 
/* счетчики для стеков положительных и отрицательных чисел */
static int count_neg = 0;
static int count_pos = 0;
 
/* стеки для положительных и отрицательных чисел */
int stack_pos[BUFSIZ], stack_neg[BUFSIZ];
 
/* флаги чтобы не путаться в стеках и счетчиках */
enum flags {POSITIVE, NEGATIVE};
 
/* положить число в стек */
int push(int n, enum flags flag)
{
  int t = STACK_IS_COMPLETE;
  
  switch(flag)
  {
    case POSITIVE: 
      if (count_pos < BUFSIZ)
    t = stack_pos[count_pos++] = n;
      break;
    case NEGATIVE:
      if (count_neg < BUFSIZ)
    t = stack_neg[count_neg++] = n;
      break;
  }  
  return t;
}
 
/* изъять число из стека */
int pop(enum flags flag)
{
  int t = STACK_IS_EMPTY;
  
  switch(flag)
  {
    case POSITIVE: 
      if (count_pos)
    t = stack_pos[--count_pos];
      break;
    case NEGATIVE:
      if (count_neg)
    t = stack_neg[--count_neg];
      break;
  }
  return t;
}
 
int main ()
{
  
  FILE *finput = NULL, *foutput = NULL;
  const char *fin = "1.txt";
  const char *fout = "3.txt";
  
  assert((finput = fopen(fin, "r")) != NULL);
  assert((foutput = fopen(fout, "w+")) != NULL);
  
  /* TODO: читать файл, заполнять стеки, писать в файл из стеков */
  
  assert(fclose(finput) == 0);
  assert(fclose(foutput) == 0);
  
  return 0;
}
2
IrineK
Заблокирован
31.03.2014, 22:48 4
Catstail, со второго шага немного отличается, но идея в целом та же.

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
#include <stdio.h>
 
//шаг 1: из файла 1 - отрицательные в файл 2
//положительные в файл 3
int Step1 (char *n1, char *n2, char *n3)
{   FILE *f1 = fopen (n1, "r");
    FILE *f2 = fopen (n2, "w");
    FILE *f3 = fopen (n3, "w");
    int num;
 
    if ( !(f1 && f2 && f3))
        return 0;
 
    while (fscanf (f1, "%d", &num) == 1)
        if (num < 0)
            fprintf (f2, "%d   ", num);
        else
            fprintf (f3, "%d   ", num);
 
    fclose(f1);
    fclose(f2);
    fclose(f3);
    return 1;
}
 
//шаг 2: из файла 3 положительные в файл 1
int Step2 (char *n1, char *n3)
{   FILE *f1 = fopen (n1, "w");
    FILE *f3 = fopen (n3, "r");
    int num;
 
    if ( !(f1 && f3))
        return 0;
 
    while (fscanf (f3, "%d", &num) == 1)
        fprintf (f1, "%d   ", num);
 
    fclose(f1);
    fclose(f3);
    return 1;
}
 
//шаг 3: из файла 1 положительные и попеременно
//из файла 2 отрицательные в файл 3
int Step3 (char *n1, char *n2, char *n3)
{   FILE *f1 = fopen (n1, "r");
    FILE *f2 = fopen (n2, "r");
    FILE *f3 = fopen (n3, "w");
    int num1, num2, num3, num4;
 
    if ( !(f1 && f2 && f3))
        return 0;
    
    while (fscanf (f1, "%d%d", &num1, &num2) == 2 && fscanf (f2, "%d%d", &num3, &num4) == 2)
        fprintf (f3, "%d  %d   %d   %d   ", num1, num2, num3, num4);
 
    fclose(f1);
    fclose(f2);
    fclose(f3);
    return 1;
}
 
//показать соделжимое файла
int PrintFile (char *name)
{   FILE *f = fopen (name, "r");
    if (!f)
        return 0;
 
    int num;
    printf("\nFile %s\n", name);
    while (fscanf (f, "%d", &num) == 1)
        printf("%d   ", num);
    printf ("\n");
 
    fclose(f);
    return 1;
}
 
int main()
{   char *name1 = "1.txt";
    char *name2 = "2.txt";
    char *name3 = "3.txt";
 
    if (!PrintFile (name1))
        printf("Error reading file %s", name1);
 
    if (!Step1 (name1, name2, name3))
        printf("Error Step1");
 
    if (!Step2 (name1, name3))
        printf("Error Step2");
 
    if (!Step3 (name1, name2, name3))
        printf("Error Step3");
 
    if (!PrintFile (name3))
        printf("Error reading file %s", name3);
 
    if (!remove( name2))
        perror("\nDeleting file");
 
    getchar ();
    return 0;
}
3
Миниатюры
Переписать компоненты файла 1.txt в файл 3.txt так, чтобы в файле 3.txt числа шли в определенном порядке  
Catstail
Модератор
24385 / 12326 / 2239
Регистрация: 12.02.2012
Сообщений: 20,022
01.04.2014, 11:31 5
Цитата Сообщение от castorsky Посмотреть сообщение
Два стека для положительных и отрицательных чисел
Цитата Сообщение от castorsky Посмотреть сообщение
Catstail, предлагаю вариант проще
- так это - как сказать... А если файлы размером по 2Гб каждый... Если нет ограничений на оперативную память, задача становится заметно легче.
0
camel5
2 / 2 / 1
Регистрация: 10.11.2013
Сообщений: 47
03.04.2014, 15:01  [ТС] 6
Спасибо за помощь.Пытаюсь поэкспериментировать с программой(хочу заменить функцию циклом), но не получается.
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
#include <stdio.h>
#include <stdlib.h>
#define SIZE 64
 
int main()
 
{   FILE *f1, *f2, *f3;
    int a,a1,a2,a3,a4,i;
 
//шаг 1: из файла 1 - отрицательные в файл 2
f1 = fopen("1.txt", "r");
f2 = fopen("2.txt", "w");
f3 = fopen("3.txt", "w");
 
    while (fscanf (f1, "%d", &a) == 1)
        if (a < 0)
    fprintf (f2, "%d", a);
    else
            fprintf (f3, "%d   ", a);
    fclose(f1);
    fclose(f2);
    fclose(f3);
   //шаг 2  из файла 3.txt  числа записываю в 1.txt 
 f1 = fopen("1.txt", "w");
 f3 = fopen("3.txt", "r");
 
 while (fscanf (f3, "%d", &a) == 1)
        fprintf (f1, "%d   ", a);
 
    fclose(f1);
    fclose(f3);
    
//шаг 3: из файла 1 положительные и попеременно
//из файла 2 отрицательные в файл 3
 
f1 =fopen("1.txt","r");
f2 = fopen("2.txt", "r");
f3 = fopen("3.txt", "w");
for(i=0; i<SIZE; i++){
   while (fscanf (f1, "%d%d", &a1, &a2) == 2)
   fprintf (f3, "%d  %d", a1, a2);
   while (fscanf (f2, "%d%d", &a3, &a4) == 2)
   fprintf (f3, "%d  %d", a3, a4);
}
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}
0
03.04.2014, 15:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2014, 15:01

Переписать компоненты файла F в файл G так, чтобы в файле G не было двух соседних компонент с одним знаком
Всем привет. Задача следующая: Дан файл F, компоненты которого являются целыми числами. Никакая...

Файл a.txt нужно сравнить с файлом c.txt
Всем привет! Есть файл a.txt: 1 2 3 4 5 Есть файл c.txt:

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru