Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 94

Автор Π”. БтСфСнс

 } while (in.gcount() > 0);        // Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°.

 // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…...

 in.close();

 out.close();

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

МоТно ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° β€” это простая опСрация чтСния ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ записи Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Однако Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² C++ достаточно большая, ΠΈ сущСствуСт нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов чтСния ΠΈ записи ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², поэтому Π½Π°Π΄ΠΎ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ знаниями ΠΎΠ± этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок, ΡΠ½ΠΈΠΆΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.9 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстро, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ буфСризация Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ read ΠΈ write ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ сразу всСм содСрТимым Π±ΡƒΡ„Π΅Ρ€Π° вмСсто посимвольного копирования, ΠΊΠΎΠ³Π΄Π° Π² Ρ†ΠΈΠΊΠ»Π΅ считываСтся символ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° Π² Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π·Π°Ρ‚Π΅ΠΌ записываСтся Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°. ΠŸΡ€ΠΈ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π΅ дСлаСтся Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ форматирования, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ сдвига Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ, Ρ‡Ρ‚ΠΎ ускоряСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½Π΅ Π½Π°Π΄ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ символы EOF. Π’ зависимости ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ оборудования, ОБ ΠΈ Ρ‚.Π΄. Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… Π±ΡƒΡ„Π΅Ρ€Π°. Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для вашСй систСмы

