Форум программистов, компьютерный форум 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++ Длинная целочисленная арифметика на c++ http://www.cyberforum.ru/cpp-beginners/thread303381.html
Я в курсе существования готовой длинной арифметики, но в этой, например, теме есть такие посты: Все это понятно, я и сам могу перечислить еще как минимум три подобных пакета. Однако, если требуется...
C++ сумма произведений двух рядов разной Подскажите, пожалуйста, где ошибка.. Никак не могу понять, что не так.. В массивах x1 и x2 содержатся ряды разных размеров, размерность x1 = 2*n, размерность x2 = 6*n. Конечный массив содержит... подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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]$
Можно еще раз: какие есть достоинства у твоей программы (которых нет у моей), которые превышают "якобы неэффективность"?
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru