Форум программистов, компьютерный форум CyberForum.ru

копирование - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ удаление средней буквы http://www.cyberforum.ru/cpp-beginners/thread303436.html
помогите пожалуйста составить программу, ПЛЗ:cry: Условие:Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 строчных русских букв; между соседними словами- запятая, за последним словом- точка. Напечатать все слова последовательности, которые отличены от последнего слова, предварительно преобразовав каждое из них по следующему правилу: если слово нечетной...
C++ Шаблон класса. Помогите описать бинарный минус Помогите описать бинарный минус Код: #include <iostream> #include <math.h> using namespace std; template <class ku> class kvur { http://www.cyberforum.ru/cpp-beginners/thread303426.html
Удалить белые вершины в дереве C++
Помогите, пожалуйста. У меня такая задача: Дерево белых и черных вершин. Надо удалить белые вершины, находящиеся на последнем и предпоследнем уровнях. Спасибо.
очередь C++
подскажите как реализовать на чистом Си С введенных целых чисел сформировать два списка типа очередь с одинаковым количеством элементов. Разработать функцию, которая объединяет две очереди в одну из попарно взятыми элементами начальных очередей (начиная с первого элемента первой очереди). Функция передает в основную программу адреса начала и конца полученной очереди.
C++ сумма произведений двух рядов разной http://www.cyberforum.ru/cpp-beginners/thread303369.html
Подскажите, пожалуйста, где ошибка.. Никак не могу понять, что не так.. В массивах x1 и x2 содержатся ряды разных размеров, размерность x1 = 2*n, размерность x2 = 6*n. Конечный массив содержит (4*n+1) элемент, каждый из которых вычисляется следующим способом: массив x1 умножается на соответствующие элементы массива x2 (т.е. x1(0)*x2(0)+...+x1(n)*x2(n) ) - это первое значение искомого массива,...
C++ Перезагрузка operator - Есть одна задача : Одномерный массив а и b. Класс одномерный массив. Реализовать для объектов данного класса перезагрузку операции - (c=a-b) #include <iostream.h> #include <assert.h> #include <conio.h> class Vector { friend ostream& operator << (ostream &, const Vector &); подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5760 / 3409 / 255
Регистрация: 08.02.2010
Сообщений: 7,406
24.05.2011, 17:33     копирование
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Показанные мной варианты копируют как текстовые, ТАК И БИНАРНЫЕ ФАЙЛЫ.
Мой тоже. Ну и что?
Пример
Код
[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]$


Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Более того, при открытии файла в режиме дозаписи эта же функция допишет в конец существующего файла.
То же самое у меня:
Код
[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]$
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Еще одно достоинство моих вариантов - ПРОСТОТА и краткость!
Насчет простоты не соглашусь. У меня вон вообще полезная работа выполняется в строке 21 - запись буфера (т.е. содержимого) входного файла в выходной. Одной командой. Все очень просто и понятно.
Аргумент насчет краткости вообще не в тему.

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Насчет неэффективности. Не забывайте, что ввод-вывод буферизован. Фактически на устройство запись осуществляет ОС, причем всего буфера сразу. А в прикладной проге осуществляется обмен с буфером. Так что в данном случае достоинства перевешивают недостатки, из которых указан только один - якобы неэффективность.
Сделаем простой тест на рандомном файле размера ~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]$
Можно еще раз: какие есть достоинства у твоей программы (которых нет у моей), которые превышают "якобы неэффективность"?
 
Текущее время: 07:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru