Разбивка файла на два файла

Berserkus

Программа разбивает произвольный файл на части указанного размера, сохраняя части в файлах с новыми расширениями, например файл test.txt размером 18900 байт при заданном размере части в 10000 байт разбивается на файлы test.1 размером 10000 байт и test.2 размером 8900 байт . вот то что я сообразил:
AnsiString s="",j;
int i, i3, i2;
Memo1->Lines->LoadFromFile(Edit1->Text);
j=Edit4->Text;
i2=0;
for(i = 0; i < Memo1->Lines->Count; i++)
        {
         s=Memo1->Lines->Strings[i];
         for(int i3 = 0; i3 < s.Length(); i3++)
         Memo2->Lines->Add(s[i2]);
         i2++;
         if(i2>j)break;
        }
for(int i2 = 0; i2 < s.Length(); i2++)
Memo3->Lines->Add(s[i2]);
Но оно что-то не так делает.(
5 ответов

Berserkus

Твой подход приемлем, если текстовый файл нужно разбить по количеству символов. Если ты разбиваешь на байты, то загружай файл в TFileStream и работай с байтами, а не символами. Примеры работы с файловым потоком есть на форуме.


Berserkus

Мне нужно просто исправить этот код)Хотя вы и правы


Berserkus

Зачем тебе посимвольная обработка строк? Задачу можно решить проще, вот так:
for (int i = 0; i < (Form1->Memo1->Text.Length()/10000) + 1; i++)
{
    Form1->Memo2->Text = Form1->Memo1->Text.SubString(i*10000+1,10000);
    Form1->Memo2->Lines->SaveToFile("test." + IntToStr(i));
}


Berserkus

мне сказали делать так, и у меня почти получилось осталось ток сделать так, что после j символа, остальные символы записывались в мемо3
Memo2->Clear();
Memo3->Clear();
AnsiString s="",j;
int i2=0;
int i3=0;
j=Edit4->Text;
j=j-1;
for(int i = 0;i < Memo1->Lines->Count; i++)
        {
         s=Memo1->Lines->Strings[i];
       for(int i3 = 1; i3 <= s.Length(); i3++)
                Memo2->Lines->Add(s.SubString(i3,1));
                i2++;
         if(i2 > j)break;
        }
for(int i2 = 1; i2 <= s.Length(); i2++)
if(i2>j)
Memo3->Lines->Add(s.SubString(i2,1));
Помогите, плиз, реализовать, а то я на этом застрял


Berserkus

осталось ток сделать так, что после j символа, остальные символы записывались в мемо3
В таком случае вот:
Memo2->Clear();
Memo3->Clear();
AnsiString s;
int j,i2=0;
j=StrToInt(Edit4->Text);
 
for(int i = 0; i < Memo1->Lines->Count; i++)
{
        s=Memo1->Lines->Strings[i];
        for(int i3 = 1; i3 <= s.Length(); i3++)
        {
                i2++;
                if(i2 < j)
                {
                        Memo2->Lines->Add(s.SubString(i3,1));
                }
                else
                {
                        Memo3->Lines->Add(s.SubString(i3,1));
                }
        }
}
Если тебя устраивает символ перехода на новую строку(\r\n), который будет добавляться при каждом вызове Lines->Add. А если надо человеческое решение, то воспользуйся моим ответом выше.