• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

odczytywanie nazw plików i folderów w inny sposób przez ten sam program/kod

0 głosów
81 wizyt
pytanie zadane 22 stycznia w C i C++ przez dawid2002 Obywatel (1,630 p.)

Witam! Mam dość dziwny problem związany z fragmentem kodu w moim programie ,który stworzyłem w visual studio 2017.Miał on za zadanie odczytać nazwy plików i folderów w określonej ścieżce za pomocą funkcji zawartych w bibliotece dirent.h . Nazwy miały być różne np: 123 , żółć , itd. Program odczytywał je dobrze z wyjątkiem tych gdzie były polskie znaki , zamiast nazw były znaki "?". Szukałem długo rozwiązania w tym kawałku kodu ale nie znalazłem. Po pewnym czasie przeniosłem kod do środowiska Code::Blocks gdzie właśnie ten sam kod działał bez problemu.

Nie wiem dlaczego tak to działa. Jeśli ktoś się zna w tym temacie to proszę niech mi powie co mam zrobić żeby ten kod działał w visual studio?

kod:

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <dirent.h>
#include <string>

using namespace std;

DIR* katalog;

struct dirent* pozycja;

string plik;

string PL(const char * text);    // funkcja zamieniająca krzaki na polskie znaki

void detect_folder()
{
	katalog = opendir("ABC"); // katalog w którym będą odczytywane pliki i foldery
	pozycja = 0;

	while (pozycja = readdir(katalog))
	{
		plik = (*pozycja).d_name;

		cout << PL(plik.c_str()) << endl; // wyświetla nazwy plików i folderów
	}

}

int main()
{	
	detect_folder();

	return 0;
}

string PL(const char * text)
{
	string result;
	for (; *text; ++text)
		switch (*text)
		{
		case 'ą': result += static_cast <char>(0xa5); break;
		case 'ć': result += static_cast <char>(0x86); break;
		case 'ę': result += static_cast <char>(0xa9); break;
		case 'ł': result += static_cast <char>(0x88); break;
		case 'ń': result += static_cast <char>(0xe4); break;
		case 'ó': result += static_cast <char>(0xa2); break;
		case 'ś': result += static_cast <char>(0x98); break;
		case 'ż': result += static_cast <char>(0xbe); break;
		case 'ź': result += static_cast <char>(0xab); break;

		case 'Ą': result += static_cast <char>(0xa4); break; //(0xa4) // dla duzej litery
		case 'Ć': result += static_cast <char>(0x8f); break; //(0x8f)
		case 'Ę': result += static_cast <char>(0xa8); break; //(0xa8)
		case 'Ł': result += static_cast <char>(0x9d); break; //(0x9d)
		case 'Ń': result += static_cast <char>(0xe3); break; //(0xe3)
		case 'Ó': result += static_cast <char>(0xe0); break; //(0xe0)
		case 'Ś': result += static_cast <char>(0x97); break; //(0x97)
		case 'Ż': result += static_cast <char>(0xbd); break; //(0xbd)
		case 'Ź': result += static_cast <char>(0x8d); break; //(0x8d)
		default: result += *text; break;
		}

	return result;
}

 

rezultat działania programu napisanego w visual studio:

rezultat działania programu w Code::Blocks:

Z góry dziękuje za pomoc!!!

komentarz 23 stycznia przez j23 VIP (100,260 p.)

Sprawdzałeś (w debuggerze), co zawiera pole d_name dla nazw z literami diakrytycznymi?

komentarz 23 stycznia przez dawid2002 Obywatel (1,630 p.)
Nie. Jak mogłbym to sprawdzić?

1 odpowiedź

0 głosów
odpowiedź 10 marca przez sneik555 Nowicjusz (140 p.)
Sprawdź co masz ustawione w 'encoding' w Visual Studio. Podejrzewam, że w Code::Blocks jest z automatu ustawione na UTF-8 co pozwala na nie gubienie znaków specjalnych.
komentarz 16 marca przez dawid2002 Obywatel (1,630 p.)
w Visual studio  mam kodowanie: Unicode - strona stronicowania 1200.

A w code::blocks mam windows 1250.

To znaczy że mam ustawić w Visual Studio kodowanie na windows 1250 ?

Podobne pytania

0 głosów
1 odpowiedź 31 wizyt
pytanie zadane 26 marca w C i C++ przez xFanti Początkujący (420 p.)
0 głosów
4 odpowiedzi 253 wizyt
0 głosów
2 odpowiedzi 102 wizyt
pytanie zadane 25 stycznia w C i C++ przez dawid2002 Obywatel (1,630 p.)
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

63,145 zapytań

109,390 odpowiedzi

228,534 komentarzy

42,581 pasjonatów

Przeglądających: 167
Pasjonatów: 15 Gości: 152

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...