Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
1

Черезстрочное слияние

30.09.2009, 21:53. Показов 2845. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Появилось вот такое задание по C++:
Написать программу на языке C++ чересстрочного слияния (т.е. первая строка в выходном файле - это первая строка из первого файла, вторая строка в выходном файле - это первая строка из второго файла, третья строка в выходном файле - вторая строка из первого файла и т.д.) двух текстовых файлов с удалением в каждой строке слов после которых стоит любой знак препинания.

Алгоритм программы:
C++
1
2
3
4
5
6
                           \\здесь описание всяких переменных 
void main() {}        \\основная программа
void s1() {}           \\процедура, открывающая 1 и 2 файл на чтение с диска
vois s2() {}           \\процедура, создающая третий файл и модифицирующая его (копирование строк)
void s3() {}           \\процедура, которая выполняет удаление (после знаков препинания)
void s4() {}           \\процедура, закрывающая все файлы
Подскажите, пожалуйста, правильно выбран алгоритм реализации данной программы...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2009, 21:53
Ответы с готовыми решениями:

Слияние массивов
Получить массив С(k), упорядоченный по возрастанию, путем слияния массивов A(n) и B(m),...

Слияние строк
Разработать программу для упрощения работы с путем (Path) к файлу в файловой системе. Привязку к...

Бинарное слияние
Не получается реализовать алгоритм. Хелп плз. ...

Слияние массивов
Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B...

33
Администратор
83617 / 52195 / 244
Регистрация: 10.04.2006
Сообщений: 13,426
30.09.2009, 22:06 2
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Чересстрочное слияние файлов
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.10.2009, 02:51 3
Цитата Сообщение от kandrey58region Посмотреть сообщение
с удалением в каждой строке слов после которых стоит любой знак препинания.
Это непонятно. Слова удаляются в строках, которые где находятся?

1)В исходных файлах
2)В выходном файле
3)Везде
0
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
01.10.2009, 09:52  [ТС] 4
Цитата Сообщение от kravam Посмотреть сообщение
Это непонятно. Слова удаляются в строках, которые где находятся?

1)В исходных файлах
2)В выходном файле
3)Везде
В выходном файле, и знак препинания удаляется тоже

Добавлено через 56 минут
все дело в том, что по данной ссылке, как я понял программа состоит из нескольких файлов, а у меня должна состоять из одного, и мне нужно пока сделать без ООП, т.к. я даже не могу понять что там описано и происходит
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.10.2009, 10:06 5
kandrey58region, сбрось весь код в один файл(только правильно) и будет у тебя все работать
0
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
01.10.2009, 10:51  [ТС] 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
int kol=0;
int p=0;
int v=0;
int k=0;
int i=0;
int res,res1;
class gaz{
  char nazv[20];
  int str, tir;
  char opis[40];
public:
void WriteFile()    \\как бы здесь будет производится открытие входных файлов, и создание выходного файла, и копирование из входных в выходной файл
{
        FILE *fi_1,*fi_2,*fo;
         clrscr();
         if ((fi_1=fopen("D:\\file_1.txt", "r"))==0){
          cout << "Error open input file!!!" ;
          return;}
         if ((fi_2=fopen("D:\\file_2.txt", "r"))==0){
          cout << "Error open input file!!!" ;
          return;}
         if ((fo=fopen("D:\\out.dat","w+b"))==0){
          cout << "Error open output file!!!";
          return;}
 
        fclose(fi_1);
        fclose(fi_2);
        fclose(fo);
        return;
}
 
void out()              \\здесь обработка скопированного в выходной файл
{
        FILE *fo;
        clrscr();
        if ((fo=fopen("D:\\out.dat","rb"))==0){
          cout << "Error open output file!!!";
          return ;}
        int i;
        cout<<"Input number of Zapisi ";
        cin >>i;
        if (i>kol) {
          cout << "Zapisi net!!!";
          return;}
        fseek(fo,sizeof(gaz)*(i-1),SEEK_SET);
        fread(this,sizeof(gaz),1,fo);
        cout << "Nazvanie: " << nazv << " str.: " << str << " tir: " << tir << endl;
        fclose(fo);
}
 
void ClearFile()  \\здесь очистка выходного файла перед новым запуском программы
{
        FILE *fo;
        clrscr();
        if ((fo=fopen("D:\\out.dat","wb"))==0){
        cout << "Error open output file!!!"<<endl;
          return ;}
        fclose(fo);
}
Кто как думает может лучше, разбить первую процедуру на более легкие??
И вот еще одну вещь никак не могу понять, как ограничить чтобы прога нашла первую строку первого файла(т.е. чтобы она остановилась и перестала копаться в этом файле, переключилась на второй)

Добавлено через 35 минут
Цитата Сообщение от M128K145 Посмотреть сообщение
kandrey58region, сбрось весь код в один файл(только правильно) и будет у тебя все работать

M128K145, попробовал работает, но все дело в том что там вроде методом Объектно-Ориентированного Программирования выполнено, а мне нужно в обычном виде, тем более в той проге я прост даже не могу понять и объяснить, что, как и где происходит

Так то даже приблизительно представляю что будет в обычном варианте программы, но я не понимаю как задать конец строки в первом файле чтобы в том момент когда она закончится он перешел к первой строке но уже второго файла
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
02.10.2009, 22:07 7
Автор, на тебе в самом обычном виде.
Поскольку ты не оговорил, что делать, если количество строк в файлах разно, я взял на себя смелость написать прогу для файлов с равным количеством строк.
Количество срок определяется по количеству символов следующей строки.
Чтобы они были равными, ты сам должен позаботиться.

В файлах не допускается наличие символа конца строки (предполагается, что файлы текстовые,
следовательно, созданы в текстовом редакторе, а не в HIEW, например, то есть не содержат
симолов конца строки.)

Результат смотри в файле fail3.cc
Привет!

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdio.h>
#include <iostream>
using namespace std;
 
//Это будет дубликат указателя на результирующую строку. ДОЛлжен быть
//ВИДЕН отовсюду
char* rez_strok_dubl;
 
 
 
//Два счётчика строк. Будем по строка проходить и эти счётчики изменять 
int ch_str_1= 0;
int ch_str_2= 0;
 
//это вот будет длины первой и второй строк, куда мы будем запихивать файлы
int lenf1;
int lenf2;
 
 
//+++++++++++++++++++++++++++++++++++ФУНКЦИЯ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 //Эта функция будет принимать указатель на строку и копировать
 //Смотреть, не является ли последний символ знаком препинания.
 //Есля является, тогда  ничего из этой строки скопировано не будет
 //Если не является, а допустим, там слово, то указатель устанавливается на
 //начало этого слова и происходит копирование этого слова. Всё! 
 //А ЕЩЁ В ЭТОЙ ФУНКЦИИ СЧИТАЕТСЯ, СКОЛЬКО СИМВОЛОВ пройдено в строке (НЕ результирующей!)...
 //для этого нужен второй параметр
 //А от третьего параметра толк будет только при рассмотре первой строки
 //Но он тоже нужен
void func (char* uk, int* ch_str, char* stroka, int len) {
 
  //Ищем конец строки или конец файла
  while (*uk!= 10 && *ch_str< len-1) {
   uk++;
   (*ch_str)++;
  }
  //Теперь смотрим, не знак ли препинания ПРЕДЫДУЩИЙ СИМВОЛ
  if (!ispunct (*(uk- 1))) {
   
   //зНАЧИТ, это какое-то слово. Найдём его начало.
   do {
    uk--;
    (*ch_str)--;
   }
   while (!ispunct(*uk)&& *uk!= 10 && uk!=stroka);
   if (uk!=stroka) {
    uk++;
    (* ch_str)++;
   }
   //Можно использовать библиотечную функцию, но мы лучше побайтно будем копировать.
   //Тем более, что нам важно установить uk на начало следующей строки
 
   while (*uk!= 10&&(*ch_str < len- 1)) {
    *rez_strok_dubl++= *uk++;
    (*ch_str)++;
   }
   *rez_strok_dubl++= *uk++;
  }
 
  uk++;
  (*ch_str)++;
  //Теперь uk указывает на начало новой строки, а rez_strok_dubl на 
  //туда, куда копировать будем, если что
 
 
 }
 
 
 
 
 
 
 
 
int main(){
 
 //Первое, что мы сделаем это скопируем файлы в память
 //Для этого найдём их размеры
 //Но сначала откроем их для чтения
 FILE* f1, *f2;
 if (!(f1= fopen ("fail1.cc", "rb"))) {
  cout<< "fail1_ne_otkrit\n";
  system ("PAUSE");
  exit (1);
 }
 
 
 if (!(f2= fopen ("fail2.cc", "rb"))) {
  cout<< "fail2_ne_otkrit\n";
  system ("PAUSE");
  exit (1);
 }
 
 
 //Теперь размеры
 fseek (f1, 0, SEEK_END);
 lenf1= ftell(f1);
 
 fseek (f2, 0, SEEK_END);
 lenf2= ftell(f2);
 
 //Теперь выделим в памяти место под эти файлы и их туда скопируем
 //указетли на начала строк
 char* stroka_1= (char*) malloc (lenf1) ;
 char* stroka_2= (char*) malloc (lenf2) ;
 
 fseek (f1, 0, SEEK_SET);
 fseek (f2, 0, SEEK_SET);
 
 fread (stroka_1, lenf1, 1, f1);
 fread (stroka_2, lenf2, 1, f2);
 
 
 fclose (f1);
 fclose (f2);
 
 
 //Выделим также память под третью строку. Туда будем записывать результат
 char* rez_strok= (char*) malloc (lenf1+ lenf2) ;
 //Кто ег знает, может, там вообще не будет знаков препинания, в этих строках...
 
 //Продублируем на всякий случай
 rez_strok_dubl= rez_strok;
 
 
 
 
 while (ch_str_2< lenf2) {
 
  func (&stroka_1[ch_str_1], &ch_str_1, stroka_1, lenf1); 
  func (&stroka_2[ch_str_2], &ch_str_2, stroka_2, lenf2); 
 }
 
 
 //Запихаем результат в текстовый файл-результат
 FILE* f3;
 if (!(f3= fopen ("fail3.cc", "wb"))) {
  cout<< "fail3_ne_otkrit\n";
  system ("PAUSE");
  exit (1);
 }
 
 int i= 0;
 while (&rez_strok [i]!= rez_strok_dubl)
  fputc ((unsigned char)rez_strok [i++], f3);
 
 fclose (f3);
 
 
 return 0;
}

Это тексты исходных файлов. Переходы на пустую строку очень важны, поскольку их количество и
определяет количество строк в ТЕКСТОВОМ файле. Тестирование ими прошло успешно.

fail1.cc
C++
1
2
3
4
5
6
1
 
 
22
333
44.4.4
fail2.cc
C++
1
2
3
4
5
5555..5
666666
7..777777
 
.
1
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
03.10.2009, 16:23  [ТС] 8
kravam, спасибо за помощь!!!
На твоих файлах вроде все работает, но щас попробовал вот на этих файлах, т.е. файлы с обычным текстом созданные в блокноте формата .txt
file_1.txt
C++
1
2
3
4
5
6
Сперва старинная рукопись использовалась для ведения бухгалтерии, но, 
с развитием пергамента в III веке н. э., постепенно начала вытеснять папирусы. 
Это происходило уже в христианском мире. Причин принятия рукописи как основного вида книг 
несколько: она экономична, поскольку можно использовать обе стороны листа; ее легко спрятать; 
она была удобна и доступна. Возможно, христианские авторы использовали рукописи нарочно, чтобы они не были 
похожи на языческие тексты, которые обычно писались в форме свитков.
file_2.txt
C++
1
2
3
4
5
6
7
В начале XIV века, в Западной Европе появилась ксилография (она была разработана 
задолго до этого на Востоке). В ксилографии матрица с изображением страницы 
вырезалась из куска древесины. Её можно было окунуть в чернила и 
использовать, чтобы сделать несколько копий страницы. Книги, так же, как игральные 
карты и религиозные изображения, начали производить ксилографией. Но создание книги было 
кропотливым процессом, так как для каждой страницы нужно было делать свою резьбу. Кроме того, 
дерево было недолговечно — оно легко стиралось и трескалось.
А результат получается вот такой

file_3.txt
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
а 
 
ы 
г 
 
 
 
 
 
 
ь.
Добавлено через 14 минут
а должно было получиться вот что

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Сперва старинная рукопись использовалась для ведения
В начале XIV в Западной Европе появилась ксилография (она была разработана 
с развитием пергамента в III веке постепенно начала вытеснять 
задолго до этого на В ксилографии матрица с изображением страницы 
Это происходило уже в христианском Причин принятия рукописи как основного вида книг 
вырезалась из куска Её можно было окунуть в чернила и
 она поскольку можно использовать обе стороны ее легко 
 чтобы сделать несколько копий так как игральные 
она была удобна и христианские авторы использовали рукописи чтобы они не были 
карты и религиозные начали производить Но создание книги было 
похожи на языческие которые обычно писались в форме
кропотливым  так как для каждой страницы нужно было делать свою  Кроме  
 
дерево было недолговечно  оно легко стиралось и
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
03.10.2009, 18:22 9
Ничё не выйдет.
Во-первых, это русский текст, а не английский. Но дело даже не в этом.
Это бы я исправил, написав свою реализацию функции ispunct (используемая мной 99 % считает за знак пунктуации русские символы).

Главное, вот что. Вот задание:

"Написать программу на языке C++ чересстрочного слияния (т.е. первая строка в выходном файле - это первая строка из первого файла, вторая строка в выходном файле - это первая строка из второго файла, третья строка в выходном файле - вторая строка из первого файла и т.д.) двух текстовых файлов с удалением в каждой строке слов после которых стоит любой знак препинания."

Возьмём первую строку первого файла
"Сперва старинная рукопись использовалась для ведения бухгалтерии, но,"
После каких слов в строке стоят знаки препинания?
Правильно, после всех слов. Вот я все слова и удалял. Всё верно.
с удалением в каждой строке слов после которых стоит
любой знак препинания."
1
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
03.10.2009, 19:28  [ТС] 10
Цитата Сообщение от kravam Посмотреть сообщение
Ничё не выйдет.
Во-первых, это русский текст, а не английский. Но дело даже не в этом.
Это бы я исправил, написав свою реализацию функции ispunct (используемая мной 99 % считает за знак пунктуации русские символы).

Главное, вот что. Вот задание:

"Написать программу на языке C++ чересстрочного слияния (т.е. первая строка в выходном файле - это первая строка из первого файла, вторая строка в выходном файле - это первая строка из второго файла, третья строка в выходном файле - вторая строка из первого файла и т.д.) двух текстовых файлов с удалением в каждой строке слов после которых стоит любой знак препинания."

Возьмём первую строку первого файла
"Сперва старинная рукопись использовалась для ведения бухгалтерии, но,"
После каких слов в строке стоят знаки препинания?
Правильно, после всех слов. Вот я все слова и удалял. Всё верно.
с удалением в каждой строке слов после которых стоит
любой знак препинания."
Если честно я не очень понял вас, ведь знак препинания стоит после слов "бухгалтерии," и "но,"

Добавлено через 12 минут
kravam, извини с файлами на русском языке я чтото натупил...
вот с файлами на английском языке

file_1.txt
C++
1
2
3
4
5
6
First codex was used for accounting, but 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
similar to the pagan texts, which are usually written in the form of scrolls.
file_2.txt
C++
1
2
3
4
5
6
7
At the beginning of XIV century in Western Europe appeared woodcutting (it was developed 
long before the East). In the matrix of woodcuts depicting Pages 
cut from a piece of wood. It can be dipped in ink and 
used to make multiple copies of a page. Books, as well as playing 
cards and religious pictures, began to produce woodcuts. But the creation of the book was 
laborious process, since each page had to do his carving. Besides, 
tree was short-lived - it is easy to wash and crack.
вот что получилось
file_3.txt
C++
1
2
3
4
5
6
7
8
9
10
11
12
 but 
it was developed 
 
 In the matrix of woodcuts depicting Pages 
 The reasons for the adoption of the manuscript as the main type of books 
 It can be dipped in ink and 
 
 as well as playing 
 that they were not 
 But the creation of the book was 
 which are usually written in the form of [COLOR="#ff0000"]scrolls. [/COLOR]
 it is easy to wash and [COLOR="#ff0000"]crack.[/COLOR]
но я только не смог понять почему же, если встречается знак препинания, прога удаляет все что встретилось ранее??
а в двух последних предложениях остались точки...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
03.10.2009, 20:28 11
Раз такое дело, слушай.
прога удаляет все что встретилось ранее потому, что так было заявлено в условии. Удалить все слова, после которых встретился знак препинания.
Это понимается однозначно.
Если в строке есть слово, после которого стоит знак препинания, оно удаляется. Всё.

То есть я понимаю, что ты имел ввиду несколько другое. Нужно было удалять слова, за которыми НЕПОСРЕДСТВЕННО стоит знак препинания. Тебе вопрос- а почему ты сразу не уточнил, введя кроме понятий "до" и "после" (какими, по умолчанию и исчерпывается описание взаиморасположений слова и знака препинания в строке) понятие "непосредственно после"?
Впредь будь внимательнее. И давай к этом вопросу больше не возвращаться.

...А то знаешь, некоторый дядька оперирует термином слово... А в программёрском мире слово вообще означает другое. Что это? Последовательность печатаемых симолов? А каких? +++ слово? Вот так то. Ну и так далее. Да ладно бы это- посмотри темы. Устанешь возиться, клещами слова вытягивать из разных там... Ну, вот, а не повезло тебе в результате.
Попробуй сам с исходгником повозись или покажи кому-нибудь.

По поводу руссого текста- мне просто надо было вначале либо оговорить ограниченность применения кода, либо разбираться с русским текстом. Я запарился, не сделал ни того ни другого.

...А прога работает очень даже предсказуемо.

Ибо твоя задача- сделать в файлах равное количество строк. (Иначе выведется не поймёшь что).
Количество строк это количество ПЕРЕВОДОВ НА НОВУЮ СТРОКУ (я это оговорил!).
А оно у тебя разное. В одном файле я вижу 6, а в другом 7.
Так что исправляй и получай запрограммированный вывод.
Хотя я понимаю, тебе такой вывод даром не нужен. Ну, извини уж.
1
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
08.10.2009, 12:25  [ТС] 12
Цитата Сообщение от kravam Посмотреть сообщение
То есть я понимаю, что ты имел ввиду несколько другое. Нужно было удалять слова, за которыми НЕПОСРЕДСТВЕННО стоит знак препинания. Тебе вопрос- а почему ты сразу не уточнил, введя кроме понятий "до" и "после" (какими, по умолчанию и исчерпывается описание взаиморасположений слова и знака препинания в строке) понятие "непосредственно после"?
Впредь будь внимательнее. И давай к этом вопросу больше не возвращаться.
kravam, насчет этого извини я не прав, все дело оказалось в том, что препод напечатал в задании "слов", а не "слова"


Цитата Сообщение от kravam Посмотреть сообщение
Ибо твоя задача- сделать в файлах равное количество строк. (Иначе выведется не поймёшь что).
Количество строк это количество ПЕРЕВОДОВ НА НОВУЮ СТРОКУ (я это оговорил!).
А оно у тебя разное. В одном файле я вижу 6, а в другом 7.
Так что исправляй и получай запрограммированный вывод.
Хотя я понимаю, тебе такой вывод даром не нужен. Ну, извини уж.
Со строками у меня было три примера кода, которые выполняли слияние только с равнострочными файлами...
Но не тут было преподу резко захотелось, чтобы теперь прога делала таким образом, например, в первом файле 5 строк, во втором файле 11 строк...
Третий выходной файл получается из 10 строк (5 из первого и 5 из второго файлов), а остальные 6 строк из второго файла просто копируются без всякого переноса на другую строку...
Пока не очень понял, что все же править нужно, можешь сказать, реально ли этот код под эти условия подогнать??
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
08.10.2009, 13:34 13
Конечно, всё можно. Он на то и исходник, чтобы в нём всё можно было править.
Начнём с лёгкого. Пусть у тебя 2 ТЕКСТОВЫХ файла с разным количеством строк. А это значит, что количество строк считается по символам перевода на другую строку /n

Ну... самое простое, что тебе надо сделать, это написать такой код:

1) подсчитываешь количество строк в каждом файле fail1.txt и fail2.txt
2) выбираешь файл который больше. Допустим, в файле fail2.txt больше. (В файле fail1.txt допустим, 4 строки, а в файле fail2.txt 11 строк)
3) Разбиваешь файл fail2.txt на 2 текстовых файла. fail2a.txt и fail2b.txt Причём! В fail2a.txt должно быть тоже 4 строки, а в файле fail2b.txt 7 (потому, что 4+ 7== 11)

