Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конкатинация 2 текстовых файлов, Как соединить воедино 2 файла 
V
    Опции темы
RDC
Дата 2.6.2008, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Как наиболее оптимально соединить несколько текстовых файлов в один?
--------------------
Живопись
PM MAIL   Вверх
mrbrooks
Дата 2.6.2008, 07:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Я бы их соединил используя TStringList.
PM MAIL   Вверх
rrrFer
Дата 2.6.2008, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



RDC, 
Цитата

наиболее оптимально

я думаю просто дописать один файл в конец другого
PM MAIL WWW ICQ   Вверх
mrbrooks
Дата 2.6.2008, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Поясню. Допустим у тебя есть файл 1.txt и 2.txt. Тебе их надо сложить скажем в 3.txt

Код

TStringList *list1 = new TStringList();
TStringList *list2 = new TStringList();
list1->LoadFromFile("1.txt");
list2->LoadFromFile("2.txt");
list1->AddStrings(list2);
list1->SaveToFile("3.txt");
delete list1;
delete list2;


Вот такой шаблон. Конечно есть смысл ввести проверку на наличие файлов или отловить исключение. Так же можешь отсортировать содержимое файлов в алфавитном порядке и т.д. Дерзай имхо  smile 
PM MAIL   Вверх
Lazin
Дата 2.6.2008, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Цитата(mrbrooks @  2.6.2008,  07:43 Найти цитируемый пост)
Я бы их соединил используя TStringList. 

этом случае придется загрузить оба файла в память, а если они большие? 
намного проще создать новый файл - 3.тхт, открыть его для записи, файл 1.тхт открыть для чтения, читать его построчно(или блоками) и записывать то что прочитали в 3.тхт, потом открыть 2.тхт и сделать с ним то-же что и с 1.тхт
после каждой записи, файловый указатель будет смещаться в конец файла, так что новая порция данных будет дописываться в конец файла


PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 2.6.2008, 08:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Lazin @ 2.6.2008,  08:11)
этом случае придется загрузить оба файла в память, а если они большие? 

Об этом автор умалчивает. Если большие то конечно данный метод не совсем резонен. Тогда смысл вообще создавать 3 - й файл, можно открыть первый на запись а со второго добовлять в него. На самом деле если речь идет о дохленькой тачке то вопросов нет. Но раз чек обратился к Борману то есть смысл использовать VCL  smile  иначе тогда в общие вопросы.

Это сообщение отредактировал(а) mrbrooks - 2.6.2008, 08:20
PM MAIL   Вверх
rrrFer
Дата 2.6.2008, 08:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



rrrFer, 
Код

#include <iostream>
using namespace std;
void main(){
    system("cd /d C:  && copy 1.txt+2.txt 3.txt ");
}

PM MAIL WWW ICQ   Вверх
mrbrooks
Дата 2.6.2008, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(rrrFer @ 2.6.2008,  08:30)
rrrFer, 
Код

#include <iostream>
using namespace std;
void main(){
    system("cd /d C:  && copy 1.txt+2.txt 3.txt ");
}

эротично. хм. если речь конечно идет о консоле.
PM MAIL   Вверх
RDC
Дата 2.6.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Спасибо всем за ответы. Оба варианта я пробовал. Первый плох тем что медленный, а второй плох тем что в случае ошибок, например отсутствия файлов или ещё что нибудь, плохо отлавливать ошибки. Может ещё что нибудь предложите? 
--------------------
Живопись
PM MAIL   Вверх
chaos
Дата 2.6.2008, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 1
Всего: 44



на мой взгляд самый правельный вариант: используй файлы отображаемые в память!!!

Добавлено @ 09:11
пример превести не могу - сижу под линухом.
но думаю сложностей не будет

ЗЫ если чо спрашивай по поводу файлов отображаемых в память

Добавлено @ 09:14
можно smile если есть жлание использовать cmd'шные команды smile
например 
Код

cat f1>f && cat f2>>f


ЗЫ ой, не заметил что консоль уже предлагали smile

Это сообщение отредактировал(а) chaos - 2.6.2008, 09:17
PM WWW   Вверх
rrrFer
Дата 2.6.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: нет
Всего: 1



RDC, 
Код

#include <iostream>
using namespace std;
void alarm(char name[]){
    cout<<"cannot open file "<<name<<endl;
    system("pause");abort();
}
void main(){
    FILE *in=fopen("C:\\1.txt","r");
    if(!in)
        alarm("1.txt");
    fclose(in); in=fopen("C:\\2.txt","r");
    if(!in)
        alarm("2.txt");
    system("cd /d C:  && copy 1.txt+2.txt 3.txt ");
    fcloseall();
}

а чем тебя не устраивает дописать один файл к другому? Можно ведь по строчкам переписать сразу...наверно достаточно бысто будет.
или так:
Код

#include <iostream>
#include <fstream>
using namespace std;
void alarm(char name[]){
    cout<<"cannot open file "<<name<<endl;
    system("pause");
    fcloseall();
}
int main(){
    system("cd /d C: && erase err.txt /q");
    system("dir C:\ /b | find \"1.txt\" >> C:\err.txt");
    ifstream f("C:\\err.txt");f.get();
    if(f.eof()){
        alarm("1.txt");
        return 1;
    }
    fcloseall();
    system("cd /d C: && erase err.txt /q");
    system("dir C:\ /b | find \"2.txt\" >> C:\err.txt");f.get();
    if(f.eof()){
        alarm("2.txt");
        return 1;
    }
    system("cd /d C:  && copy 1.txt+2.txt 3.txt ");
    fcloseall();
}


Это сообщение отредактировал(а) rrrFer - 2.6.2008, 10:24
PM MAIL WWW ICQ   Вверх
586
Дата 2.6.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Самый оптимальный - с помощью функций CreateFile, ReadFile и WriteFile.
PM   Вверх
RDC
Дата 2.6.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



586, согласен с Вами. Щас буду реализовывать. Потом код выложу.
--------------------
Живопись
PM MAIL   Вверх
586
Дата 2.6.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Правда, может быть проблема, что текстовые файлы будут с разной кодировкой (например, символ перевода строки будет не CRLF а LF). Тогда нужно использовать функции из стандартной библиотеки - fopen и т.п. открывая файл в текстовом режиме. По умолчанию fopen открывает файл в текстовом режиме.

Это сообщение отредактировал(а) 586 - 2.6.2008, 22:19
PM   Вверх
jonie
Дата 3.6.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



жестоко. неучитывая то что сказал 586 решается это например так (быстрее чем с текстом возиться):
Код

    ifstream in("C:\\1.txt",ios::binary|ios::in);
    ofstream out("C:\\2.txt", ios::app|ios::binary);
    out<<in.rdbuf();

только я неособо вкурсе насчет размера in файла... нада почитать стандарт)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.