Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2009, 11:39   #1
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию Чересстрочное слияние двух файлов в один

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

Возник вот такой вопрос, хотелось бы для начала организовать программу вот по такому принципу
Код:
#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 ";
               
                fclose(fo);
}
 
void ClearFile()  \\здесь очистка выходного файла перед новым запуском программы
{
                FILE *fo;
                clrscr();
                if ((fo=fopen("D:\\out.dat","wb"))==0){
                cout << "Error open output file!!!"<<endl;
                  return ;}
                fclose(fo);
}
Кто как считает, может лучше первую процедуру разбить еще на процедуры для пошагового выполнения??

И вот не понимаю одну суть, может какая функция есть чтобы узрила в обычном текстовом файле .txt, что осуществлен переход на другую строку, и перешла ко второму файлу??
Каким образом можно описать в коде что если строка закончилась, то копируй ее и переходи ко второму файлу??
hen вне форума Ответить с цитированием
Старый 01.10.2009, 12:59   #2
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию

Вот попытался сделать первую процедуру, которая сливает информацию из двух файлов один
Подскажите пожалуйста, все ли здесь праивльно
Код:
class gaz{
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;}
		  int v=m*2;
		slifile = new char*[m+1];
		for(int i=0; i<m+1; i++){
				slifile[i] = new char[m+1];
		}
		int i, max, j, l;
		cout << "w\n";
		for (int i = 1; i <(n1+1); i++) {
		  cout<<mass1[i];
		  cout<<"\n";}
		for (int j = 1; j < (n2+1); j++){
		 cout<<mass2[j];
		 cout<<"\n";
				}
		cout << "ssdfrt";
		int cnt1 = n1;
		int cnt2 = n2;
		cout << endl << cnt1 << endl;
		cout << cnt2 << endl;
		stroka cnt;
		max = (cnt1 > cnt2) ? cnt1 : cnt2;
		slifile = new char*[cnt1 + cnt2];
		cout << "sdfwerewr\n";
		itoa(max*2,cnt,10);
		strcpy(slifile[0], cnt);
		cout << "\n max=" << max << "\n";
		if (cnt1 == cnt2) {
				cout << "* Fails odinakovoy dlini\n\n";
				for (int i = max, j = 1; i > 0; i--, j += 2) {
						if (i % 2 == 0) {
						} else {
			 strcpy(slifile[j],mass1[i]);
			 strcpy(slifile[j+1],mass2[i]);
						}
				}
		} else {
				if (cnt1 < cnt2) {
						cout << "* fi_1 < fi_2\n\n";
		 int i,l,j;
						for (i = max,l = 1, j = 1; i > 0; i--, l++, j += 2) {
								cout << "d1";
								if (l > cnt2) {
										strcpy(slifile[j], EMPTY_STR);
										cout << "d2";
								} else {
				 strcpy(slifile[j],mass1[i]);
										cout<<"d3";
								}
			cout<<"d4";
								strcpy(slifile[j + 1], mass1[i]);
								cout<<"";
						}
				} else {
						cout << "* fi_1 > fi_2\n\n";
						for (int i = max ,l = 1,j = 1; i > 0; i--, l++, j += 2) {
			strcpy(slifile[j],mass2[i]);
								if (l > cnt1)
										strcpy(slifile[j + 1], EMPTY_STR);
								else
			  strcpy(slifile[j+1],mass1[l]);
						}
				}
		}
		fclose(fi_1);
		fclose(fi_2);
		fclose(fo);
		return;
}
hen вне форума Ответить с цитированием
Старый 01.10.2009, 14:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если не уверен в своем коде, предлагаю такое:
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 FILE *f1=fopen("C:\\temp\\BatchParameters_14.31.30.xml ","r");
 FILE *f2=fopen("C:\\temp\\BatchParameters_14.31.34.xml ","r");
 FILE *o=fopen("C:\\temp\\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;
}
//---------------------------------------------------------------------------
Только тут без удаления
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.10.2009, 14:36   #4
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию

Объясни пожалуйста, что да как, в твоём варианте
Код:
//---------------------------------------------------------------------------

#pragma hdrstop       \\ ?

#include <tchar.h>     \\что это за библиотека?
#include <stdlib.h>
#include <stdio.h>
//---------------------------------------------------------------------------

#pragma argsused      \\??
int _tmain(int argc, _TCHAR* argv[])     \\вроде начало процедуры, но не понимаю что такое "_TCHAR* argv[]"  
{
 FILE *f1=fopen("C:\\temp\\BatchParameters_14.31.30.xml ","r");  \\BatchParameters_14.31.30.xml что это такое? мне прост надо файл .txt
 FILE *f2=fopen("C:\\temp\\BatchParameters_14.31.34.xml ","r");
 FILE *o=fopen("C:\\temp\\B.txt ","w+");
 char c,c2;
 while ((c!=EOF) || (c2!=EOF)){                    \\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;
}
//---------------------------------------------------------------------------
hen вне форума Ответить с цитированием
Старый 01.10.2009, 15:10   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
int _tmain(int argc, _TCHAR* argv[]) \\вроде начало процедуры, но не понимаю что такое "_TCHAR* argv[]"
Это в Си Буилдере Можешь смело писать int main()
Цитата:
BatchParameters_14.31.30.xml что это такое? мне прост надо файл .txt
Ну напищи туда путь к файлу txt
Это
Код:
 FILE *o=fopen("C:\\temp\\B.txt ","w+");
ФАйл куда будет писаться.
Цитата:
EOF что то припоминаю, но как то смутно, вроде какая то текстовая функция
Я б сказал константа. Если конец файла fgetc возвращает -1= EOF
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.10.2009, 15:15   #6
hen
Пользователь
 
Регистрация: 31.03.2009
Сообщений: 96
По умолчанию

Stilet, спасибо...

Кто-нибудь гляньте пожалуйста код в моём втором посте, хотелось бы знать где же я ошибся...
hen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние двух массивов в Delphi sauron99 Помощь студентам 17 03.04.2016 09:37
Слияние нескольких wav файлов lacost Мультимедиа в Delphi 1 30.09.2008 19:25
Копирование двух файлов в один JRcoker Общие вопросы Delphi 5 18.07.2008 21:37
Слияние двух текстовых файлов nataly_ukr Общие вопросы Delphi 5 26.12.2007 16:45
как выполнить один и тот же код для двух разных событий puz Общие вопросы Delphi 5 11.05.2007 19:03