Вот имеем два текстовых файла fail1.txt и fail2a.txt с равным количеством строк.
Теперь к ним можно применить мою прогу. Получаешь файл на выходе. И прибавляешь к нему файл fail2b.txt. Вот пока это делай.
0
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
08.10.2009, 14:00  [ТС] 14
Цитата Сообщение от kravam Посмотреть сообщение
Конечно, всё можно. Он на то и исходник, чтобы в нём всё можно было править.
Начнём с лёгкого. Пусть у тебя 2 ТЕКСТОВЫХ файла с разным количеством строк. А это значит, что количество строк считается по символам перевода на другую строку /n

Ну... самое простое, что тебе надо сделать, это написать такой код:

1) подсчитываешь количество строк в каждом файле fail1.txt и fail2.txt
2) выбираешь файл который больше. Допустим, в файле fail2.txt больше. (В файле fail1.txt допустим, 4 строки, а в файле fail2.txt 11 строк)
3) Разбиваешь файл fail2.txt на 2 текстовых файла. fail2a.txt и fail2b.txt Причём! В fail2a.txt должно быть тоже 4 строки, а в файле fail2b.txt 7 (потому, что 4+ 7== 11)

Вот имеем два текстовых файла fail1.txt и fail2a.txt с равным количеством строк.
Теперь к ним можно применить мою прогу. Получаешь файл на выходе. И прибавляешь к нему файл fail2b.txt. Вот пока это делай.
Мысль с разбиением файла была... Препод говорит нельзя, нужно только чтобы было два входных и один исходный файл, а это получается один первый файл и два вторых...
Вот я и думаю, реально вообще организовать так, что прога сначала выполняет слияние, потом раз в первом или во втором файле строки закончились... Она берет и копирует из того файла в котором остались строки, все остальные строки...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
08.10.2009, 14:13 15
Конечно, реально.
Тогда копируй файлы в память, образуя две большие-большие строки.
aaa\nkkk\nlklk\nyuyuyu\nghjhj\n
qq\nuuiuiu\njkjk\njkjjk\njkjkk\njkjkjkj\njkjkk\n

