CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Typ wchar_t i nieudane czytanie z pliku

Typ wchar_t i nieudane czytanie z pliku

dział ogólny

Typ wchar_t i nieudane czytanie z pliku

Nowy postprzez lukagrom » niedziela, 4 listopada 2018, 18:39

Witam.
Postanowiłem stworzyć funkcję otwierającą zapodany plik i jeżeli nie jest pusty, zwracającą (egzotyczny dla mnie) typ wchar_t*.
Na podstawie prób i błędów z dodaniem biblioteki
KOD cpp:     UKRYJ  
#include <wchar.h>
wyszło mi coś takiego:
KOD cpp:     UKRYJ  
wchar_t* __fastcall TForm1::read_File(wchar_t *file_Name)
{
        int i;
        wchar_t *text_File;
        FILE *my_Project;
        text_File=static_cast<wchar_t*>(malloc(1024));
        size_t temp=0;
        my_Project=_wfopen(file_Name,L"r+");
        if(my_Project==NULL)
         return NULL;
        while((i=fgetc(my_Project))!=EOF)
        {
                text_File[temp]=wchar_t(i);
                ++temp;
        }
        text_File[temp]='\0';
        return text_File;
}
 

Próbuję z tego korzystać, jednakże na chwilę obecną, mimo braków errorów, a nawet warningóww programie, nie otworzyłem za "jej pomocą", ani jednego pliku. Przykłady otwierania:
KOD cpp:     UKRYJ  
Memo1->Text=UnicodeString(read_File(L"c:\WINDOWS\PFRO.log"));
 ListBox1->Items->Add(UnicodeString(read_File(L"m_test_hwnd.cpp")));
 ListBox2->Items->Add(read_File(L"przykladowy.txt"));
 
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Typ wchar_t i nieudane czytanie z pliku

Nowy postprzez polymorphism » poniedziałek, 5 listopada 2018, 12:35

Ojoj, ładnie pojechałeś! A co będzie, jeśli plik będzie miał więcej 512 znaków? Używasz tej funkcji w taki sposób, że masz wycieki pamięci - pamięć, którą ta funkcja zwraca, musi być zwolniona.

Piszesz w C++, pisz C++'owy kod:
KOD cpp:     UKRYJ  
std::wstring __fastcall TForm1::read_File(const char *fname)
{
        std::wstring s;

        std::wifstream ifs(fname);
        ifs.imbue(std::locale(".ACP"));
        std::copy(std::istreambuf_iterator<wchar_t>(ifs),
                        std::istreambuf_iterator<wchar_t>(),
                        std::back_inserter(s));

        return s;
}

/* ... */

Memo1->Text = read_File("c:\\WINDOWS\\PFRO.log").c_str();
ListBox1->Items->Add(read_File("m_test_hwnd.cpp").c_str());
ListBox2->Items->Add(read_File("przykladowy.txt").c_str());

Ten kod będzie czytał plik tekstowy w kodowaniu ANSI (systemowym) i konwertował jego zawartość do unikodu.

PS. backslashe w literałach musisz dawać podwójnie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2170
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 201
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Typ wchar_t i nieudane czytanie z pliku

Nowy postprzez lukagrom » poniedziałek, 5 listopada 2018, 13:12

Mój g++ dla linjki:
KOD cpp:     UKRYJ  
std::copy(std::istream_iterator<wchar_t>(ifs),
 

C:\Users\luk\Documents\C_plus\test_Open\main.cpp|41|error: no matching function for call to 'std::istream_iterator<wchar_t>::istream_iterator(std::wifstream&)'|

Zakładam, że mam stare środowisko.

Z kolei C++ Builder, w ogóle "nie czyta" typu wstring, mimo że mu dowaliłem chyba z kilkanaście bibliotek z tej strony o reference C++.

[bcc32 Error] m_test_stdstring.h(15): E2303 Type name expected

Jak wspomniałem wcześniej mam stare kompilatory, stąd "zastępuje nowe C++" poczciwym C, czego się nie powinno robić, ale to tylko hobby, a nie praca zawodowa.
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Typ wchar_t i nieudane czytanie z pliku

Nowy postprzez polymorphism » poniedziałek, 5 listopada 2018, 20:49

A załączyłeś <algorithm>, <iterator>, <string> i <fstream>?

Jak wspomniałem wcześniej mam stare kompilatory,

W profilu masz C++ Builder 10.1 Starter, a to, według wiki, środowisko z 2016 roku, więc tak stare nie jest. Zresztą kod powinien skompilować się na starym kompilatorze, sprzed standardu C++11.

PS. ja tam zmieniłem kod, zamiast std::istream_iterator dałem std::istreambuf_iterator.

---- dodane ---

W sumie to całe wyrażenie z std::copy możesz zamienić na:
KOD cpp:     UKRYJ  
for(wchar_t c; ifs.get(c);) s.push_back(c);
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
lukagrom
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2170
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 201
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: Typ wchar_t i nieudane czytanie z pliku

Nowy postprzez lukagrom » poniedziałek, 5 listopada 2018, 22:19

Dzięki, poszło na obu kompilatorach.
W obydwóch był błąd trywialny. Zabrakło -
KOD cpp:     UKRYJ  
#include <fstream.h>

I co ciekawe kompilator C++ Builder bez powyższej biblioteki nie rozpoznawał w ogóle typu wstring (a teoretycznie powinien), z kolei gcc/g++ "widział" wstring, jednakże "krzaczył się" na
KOD cpp:     UKRYJ  
std::wifstream ifs(fn);
.
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 0 gości

cron