Однако ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ большСго. ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ C++ ΡƒΠΆΠ΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈ записи, поэтому Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.9 фактичСски выполняСтся двойная буфСризация. ΠŸΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит символы, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ ΠΈΠ· исходного Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ read, operator<<, getc ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², Π° ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π²Ρ‹Π²ΠΎΠ΄, записанный Π² ΠΏΠΎΡ‚ΠΎΠΊ, Π½ΠΎ Π½Π΅ Π² Β«ΠΏΡƒΠ½ΠΊΡ‚ назначСния» (Π² случаС примСнСния ofstream это Ρ„Π°ΠΉΠ», Π½ΠΎ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ строка, сСтСвоС соСдинСниС ΠΈ ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ нСпосрСдствСнный ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΡ„Π΅Ρ€ΠΎΠ². Π’Ρ‹ это ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° operator<<, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ½Π°Ρ‡Π΅ с Π±ΡƒΡ„Π΅Ρ€Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². НапримСр, вмСсто Ρ†ΠΈΠΊΠ»Π° do/while ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.9, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€.

out << in.rdbuf();

НС слСдуСт Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π² Ρ‚Π΅Π»Π΅ Ρ†ΠΈΠΊΠ»Π°, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ вСсь Ρ†ΠΈΠΊΠ» ΠΎΠ΄Π½ΠΎΠΉ строкой. Π­Ρ‚ΠΎ выглядит Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ operator<< Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Β«Π²ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π΅Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π»Π΅Π²ΠΎΠΉ части», ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΌΠ½Π΅, эта запись ΠΈΠΌΠ΅Π΅Ρ‚ смысл, rdbuf Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°, Π° рСализация operator<<, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° справа, считываСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π±ΡƒΡ„Π΅Ρ€Π° Π²Π²ΠΎΠ΄Π° ΠΈ записываСт Π΅Π³ΠΎ Π² Π±ΡƒΡ„Π΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°. Когда Π±ΡƒΡ„Π΅Ρ€ Π²Π²ΠΎΠ΄Π° заканчиваСтся, ΠΎΠ½ Β«Π·Π½Π°Π΅Ρ‚Β», Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сСбя Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ источника, a operator<< Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.9 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ ваша ОБ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой, которая осущСствляСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎ ОБ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ? Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π½Π° это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ прямой Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса ОБ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ являСтся пСрСносимым Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Boost Filesystem скрываСт ΠΎΡ‚ вас мноТСство зависящих ΠΎΡ‚ ОБ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… интСрфСйсов, прСдоставляя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ copy_file, которая выполняСт систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ОБ для Ρ‚ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° компилируСтся. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.10 содСрТит ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ мСста Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.10. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Boost

#include <iostream>

#include <string>

#include <boost/filesystem/operations.hpp>

#include <boost/filesystem/fstream.hpp>


using namespace std;

using namespace boost::filesystem;


int main(int argc, char** argv) {

 // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²...

 try {

  // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Β«Ρ€ΠΎΠ΄Π½ΠΎΠ΅Β»

  // Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

  path src = complete(path(argv[1], native));

  path dst = complete(path(argv[2], native));

  copy_file(src, dst);

 } catch (exception& e) {

  cerr << e.what() << endl;

 }

 return(EXIT_SUCCESS);

}

Π’ этой нСбольшой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ всС ΠΆΠ΅ имССтся нСсколько ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… вопросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Boost Filesystem. Π’ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost Filesystem являСтся класс path, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ нСзависимым ΠΎΡ‚ ОБ способом ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ path, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊ пСрСносимый Ρ‚ΠΈΠΏ строки, Ρ‚Π°ΠΊ ΠΈ спСцифичный для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ОБ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.10 я создаю ΠΏΡƒΡ‚ΡŒ path ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (этот ΠΏΡƒΡ‚ΡŒ я Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ complete, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ вскорС рассмотрим).

path src = complete(path(argv[1], native));

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” это тСкстовая строка, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΡƒΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«tmp\\foo.txtΒ», Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° string ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Boolean, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, удовлСтворяСт ΠΈΠ»ΠΈ Π½Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. Ѐункция native Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ провСряСтся Ρ€ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ОБ. Π― Π΅Π³ΠΎ использовал Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.10, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ бСрутся ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π³Π΄Π΅ ΠΎΠ½ΠΈ, вСроятно, вводятся Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ОБ ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ². БущСствуСт нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ названия ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пояснСний: portable_posix_name, windows_name, portable_name, portable_directory_name, portable_file_name ΠΈ no_check. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Ѐункция complete Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ. Π’Π°ΠΊ, я ΠΌΠΎΠ³Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ исходному Ρ„Π°ΠΉΠ»Ρƒ.

path src = complete(path("tmp\\foo.txt", native));

Π’ Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, функция complete Π²Ρ‹Π΄Π°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅, выполняСмом ΠΏΡ€ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Β«c:\myprogramsΒ», послСдний Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π·Π°Π΄Π°Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ.

path src = complete(path("c:\\windows\\garbage.txt", native));

МногиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost Filesystem Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ссли Π½Π΅ удовлСтворяСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдусловиС. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся сама функция copy_file. Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, поэтому Ссли исходного Ρ„Π°ΠΉΠ»Π° Π½Π΅Ρ‚, опСрация Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ copy_file выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ я это сдСлал Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.10, ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ.

10.8. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ пСрСносимой, Ρ‚Π΅. Π±Π΅Π· использования спСцифичного для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ОБ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса.

РСшСниС

Π­Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°ΡŽΡ‚ стандартныС C-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ remove ΠΈ rename, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² <cstdio>. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.11 ΠΊΡ€Π°Ρ‚ΠΊΠΎ дСмонстрируСт, ΠΊΠ°ΠΊ это дСлаСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.11. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

#include <iostream>

include <cstdio>

#include <cerrno>


using namespace std;


int main(int argc, char** argv) {

 if (argc != 2) {

  cerr << "You must supply a file name to remove." << endl;

  return(EXIT_FAILURE);

 }

 if (remove(argv[1]) == -1) { // remove() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ошибкС -1

  cerr << "Error: " << strerror(errno) << endl;

  return(EXIT_FAILURE);

 } else {

  cout << "File '" << argv[1] << "' removed." << endl;

 }

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π­Ρ‚ΠΈ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: просто Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΉ имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ. Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ получится, Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ errno Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ошибки. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ strerror ΠΈΠ»ΠΈ perror (ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² <cstdio>) для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ сообщСния ΠΎΠ± ошибкС, зависящСго ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Для пСрСимСнования Ρ„Π°ΠΉΠ»Π° слСдуСт ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.11 Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ remove ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

if (rename(argv[1], argv[2])) {

 cerr << "Error: " << strerror(errno) << endl;

 return(EXIT_FAILURE);

}

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Boost Filesystem Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт срСдства для удалСния ΠΈ пСрСимСнования Ρ„Π°ΠΉΠ»Π°. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 10.12 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° короткая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° (ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ см. обсуТдСниС, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ послС ΡΡ‚ΠΎΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 10.12. УдалСния Ρ„Π°ΠΉΠ»Π° срСдствами Boost

#include <iostream>

#include <string>

#include <boost/filesystem/operations.hpp>