А потом их сливаешь и попутно смотришь, в какой строке закончатся символы\n. Когда закончатся- сливание прекращаешь (в первой строке 5 символов \n, а во второй 7 Значит, первая закончится, а вторая ещё нет), дописываешь оставшиеся символы из ДРУГОЙ СТРОКИ и получаешь огромную строку-результат и выполняешь обработку огромной получившейся строки. Удаляешь из неё что тебе надо. Вот так просто и незатейливо.
0
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
08.10.2009, 14:53  [ТС] 16
не чтото вообще мне непонятно, что ты написал...
Попробовал вот так сделать...
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
#pragma hdrstop
#include <tchar.h> 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#pragma argsused
int main()
{
 FILE *f1=fopen("D:\\work\\file_1.txt","r");
 FILE *f2=fopen("D:\\work\\file_2.txt","r");
 FILE *o=fopen("D:\\work\\B.txt ","w+");
 char c,c2;
 while ((c!=EOF) || (c2!=EOF)){
  while ((c=fgetc(f1)) && ((c!='\n') && (c!=EOF))) {
    fputc(c,o);
    };
    fputc('\n',o);
  while ((c2=fgetc(f2)) && ((c2!='\n') && (c2!=EOF)))  {
    fputc(c2,o);
    }
    fputc('\n',o);
 }
 fclose(f1);
 fclose(f2);
 fclose(o);
    return 0;
}
в данном случае получается вот так
file_1.txt
C++
1
2
3
4
5
6
First codex was used for accounting, but 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
similar to the pagan texts, which are usually written in the form of scrolls.
file_2.txt
C++
1
2
3
4
5
6
7
8
9
10
11
12
At the beginning of XIV century in Western Europe appeared woodcutting (it was developed 
long before the East). In the matrix of woodcuts depicting Pages 
cut from a piece of wood. It can be dipped in ink and 
used to make multiple copies of a page. Books, as well as playing 
cards and religious pictures, began to produce woodcuts. But the creation of the book was 
laborious process, since each page had to do his carving. Besides,
First codex was used for accounting, but 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
similar to the pagan texts, which are usually written in the form of scrolls.
b.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
First codex was used for accounting, but 
At the beginning of XIV century in Western Europe appeared woodcutting (it was developed 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
long before the East). In the matrix of woodcuts depicting Pages 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
cut from a piece of wood. It can be dipped in ink and 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
used to make multiple copies of a page. Books, as well as playing 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
cards and religious pictures, began to produce woodcuts. But the creation of the book was 
similar to the pagan texts, which are usually written in the form of scrolls.
laborious process, since each page had to do his carving. Besides,
 
