Копирование system () не выполняется, а копирование cmd работает - PullRequest
1 голос
/ 26 октября 2008

В cmd.exe я могу выполнить команду «copy c: \ hello.txt c: \ hello2.txt», и она работала нормально. Но в моей C-программе я запустил этот кусок кода и получил следующую ошибку:

#include <iostream>

using namespace std;

int main()
{
    system("copy c:\hello.txt c:\hello2.txt");
    system("pause");

    return 0;
}

Выход: Система не может найти указанный файл.

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

17 голосов
/ 26 октября 2008

Внутри строк C (и многих других языков, использующих те же правила экранирования), \ должно быть \\, поскольку это символ экранирования. Позволяет вводить обычным текстом непечатаемые символы, такие как:

  • символ табуляции \t.
  • символ возврата каретки \r.
  • символ новой строки \n.
  • другие, которые я не буду подробно освещать.

Поскольку \ используется в качестве escape-символа, нам нужен способ поместить фактический '\' в строку. Это делается с помощью последовательности \\.

Поэтому ваша строка должна быть:

system("copy c:\\hello.txt c:\\hello2.txt");

Иногда это может привести к неясным ошибкам с такими командами, как:

FILE *fh = fopen ("c:\text.dat", "w");

, где \t - это на самом деле символ tab, а файл, который вы пытаетесь открыть:

c : TAB e x t . * ** 1 049 тысяча сорок-восемь * д * тысячи пятьдесят-одны * а * ** 1053 тысяча пятьдесят два * T . * +1055 *

4 голосов
/ 27 ноября 2009

Кроме того, все функции Windows поддерживают косую черту в стиле Unix

system("copy c:/hello.txt c:/hello2.txt");

Некоторые люди предпочитают это, так как легче обнаружить нечетное '\'.
Но это может смутить пользователей Windows, если вы укажете этот путь в сообщении.

...