500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
|
|
1 | |
копирование24.05.2011, 09:28. Показов 2287. Ответов 18
Метки нет (Все метки)
господа програмисты как скопировать информацию из одного .txt в другой?
Если можно посмотреть не большой,примитивный исходник. Заранее всем большое спасибо!!!
0
|
24.05.2011, 09:28 | |
Ответы с готовыми решениями:
18
копирование Копирование Конструктор копирование копирование файла |
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||||||||||||||||
24.05.2011, 09:33 | 2 | |||||||||||||||
2
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
||||||
24.05.2011, 14:09 | 4 | |||||
Еще вариант:
2
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
24.05.2011, 15:26 | 5 | |||||
Копировать из файла по одному символу - очень неэффективно.
2
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
24.05.2011, 16:34 | 6 |
Показанные мной варианты копируют как текстовые, ТАК И БИНАРНЫЕ ФАЙЛЫ. Более того, при открытии файла в режиме дозаписи эта же функция допишет в конец существующего файла.
Еще одно достоинство моих вариантов - ПРОСТОТА и краткость! Насчет неэффективности. Не забывайте, что ввод-вывод буферизован. Фактически на устройство запись осуществляет ОС, причем всего буфера сразу. А в прикладной проге осуществляется обмен с буфером. Так что в данном случае достоинства перевешивают недостатки, из которых указан только один - якобы неэффективность.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
24.05.2011, 17:33 | 7 |
Мой тоже. Ну и что?
Пример
Код
[nameless@desktop cpp]$ ls && make && ./sample sample sample2 && chmod -v u+x sample2 && ./sample2 main.cc out.txt && cat out.txt main.cc Makefile g++ -c -Wall -g main.cc g++ -o sample main.o права доступа «sample2» изменены на 0764 (rwxrw-r--) #include <iostream> #include <fstream> int main(int argc, char* argv[]) { if(argc != 3) { std::cerr << "Usage: " << *argv << " INPUT_FILE OUTPUT_FILE" << std::endl; return 1; } std::ifstream ifs(argv[1]); std::ofstream ofs(argv[2]); if(!ifs || !ofs) { std::cerr << "Can't open file(s)" << std::endl; return 1; } ofs << ifs.rdbuf(); ifs.close(); ofs.close(); return 0; } [nameless@desktop cpp]$ То же самое у меня: Код
[nameless@desktop cpp]$ ls && make && ./sample main.cc out.txt && ./sample Makefile out.txt && cat out.txt main.cc Makefile g++ -c -Wall -g main.cc g++ -o sample main.o #include <iostream> #include <fstream> int main(int argc, char* argv[]) { if(argc != 3) { std::cerr << "Usage: " << *argv << " INPUT_FILE OUTPUT_FILE" << std::endl; return 1; } std::ifstream ifs(argv[1]); std::ofstream ofs(argv[2], std::ios_base::app); if(!ifs || !ofs) { std::cerr << "Can't open file(s)" << std::endl; return 1; } ofs << ifs.rdbuf(); ifs.close(); ofs.close(); return 0; } TARGET=sample SOURCES=$(wildcard *.cc) BINARIES=$(SOURCES:.cc=.o) CXX=g++ CXXFLAGS=-Wall -g # -std=c++0x LDFLAGS= RM=rm -fv all: $(TARGET) $(TARGET): $(BINARIES) $(CXX) -o $@ $(LDFLAGS) $^ $(BINARIES): $(SOURCES) $(CXX) -c $(CXXFLAGS) $^ clean: $(RM) $(BINARIES) $(TARGET) *~ .PHONY: all clean [nameless@desktop cpp]$ Аргумент насчет краткости вообще не в тему. Сделаем простой тест на рандомном файле размера ~50 MB: Код
[nameless@desktop cpp]$ dd if=/dev/urandom ibs=1024k count=50 of=random.txt && ll -h 50+0 записей считано 102400+0 записей написано скопировано 52428800 байт (52 MB), 8,24631 c, 6,4 MB/c итого 51M -rw-rw-r--. 1 nameless nameless 432 Май 24 22:27 main.cc -rw-rw-r--. 1 nameless nameless 304 Май 13 00:26 Makefile -rw-rw-r--. 1 nameless nameless 50M Май 25 00:02 random.txt Код
[nameless@desktop cpp]$ cat main.cc && make && time ./sample random.txt random_copy1.txt #include <iostream> #include <fstream> #include <cstdlib> using namespace std; // функция копирования потока in в поток out; потоки должны быть открыты void filecopy(ifstream &in, ofstream &out) { char ch; while(in.get(ch)) // читать все символы, в том числе пробельные out.put(ch); } int main(int argc, char* argv[]) { if(argc != 3) return EXIT_FAILURE; ifstream instrm (argv[1]); ofstream outstrm(argv[2]); if (instrm) filecopy(instrm, outstrm); // копирование файлов else return EXIT_FAILURE; return EXIT_SUCCESS; } g++ -c -Wall -g main.cc g++ -o sample main.o real 0m1.866s user 0m1.781s sys 0m0.073s Код
[nameless@desktop cpp]$ mv main.cc.bak main.cc && make clean rm -fv main.o sample *~ удалён «main.o» удалён «sample» [nameless@desktop cpp]$ cat main.cc && make && time ./sample random.txt random_copy2.txt #include <iostream> #include <fstream> int main(int argc, char* argv[]) { if(argc != 3) { std::cerr << "Usage: " << *argv << " INPUT_FILE OUTPUT_FILE" << std::endl; return 1; } std::ifstream ifs(argv[1]); std::ofstream ofs(argv[2]); if(!ifs || !ofs) { std::cerr << "Can't open file(s)" << std::endl; return 1; } ofs << ifs.rdbuf(); ifs.close(); ofs.close(); return 0; } g++ -c -Wall -g main.cc g++ -o sample main.o real 0m0.072s user 0m0.003s sys 0m0.068s Для проверки, оба результирующих файла идентичны исходному: Код
[nameless@desktop cpp]$ diff random.txt random_copy1.txt -s Файлы random.txt и random_copy1.txt идентичны [nameless@desktop cpp]$ diff random.txt random_copy2.txt -s Файлы random.txt и random_copy2.txt идентичны [nameless@desktop cpp]$
0
|
Higher
|
|
24.05.2011, 17:39 | 8 |
Вообще по простоте и краткости выигрывает мой вариант=)
А посимвольно/построчно существенной роли не играет, интеловский компилятор с ключами на максимальную оптимизацию к примеру скорость выполнения обоих программ примерно уравняет. Да и по памяти ваша программа проигрывает=)
0
|
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
|
|
24.05.2011, 17:45 [ТС] | 9 |
Спасибо всем огромное,я получил более чем изчерпавующие ответы на свой вопрос.
Всем спасибо!!!
0
|
Nameless One
|
24.05.2011, 17:47
#10
|
Не по теме: diagon, а можно узнать, с какими ключиками надо тогда собирать? Оптимизациями никогда не занимался, просто интересно
0
|
diagon
|
24.05.2011, 17:52
#11
|
Не по теме: -fast, либо более безопасная -o3
0
|
Nameless One
|
24.05.2011, 17:59
#12
|
Не по теме: На g++ ни -O3, ни -Ofast ничего не изменили...
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
24.05.2011, 18:06 | 14 |
0
|
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
|
||||||
24.05.2011, 18:12 [ТС] | 15 | |||||
господа а почему в этом коде
0
|
Higher
|
||||||
24.05.2011, 18:18 | 16 | |||||
Странно о_О
Видимо лишняя итерация происходит Хотя у меня работает...
0
|
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
|
|
24.05.2011, 18:21 [ТС] | 17 |
именно в вашем коде всё норм,но я в файле output перенаправил поток на до запись,а не перезапись,и происходит вот так как я писал
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
24.05.2011, 21:42 | 18 |
Я не стал приводить вариант с буфером той по причине, что спрашивал НОВИЧОК...
Ваша простота - для эксперта. Моя - для новичка... Это как Страуструп написал две книжки: одну (сначала) для экспертов, в вторую (недавно) - для новичков... А разница в цифрах объясняется разницей в количестве вызовов методов, очевидно... Добавлено через 1 минуту Потому как это - Windows-специфик. А речь идет о С++ для начинающих
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
24.05.2011, 22:03 | 19 | |||||
Никто не запрещал начинающим не бояться всего и вся
0
|
24.05.2011, 22:03 | |
24.05.2011, 22:03 | |
Помогаю со студенческими работами здесь
19
Копирование файлов Копирование файла C++ копирование файла Копирование векторов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |