1 Soru: `std :: filesystem :: path :: operator / (/ * args * /)` beklendi─či gibi ├žal─▒┼čm─▒yor

taraf─▒ndan olu┼čturulan soru Wed, May 8, 2019 12:00 AM

Yap─▒c─▒da, ba┼člatt─▒─č─▒m alanlardan birinin std::filesystem::path oldu─ču, ancak beklenen de─čere g├Âre ba┼člat─▒lmad─▒─č─▒ g├Âr├╝l├╝yor.

MyClass::MyClass(
    unsigned int deviceSerial,
    const std::string& processName
) :
    deviceSerial(deviceSerial),
    processName(processName),
    configFilePath(GetBasePath() / std::to_string(deviceSerial) / ("#" + processName + ".json"))
{
    /* Parameter checks */
}

Hata ay─▒klay─▒c─▒s─▒n─▒ kullanarak 06003509911111100101035062'nin tam olarak bekledi─čim gibi d├Ând├╝─č├╝n├╝ g├Ârebiliyorum (06003509911110010101035062'nin do─čru yolu ile d├Ând├╝─č├╝n├╝) ancak GetBasePath() operat├Âr├╝n├╝n bir etkisi olmad─▒─č─▒ g├Âr├╝l├╝yor. Yap─▒c─▒ g├Âvdesinin i├žine girdikten sonra, 06003509911111100101035062'nin, ilave bilgi eklenmeden std::filesystem::path'nin sonucuna ayarland─▒─č─▒n─▒ g├Ârebiliyorum.

MSVS-2019 kullan─▒yorum, C ++ dil standard─▒n─▒ C ++ 17 olarak ayarl─▒yorum ve hata ay─▒klama modunda t├╝m optimizasyonlar─▒ devre d─▒┼č─▒ b─▒rakt─▒m.

Ayr─▒ca a┼ča─č─▒dakileri s─▒n─▒fta test ettim ve hala /ÔÇÖyi configFilePathÔÇÖnin bir sonucu olarak g├Âr├╝yorum ve ek ├Â─čeler eklenmiyor.

GetBasePath()

Hafif bir notta, yukar─▒daki testi path yerine GetBasePath() ile denedim ve hala ayn─▒ sonu├žlar─▒ g├Âr├╝yorum.

D├╝zenle

─░stendi─či gibi, a┼ča─č─▒da minimal bir eksiksiz ve do─črulanabilir ├Ârnek verilmi┼čtir.

{
    auto path = GetBasePath();             // path = "C:/Users/Me/Desktop/Devices"
    path /= std::to_string(deviceSerial);  // path = "C:/Users/Me/Desktop/Devices"
    path /= ("#" + processName + ".json"); // path = "C:/Users/Me/Desktop/Devices"
}
    
2
  1. 2019-05-08 16: 08: 40Z
  2. Bu daha ├žok bir tahmindir, ancak fs :: append () y├Ântemini deneyin.
    2019-05-08 16: 21: 48Z
  3. "Hata ay─▒klay─▒c─▒s─▒n─▒ kullanma" Bu sizin sorununuz olabilir. Yol verilerinin s─▒n─▒f i├žinde nas─▒l depoland─▒─č─▒ uygulamaya ├Âzeldir ve sizden baz─▒ ┼čeyleri gizliyor olabilir. Bunun s─▒n─▒f 'aray├╝z├╝ yoluyla tekrar ├╝retilebildi─činden emin olmal─▒s─▒n─▒z (yani birle┼čtirilmi┼č konsola giden yolu yazd─▒r─▒n)
    2019-05-08 20: 46: 41Z
  4. @ rustyx L├╝tfen tam bir ├Ârnek i├žin yukar─▒daki d├╝zenlemeye bak─▒n. @ Mansoor Sizin de ├Ânerdi─činiz gibi 06003509911111100101035062'yi de test ettim ve bu ayn─▒ sonucu veriyor @Frank D├╝zenlenmi┼č bir ├Ârnek yaparken t├╝m soyutlama katmanlar─▒n─▒ kald─▒rd─▒m ve ayn─▒ zamanda serbest b─▒rakma modundayken hata ay─▒klay─▒c─▒s─▒n─▒n d─▒┼č─▒nda test ettim. Hala fark yok.
    2019-05-09 08: 00: 54Z
  5. ├ťzg├╝n├╝m, MCVEÔÇÖdeki +=ÔÇÖleri ka├ž─▒rd─▒m, ancak ┼ču anda derlemeliyim ki, M.M bu hatay─▒ iyi anlad─▒ :)
    2019-05-09 08: 19: 35Z