First codex was used for accounting, but 
 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
 
similar to the pagan texts, which are usually written in the form of scrolls.
Вот думаю реально ли в оба while впихнуть чтото наподобее
C++
1
if c==' ' return;
или вот не пробел, а как бы тогда обозначить что файл закончился?
ну или может не return чтобы он к этому while уже не обращался...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
08.10.2009, 15:15 17
Вариантов много может быть. Например, так:
C++
1
2
if (c!=EOF)
 fputc('\n',o);
Добавлено через 2 минуты
Дальше
C++
1
((c=fgetc(f1)) && ((c!='\n') && (c!=EOF)))
Я не уверен, что сперва считается символ, а потом переменная "с" будет учавствовать в выражении. Если ты уверен в обратном, значит, ты знаешь. Я бы ещё проверил.
0
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
08.10.2009, 20:56  [ТС] 18
ну вроде бы почти работает...
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
#pragma hdrstop
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#pragma argsused
int main()
{
 FILE *f1=fopen("D:\\work\\file_1.txt","r");
 FILE *f2=fopen("D:\\work\\file_2.txt","r");
 FILE *o=fopen("D:\\work\\B.txt ","w+");
 char c,c2;
 while ((c!=EOF) || (c2!=EOF)){
  while ((c=fgetc(f1)) && ((c!='\n') && (c!=EOF))) {
    fputc(c,o);
    };
    if (c!=EOF) fputc('\n',o);
  while ((c2=fgetc(f2)) && ((c2!='\n') && (c2!=EOF)))  {
    fputc(c2,o);
    }
    if (c2!=EOF) fputc('\n',o);
  }
 fclose(f1);
 fclose(f2);
 fclose(o);
    return 0;
}
file_1.txt
C++
1
2
3
4
5
6
First codex was used for accounting, but 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
similar to the pagan texts, which are usually written in the form of scrolls.
file_2.txt
C++
1
2
3
4
5
6
7
8
9
10
11
At the beginning of XIV century in Western Europe appeared woodcutting (it was developed 
long before the East). In the matrix of woodcuts depicting Pages 
cut from a piece of wood. It can be dipped in ink and 
used to make multiple copies of a page. Books, as well as playing 
cards and religious pictures, began to produce woodcuts. But the creation of the book was 
laborious process, since each page had to do his carving. Besides,
Above you can view the video clip, which was added by our users. You can view it directly
 on our site, or download it to your computer and transfer it to the usual format. 
