Интересная проблема в преобразовании std :: string в str :: string.c_str () с путями к файлам - PullRequest
0 голосов
/ 21 мая 2011

Я столкнулся с интересной проблемой.У меня есть следующий код:

cout << "\nFILE";
cout << "\tLocation:" << file.location << endl;
cout << "\tLocation (c_str()): " << file.location.c_str() << endl;

где местоположение задается функцией, которая находит местоположение файла в файле в формате

DRIVE: \ dir1 \ dir2 ... \ filename.extension

Например, функция успешно установит file.location в

C: \ Documents and Settings \ admin \ testfile.foo

Однако происходит самое странное.Он выводит что-то похожее на это:

FILE

Расположение: C: \ Documents and Settings \ admin \ testfile.foo

Расположение (c_str ()): C: \ Documents

Обратите внимание на отсутствие оставшегося пути к файлу.Будучи проницательным программистом, я решил проверить абсолютные пути.Я физически установил строку file.location в

C: \\ Documents and Settings \\ admin \\ testfile.foo

, и соответствующий вывод был

ФАЙЛ

Расположение: C: \ Documents and Settings \ admin \ testfile.foo

Расположение (c_str ()): C: \ Documents and Settings \ admin \ testfile.foo

как и ожидалось.Затем я протестировал

C: \ Documents and Settings \ admin \ testfile.foo

, и на выходе было

FILE

Местоположение: C: документы и настройкиadmintestfile.foo

Местоположение (c_str ()): C: Документы и настройкиadmintestfile.foo

также ожидается.

Я не могу на всю жизнь понять, что может пойти не так.Путь к файлу четко указан в самой строке, почему он изменился бы только в этом случае?

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

Есть так много неправильных вещей в вашем коде ... Вот проблема номер 1:

temp2 = char(HexToInt(temp2));

temp2 на данный момент пуст, поэтому HexToIntвозвращает 0.

Вот еще проблема:

temp = Location[i+1] + Location[i+2]; 

это добавляет два char, в результате чего int.Это не объединяет их.Вместо этого используйте std::string::substr.

temp += j * pow(16.00, k);

не используйте с плавающей точкой, как это.

PS, и это просто показывает, что ваш код важнее, чем описание вашей проблемы.

2 голосов
/ 21 мая 2011

Я не совсем уверен, что понимаю, о чем именно вы спрашиваете здесь, но у меня есть предложение, которое поможет вам избежать головной боли при манипулировании путями: используйте Boost.Filesystem.Path .Это, вероятно, решит проблему, с которой вы здесь столкнулись.:)

Теперь, для вашего первого случая - если я правильно понимаю, file.location - это std :: string.Если вы записываете его непосредственно в поток, он дает вам полную строку, но если вы используете c_str(), строка обрезается посередине.Это, вероятно, означает, что у вас есть символ NULL в середине вашей строки после документа.Я не знаю, почему это так, но если бы вы могли опубликовать здесь код, который фактически устанавливает file.location, мы можем вам помочь.

...