С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Поиск с консоли http://www.cyberforum.ru/cpp-beginners/thread53422.html
вот решил прогу писать,которая ищет на компе все файлы с расширением doc,и все в них удаляет и добавляет звездочки...я только не знаю эту функцию поиска,помогите пожалуйста,надо найти все файлы,и...
C++ Насчёт функции memcpy() Начинаяю использовать эту функцию.Её синтаксис: void memcpy(void *to, const void *from, size_t count); Вопрос_1: Что такое size_t ? И вообще,зачем указателям тип воид? Они что,что-то... http://www.cyberforum.ru/cpp-beginners/thread53416.html
C++ Ввести три числа и проверить, возможно ли из них составить арифметическую прогрессию
ввести три числа и проверить возможно ли с них составить арифметическую прогрессию
Передача параметров по ссылке C++
У кого есть рабочий вариант сего чуда ? (К примеру,функции квадратного корня).В учебнике не работает.
C++ Присвоение типов в С++ http://www.cyberforum.ru/cpp-beginners/thread53379.html
Как присвоить елементам массива mas_a елементы строки String.Массив имеет тип int,а String char?
C++ Вопрос по выносу кода в отдельный файл Вот если писать в С программу, очень много когда можно запутаться ... Можно ли как то вынести часть кода в файл. (именно файл, база не нужна) Например если есть большой массив, можно ли его... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
02.10.2009, 22:07
Автор, на тебе в самом обычном виде.
Поскольку ты не оговорил, что делать, если количество строк в файлах разно, я взял на себя смелость написать прогу для файлов с равным количеством строк.
Количество срок определяется по количеству символов следующей строки.
Чтобы они были равными, ты сам должен позаботиться.

В файлах не допускается наличие символа конца строки (предполагается, что файлы текстовые,
следовательно, созданы в текстовом редакторе, а не в 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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.