Avi (DivX) with the help of the program YouTube Downloader. You can download it here. Use 
it to convert video to normal video file, which you can enjoy with friends at any moment, 
even if you're somewhere on a picnic at the weekend.
B.txt
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
First codex was used for accounting, but 
At the beginning of XIV century in Western Europe appeared woodcutting (it was developed 
with the development of parchment in the III century BC. e., gradually began to displace the papyri. 
long before the East). In the matrix of woodcuts depicting Pages 
This is already happening in the Christian world. The reasons for the adoption of the manuscript as the main type of books 
cut from a piece of wood. It can be dipped in ink and 
several: it is economical because you can use both sides of the paper, it is easy to hide; 
used to make multiple copies of a page. Books, as well as playing 
It was convenient and accessible. Perhaps the Christian writers used the original purpose, that they were not 
cards and religious pictures, began to produce woodcuts. But the creation of the book was 
similar to the pagan texts, which are usually written in the form of scrolls.laborious process, since each page had to do his carving. Besides,
Above you can view the video clip, which was added by our users. You can view it directly
 on our site, or download it to your computer and transfer it to the usual format. 
Avi (DivX) with the help of the program YouTube Downloader. You can download it here. Use 
it to convert video to normal video file, which you can enjoy with friends at any moment, 
even if you're somewhere on a picnic at the weekend.
только вот место где закончился первый файл, т.е. последняя строчка первого и последняя строчка второго файлов, слились...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
08.10.2009, 22:06 19
Это не страшно. Нам нужно, чтобы когда файл закончится, написалось \n То есть если
c==EOF пусть пишется перевод на другую строку. Но только один раз, а потом прога
пусть игнорирует эту инструкцию.
Для этого введём переменную-семафор и инициализируем её false.
Теперь ты делай присвоение c= \n только если семафор равен false.