1 Yanıtlar                              1                         

@rustyx ve @Frank'e ├Ânerileri i├žin te┼čekk├╝r etmek istiyorum, bu tavsiyeyi izleyerek yol yap─▒c─▒s─▒na iletilen ilk dizgeyi yaratma bi├žimimde bir hata ke┼čfetmeme neden oldu (Ayr─▒ca @MM Ben bu cevab─▒ yazarken tam hatay─▒ buldum)

Bir yoldaki ortam de─či┼čkenlerini geni┼čletmek ve bir dize d├Ând├╝rmek i├žin Windows API'yi kullanan bir i┼člev (s─▒n─▒f─▒mda kullan─▒lan) /='yi olu┼čturdum. Bu dize, 06003509911110010101035062 ve say─▒m─▒n bo┼č byte i├žerdi─či bir say─▒dan ├╝retilir, b├Âylece

#include <Windows.h>
#include <cstdio>
#include <filesystem>
#include <memory>
#include <string>

std::string ExpandPath(const std::string &str) {
  auto reqBufferLen = ExpandEnvironmentStrings(str.c_str(), nullptr, 0);

  if (reqBufferLen == 0) {
    throw std::system_error((int)GetLastError(), std::system_category(),
                            "ExpandEnvironmentStrings() failed.");
  }

  auto buffer = std::make_unique<char[]>(reqBufferLen);
  auto setBufferLen =
      ExpandEnvironmentStrings(str.c_str(), buffer.get(), reqBufferLen);

  if (setBufferLen != reqBufferLen - 1) {
    throw std::system_error((int)GetLastError(), std::system_category(),
                            "ExpandEnvironmentStrings() failed.");
  }

  return std::string{buffer.get(), setBufferLen};
}

int main() {
  unsigned int serial = 12345;
  std::string procName = "Bake";

  std::filesystem::path p(ExpandPath("%USERPROFILE%\\Desktop\\Devices"));
  std::printf("Path = %s\n", p.string().c_str());
  // p = C:\Users\Me\Desktop\Devices

  p /= std::to_string(serial);
  std::printf("Path = %s\n", p.string().c_str());
  // p = C:\Users\Me\Desktop\Devices

  p /= "#" + procName + ".json";
  std::printf("Path = %s\n", p.string().c_str());
  // p = C:\Users\Me\Desktop\Devices

  std::getchar();
}

I've also used this example and tested with `p.append()` and got the same result.
yap─▒c─▒ de─či┼čkenini kullanarak bir dize olu┼čtururken bu say─▒, dize i├žindeki null bayt─▒ i├žerir.

De─či┼čkenleri sorgulamak i├žin hata ay─▒klay─▒c─▒s─▒n─▒ kulland─▒─č─▒m i├žin C tarz─▒ dizgileri okuyor ve bo┼č baytta duruyor. Orijinal ├Ârne─čimde, sadece ├ž─▒kt─▒ i├žin bu i┼člevi tercih etti─čimden, 06003509911110000101035062'yi kullan─▒yorum, ancak yine de bo┼č byte'da yazd─▒rmay─▒ durduruyor. ├ç─▒kt─▒y─▒ 06003509911110000101035062'yi kullanacak ┼čekilde de─či┼čtirirsem ├ž─▒kt─▒n─▒n beklenen yola sahip oldu─čunu ancak fazladan bir bo┼člukla (bo┼čluk olarak bas─▒lan bo┼č bayt) oldu─čunu g├Ârebilirim. path::append() kullanarak yollar─▒m─▒n her bir ekleme ile a┼ča─č─▒daki ┼čekilde sonu├žland─▒─č─▒n─▒ g├Âr├╝yorum:

#include

├ľzet:

my 06003509911111100101035062ÔÇÖdeki hata

std::string ExpandPath(const std::string& path)

Olmal─▒

char*     
1
2019-05-09 08: 18: 02Z
std::string(char* cstr, size_t len)
kaynak yerle┼čtirildi ─░┼čte