• 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
92 wizyt
pytanie zadane 22 stycznia w C i C++ przez dawid2002 Bywalec (2,160 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 (106,380 p.)

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

komentarz 23 stycznia przez dawid2002 Bywalec (2,160 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 Bywalec (2,160 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ź 35 wizyt
0 głosów
4 odpowiedzi 269 wizyt
0 głosów
2 odpowiedzi 106 wizyt
pytanie zadane 25 stycznia w C i C++ przez dawid2002 Bywalec (2,160 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

66,520 zapytań

113,288 odpowiedzi

239,921 komentarzy

46,652 pasjonatów

Przeglądających: 203
Pasjonatów: 10 Gości: 193

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.

...