Как только с станет равной EOF, ПОСЛЕДНИЙ РАЗ ПРИСВАИВАЙ "с" значение \n и СРАЗУ ЖЕ
присваивай семафору значение true

Всё, теперь уже переменной с значение \n не присвоится, поскольку семафор равен true
А мы написали, что присваиваем c==\n только если он false
1
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
09.10.2009, 14:02  [ТС] 20
Цитата Сообщение от kravam Посмотреть сообщение
Это не страшно. Нам нужно, чтобы когда файл закончится, написалось \n То есть если
c==EOF пусть пишется перевод на другую строку. Но только один раз, а потом прога
пусть игнорирует эту инструкцию.
Для этого введём переменную-семафор и инициализируем её false.
Теперь ты делай присвоение c= \n только если семафор равен false.

Как только с станет равной EOF, ПОСЛЕДНИЙ РАЗ ПРИСВАИВАЙ "с" значение \n и СРАЗУ ЖЕ
присваивай семафору значение true

Всё, теперь уже переменной с значение \n не присвоится, поскольку семафор равен true
А мы написали, что присваиваем c==\n только если он false
Если я правильно понял то нужно
C++
1
2
3
4
5
bool h;
...
if (c=='\n' || c==EOF) { c='\n'; h=true;}
...
if (c2=='\n' || c2==eof) { c2='\n'; h=true;}
0
09.10.2009, 14:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2009, 14:02
Помогаю со студенческими работами здесь

Слияние массивов на с++
Добродень всем.задача такая:массив структур размера N(в моем случае 100).разбить на ленты.т.о...

слияние списков
помогите с написание программы!!! нужно написать программу которая объединяет два упорядоченных...

Слияние массивов
Есть задача: Описать функцию, которая выполнит слияние двух массивов одинаковой длины в третьем...

Слияние деревьев
Сижу, мучаюсь, не могу понять что подразумевается в задании о слиянии деревьев. Подвесить вершину...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru