Передача имени файла через аргумент командной строки против использования строкового литерала в коде - PullRequest
2 голосов
/ 01 марта 2011

Следующий фрагмент кода, кажется, интерпретирует косую черту в переданном имени файла по-разному, в зависимости от того, был ли он передан в качестве аргумента командной строки или жестко закодирован с помощью литерала.Если в качестве аргумента командной строки передается имя файла изображения C:\kimba.jpg, оно работает нормально:

int main( int argc, char** argv ) 
{
    IplImage* img = cvLoadImage(argv[1]);
    //IplImage* img = cvLoadImage("C:\kimba.jpg", 1);

    // ...

    return 0;
}

Если, с другой стороны, я раскомментирую вторую строку и прокомментирую первую, то же имя файла вызываетисключение в этой строке.Я не знаю, как реализовано cvLoadImage(), но кажется (согласно отладчику), что в обоих случаях один и тот же контент передается в функцию.Так почему же жестко заданное имя файла вызывает исключение, а не аргумент командной строки?

Ответы [ 4 ]

6 голосов
/ 01 марта 2011

Вы должны избежать обратной косой черты с обратной косой чертой:

IplImage* img = cvLoadImage("C:\\kimba.jpg", 1);
3 голосов
/ 01 марта 2011

символ '\' является escape-символом в C ++. Чтобы получить символьный литерал '\', вам нужно экранировать его (обратите внимание на двойной символ '\'):

IplImage* img = cvLoadImage("C:\\kimba.jpg", 1);

НТН.

1 голос
/ 01 марта 2011

Обратная косая черта в строковых литералах является escape-символом, а в аргументе командной строки она интерпретируется как есть.Таким образом, во втором случае файл не найден, и вы получите исключение.

1 голос
/ 01 марта 2011

Использование "C:\\kimba.jpg" - \ используется для экранирования специальных символов, таких как \n

...