Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чересстрочное слияние


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

Вот попытался сделать первую процедуру, которая сливает информацию из двух файлов один
Подскажите пожалуйста, все ли здесь праивльно
Код

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;
}

Автор: zim22 1.10.2009, 15:17
Цитата(pdiman58 @  1.10.2009,  12:32 Найти цитируемый пост)
Подскажите пожалуйста, все ли здесь праивльно

а сам не можешь проверить? напиши юнит-тесты smile

Автор: andrew_121 1.10.2009, 18:22
Цитата(zim22 @  1.10.2009,  15:17 Найти цитируемый пост)
напиши юнит-тесты

 smile 

Проще еще такую-же кучку кода написать smile 

Автор: GoldFinch 1.10.2009, 18:40
лучше выкинуть код, и переписать его по-новой
например как-то так
Код

using namespace std;
ifstream src1("file1");
ifstream src2("file2");
ofstream dst("dstfile");
while( src1 && src2 )
{
   string ln1; getline(src1,ln1);
   string ln2; getline(src2,ln2);
   dst<<ln1<<'\n'<<ln2<<'\n';
}
if( src1 )
   dst<<src1.rdbuf();
if( src2 )
   dst<<src2.rdbuf();

Автор: xvr 2.10.2009, 10:25
Цитата(pdiman58 @ 1.10.2009,  12:32)
Появилось вот такое задание по C++:
Написать программу на языке C++ чересстрочного слияния 

Вот попытался сделать первую процедуру, которая сливает информацию из двух файлов один
Подскажите пожалуйста, все ли здесь праивльно

В 'первой' (и весьма буйной) процедуре не замечено НИ ОДНОЙ функции для чтения/записи файлов. Поэтому совершенно непонятно, каким образом она их читает и пишет (видимо телепатически)
Так же имеет место быть МАССА неописанных переменных (и даже неизвестный тип stroka)
Компилятору это не понравится  smile 
Так же имеется работа с неинициализированными указателями - это уже не понравится ОС  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)